Смотрите также: Сделайте ход на доске Го .
задача
Go - настольная игра, в которой два игрока (черный и белый) кладут камни на пересечения линий сетки на доске 19 × 19. Сначала ходят черные - например, на D4:
В этом вызове вы должны взять координату доски Go, например, в D4
качестве входных данных, и вывести ASCII-представление доски с первым ходом, сыгранным в данной точке.
Обратите внимание, что столбца I. нет, это исторически, чтобы уменьшить путаницу с J и L.
Этот вывод состоит из 19 строк, каждая из которых содержит 19 символов. Точка с камнем на нем отмечена O
. Пустые точки на плате показаны .
, за девять кроме звездных точек (на D4
, D10
, D16
, K4
, K10
, K16
, Q4
, Q10
, и Q16
), которые отмечены *
.
Например, данный F5
ответ должен быть следующим:
...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
.....O.............
...*.....*.....*...
...................
...................
...................
И учитывая, Q16
что на входе, ваш вывод должен быть:
...................
...................
...................
...*.....*.....O...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................
правила
Вы можете написать функцию, которая принимает координату в качестве аргумента, или программу, которая читает координату из командной строки или из
STDIN
.Вы можете принять ввод как в нижнем, так и в верхнем регистре, но ваш ответ не должен обрабатывать оба.
Ввод всегда представляет собой одну строку, например,
a1
илиT19
, никогда не строку + число или две строки.Если вы пишете полную программу, ваш ответ должен быть напечатан
STDOUT
в виде строки, за которой может следовать завершающий символ новой строки. Если ваш ответ является функцией, вы можете печататьSTDOUT
, или возвращать строку, или возвращает массив / список строк (строк), или возвращает двумерный массив или вложенный список символов.Это код-гольф . Самый короткий ответ в байтах побеждает.
f("G", 14)
, правильно?Ответы:
MATL , 33 байта
Попробуйте онлайн!
объяснение
источник
С
21219519318117113210398 байтСохранено 1 байт благодаря @FryAmTheEggman, 5 байт благодаря @orlp
Колл
f()
с позицией для игры (должен быть написан заглавными буквами), и она распечатывает полученную доску.Попробуйте это на Ideone .
источник
putchar(i%20?i^20*atoi(p+1)+64-*p+(*p>72)?i%6^4|i/20%6^3?46:42:79:10)
C (gcc),
132128109Ideone
Функция, которая печатает плату на STDOUT. Требует, чтобы координата буквы была заглавной. Печать в одном цикле кажется немного короче, чем предыдущий подход с вложенным циклом.
источник
MATLAB, 135 байт
Первая попытка, ничего умного, просто чтобы увидеть, насколько лучше могут сделать другие:
Использование:
источник
a=input('');
); удалить переводы строк; изменить'*'
на42
и'0'
к48
; заменитьend
на19
; вычтите логическое значение непосредственно вместоif
ветви. Фактически, вы можете заменить последние пять строк наb(20-a(2),a(1)-64-(a(1)>8))=48
Рубин,
9391 байтПринимает ввод в командной строке, например
$ ruby script.rb Q16
.Протестируйте его на repl.it (там есть лямбда, поскольку repl.it не принимает аргументы командной строки: https://repl.it/CkvT/1
Ungolfed
источник
$><<
вместоputs
. Не уверен, хотя.Идти,
319286 байтВероятно, игра в гольф бросить немного, я начинающий
источник
part
вp
?Ruby,
130128121 + 3 (-n
флаг) = 124 байтаПереключился
-p
на-n
потому чтоputs b
на один байт короче$_=b*$/
источник
Python,
148145136130121119116 байт-3 байта благодаря @RootTwo
анонимная лямбда-функция, принимает ввод в форме «A1» (большие буквы) и выводит список списков символов (len == 1 строк в Python)
источник
".*oo"[2*(j==ord(x[0])-(x[0]>"I")-65and int(x[1:])==i+1)+(i%6==j%6==3)]
вместо"o"if...else"*"if...else"."
(x>'I')
вместо того,(x[0]>'I')
чтобы сохранить еще 3 байта.> <> ,
9896 байтОбратите внимание, что
0x14
в первом ряду после первого есть'
и0x19
между9
первым и первым^
в последней строке. Попробуйте онлайн!Входные данные отображаются так, что
A-T
становятся1-19
(с 0 обозначает мнимый столбец «новой строки»), а целое число строк уменьшается на 1. Программа выполняет цикл с 379 до 0, выбирая символ из нижней строки по мере продвижения ( смещение на 15, чтобы учесть тот факт, что вы не можете ввести буквальный перевод строки в кодовое поле). Новые строки проверяются черезi % 20 == 0
, а звездочки проверяются((i%20-1)%6)*((i/20)%6) == 9
.источник
F #,
241 237 225 216 214211 байтХитрый этот ... Интересно, можно ли сделать его короче?
Редактировать: исправил ошибку, добавил номера в некоторых местах, удалил номера в других, как-то получилось с таким же количеством.
Можете попробовать перетасовать номера позже.Готово.Edit2: сохранил больше байтов, написав одно из условных выражений, интуитивно.
Edit3: исправлена еще одна ошибка: теперь должна работать для фигур на последнем ранге и удалось сохранить два байта, пока я на нем, как-то.
Попробуйте онлайн
источник
Retina ,
134129122 байта11 байтов спасибо Мартину Эндеру и за вдохновение еще 1.
Попробуйте онлайн!
источник
Perl, 132 байта
-3 байта благодаря @Dom Hastings
Принимает командную строку. Нуждается
-M5.010
tử перспективе. Например :Я думаю, что это может быть короче, но я не мог понять, как ... пожалуйста, дайте мне знать, если вы делаете!
источник
@v=([(".")x18])x18;
чтобы инициализировать список ... Возможно, есть даже лучший способ, но сейчас я не на терминале! Я думаю, что вы также можете заменить@{...}
расширение стрелками разыменования:$v[$_]->[@t]
опять же не проверено! Также я надеюсь, что вы не возражаете против того, чтобы я предлагал изменения кода ...@v=([(".")x19])x19
не работает (я пробовал это до btw), потому что он создает только один arrayref и копирует 19 раз ref, а не массив (так что в итоге у вас будет только 1 строка, дублированная 19 раз). Замена,@{..}
как вы предложили, тоже не работает. Я предполагаю, что это потому, что я работаю над срезом, а не только над одним элементом. Если у вас есть другие предложения, не стесняйтесь! :)eval
для -3 , хотя:@v=eval"[('*')x19],"x19;
. И вы на 100% правы с помощью arrayref ... Возможно ли использовать одномерный массив и рассчитать индекс? Поиграй с этим попозже!Пакетный,
322310308 байтПояснение: Начинается с запроса камня на стандартный ввод. Затем задает переменные для каждого возможного столбца, чтобы он мог оценить первый символ камня как переменную для получения
y
координаты. Вычитает 1 изx
координаты, потому что она 1-проиндексирована, и мы хотим 0-индексировать, а также вычисляем,z=y+1
как это потребуется позже. Затем циклыr
от 18 до 0 для каждого ряда. Принимает строку...*.....*.....*...
и извлекает символ вr
й позиции на потом. Вx
строкеy
th символ th заменяется наo
. Наконец,.*
s заменяются на.
плюс ранее извлеченный символ; это не работает в строках 4, 10 и 16, но это самый короткий способ достичь этого. (Я должен использовать.*
потому что замена*
в Batch явно запрещена.)источник
PowerShell v2 +,
157152 байта(Я думаю, что столкнулся с каким-то странным сбоем с оператором запятой, поэтому конструкция массива немного длиннее, чем должна быть)
Принимает ввод в виде строки в верхнем регистре, преобразует
$args[0]
ее в массив символов, сохраняет первую букву$x
и остальные буквы$y
. Это эффективно разбивает ввод на буквы / цифры.Затем мы строим наш многомерный массив
$a
. Мы предварительно заполнить массив размером19
с0
с использованием запятых-оператора. Затем мы делаем цикл,0..18
чтобы сделать каждый элемент$a[$_]
равным массиву периодов, снова используя оператор запятой. (NB. Теоретически это должно быть сжато$a=,(,'.'*19)*19
, но, похоже, это не сработает с заданием индексации ... В итоге я получил целые столбцы, установленные на*
)Затем мы дважды повторяем цикл,
3,9,15
чтобы установить соответствующие элементы в*
. Затем мы указываем на него в нужном месте, чтобы установить каменьO
. Для этого мы вычитаем65
из$x
(т. Е. ASCII «A» равно 65, и мы проиндексированы с нулями), и вычитаем дополнительный, используя приведение типа Boolean-to-int, если$x
оно больше чем73
(т. Е. ASCII «I» ).Теперь наш вывод обратный (т. Е. Левый верхний угол
A1
), поэтому нам нужно повернуть массив с помощью$a[18..0]
. Наконец, мы выводим каждую строку-join
вместе, чтобы сформировать строку.источник
> <> , 124 байта
Использует тот же подход, что и мой ответ C. На входе должна быть прописная буква, за которой следует десятичное число.
Попробуйте онлайн!
Объяснение:
источник
JavaScript, 138 байт
Возвращает массив строк. Объяснение:
источник
join
. Также он помещает o в неправильную строку и неправильный столбец для D5 (первый контрольный пример).R
169161 байтС отступами и переносами:
Использование:
источник
Луа, 187 байт
Я не чувствую себя слишком плохо о 187 для этого конкретного проекта. Луа по-прежнему очень неуклюже относится к гольфу, но я очень горжусь тем, как далеко я могу зайти с ним.
источник
PHP,
280 268 263 261 255 218216 байтМой первый гольф.
Использование:
Сохранить как файл PHP и вызвать его,
php filename.php coordinate
например,php go.php k13
источник