Используя наименьшее количество символов Юникода, напишите функцию, которая принимает три параметра:
- Общее количество домино
n
пострадавшее домино- Свергнуть направление пораженного домино (
0
илиL
слева,1
илиR
справа)
Как только домино свергнуто, оно должно также свергнуть оставшееся домино в том же направлении.
Вы должны вывести домино с |
изображением стоящего домино и \
и с /
изображением домино, свергнутых слева и справа соответственно.
Примеры
10, 5, 1
должен вернуться ||||//////
6, 3, 0
должен вернуться\\\|||
if(third_parameter)
вместоif(third_paramter=='l')
Ответы:
Рубин, 38 (46) символов
Эта функция принимает направление как целое число (
1
справа,0
слева). Функция, которая принимает строку, на 8 символов длиннее:Примеры использования:
источник
Хаскелл, 70
при условии что тип направление , который имеет конструкторы R и L .
источник
J -
3226 символовJ не может обрабатывать более двух аргументов без использования списка, и он не может обрабатывать неоднородные списки без упаковки. Таким образом, иметь входные данные в виде списка из трех целых чисел идеально. Порядок параметров обратен стандартному: 0 для левого или 1 для правого, затем положение, затем общее количество домино. Причина этого заключается в том, что J в конечном итоге будет проходить их справа налево.
Вот что происходит.
F`G/
применяется к спискуx,y,z
будет оцениватьx F (y G z)
.y G z
конструирует оба возможных способа, которые домино может опрокинуть, а затемF
использует,x
чтобы выбрать, какой из двух использовать.Ниже приведен обзор J REPL, который объясняет, как эта функция строится вместе: строки с отступом вводятся в REPL, а ответы располагаются заподлицо с левым полем. Напомним, что J оценивается строго справа налево, если нет паренов:
За счет нескольких символов мы можем сделать порядок стандартным: просто добавьте
@|.
в конец функции:Однако адаптация этого к работе со строковым аргументом для направления будет намного более дорогостоящей.
источник
/
также то, как вы строите два выхода и выбираете нужный. Думаю, мне не хватает признания, которого оно заслуживает.PowerShell, 66
Вероятно, та же идея, что и у всех остальных.
источник
Golfscript (44
53)Моя первая в мире программа Golfscript. Это заняло у меня больше времени, чем следовало бы, и, вероятно, это можно сделать более умным, более кратким способом (я уверен, что кто-то докажет это :)):
Пример ввода есть
10 5 0
.Ungolfed:
источник
d
быть0
/1
вместо'l'
/ ,'r'
который дает вам несколько более короткий код. В противном случае, если вы хранитеd'l'=
в переменной oyu может использовать его вместо второго сравнения сd
. В этом терминеx i j
вы можете сохранить оба пробела, если вместо имени используете не алфавитно-цифровое имя переменнойi
.'l'
/'r'
потому что в то время я еще не видел, что мы можем использовать целые числа. Не буквенно-цифровой трюк ловкий, спасибо! Возможно я обновлю ответ позже.GolfScript,
2823 символаАргументы сверху стека, попробуйте онлайн :
источник
Питон - 45
52Это требует
1
для правой и0
левой стороны.Вот версия, которая принимает
r
иl
правильно, на 58 :Некоторые примеры использования ...
источник
JS (ES6) -
7974726562спасибо @nderscore!
Третий параметр является логическим (0: слева / 1: справа)
источник
d=(a,b,c)=>"\\"[r="repeat"](!c&&a-b+1)+"|"[r](--b)+"/"[r](c&&a-b)
[r='repeat'][r]
15 символов.repeat.repeat
14 символовPython2 / 3 - 54
Последнее добавленное правило было довольно неплохо (0/1 вместо 'l' / 'r'). Сделано мое фактически меньше, чем существующее решение Python. 0 слева, 1 справа
источник
Haskell , 42 байта
Попробуйте онлайн!
Принимает входной сигнал как
(%) n k b
дляn
домино,k
-м домино свергнутого, направлениеb
.Находит символ в каждой позиции в
c
диапазоне от1
доn
, используя арифметическое выражение для вычисления индекса символа 0, 1 или 2.Тестовые случаи взяты отсюда .
Haskell , 44 байта
Попробуйте онлайн!
Интересная стратегия, которая получилась чуть дольше. Создает строку
"\\|/"<*[1..n]
сn
последовательными копиями каждого символа, затем берет фрагментn
смежных символов с начальным положением, определенным арифметически.источник
Python 2,7,
68 65 61 5958 символовИспользуйте
d=1
для левого иd=0
правогоПримечание: спасибо @TheRare за дальнейшую игру в гольф.
источник
d and'\\'...or'/'...
?('\\'...,'/'...)[d]
f=lambda a,p,d:('|'*(p-1)+'/'*(a-p+1),'\\'*p+'|'*(a-p))[d]
Also, I don't think your code works when falling left.
Не могли бы вы дать контрольный пример, чтобы доказать?Javascript, 46 знаков
Похоже на обман делать 0 = l и 1 = r, но есть. Сократил это с небольшой рекурсией.
редактировать: пропустил очевидный персонаж
источник
JavaScript (ES6) 61
63Править Это было глючно - позор мне.
Не сильно отличается от @xem, но нашел его сам и короче. Параметр d равен 0/1 для левого / правого
Тест в консоли Firefox
Выход
источник
--p
?Perl,
6765 персонажейНазначьте первые три параметра (сумма, позиция, направление в виде целого числа [0 слева, 1 справа]). Дополнения уходят в эфир. Вычтите 1 из позиции, если мы идем направо, так что домино в позиции X также перевернуто.
источник
$p--if$d
с$p-=$d
потерять два символа :)Haskell , 57 байт
4 байта сохранены благодаря этому
Попробуйте онлайн!
Хаскелл ,
69616058 байтПопробуйте онлайн!
Не очень сложный ответ, но он превосходит оба существующих ответа на Haskell.
источник
R ,
75686157 байтАнонимная функция. Я выложу более полное объяснение, если есть интерес.
Попробуйте онлайн!
источник
Haskell , 51 байт
a
= количество домино,b
= 1 индекс касания,c
= направление (0
слева и1
справа).Попробуйте онлайн!
источник
(a#b)c= ...
.PHP - 64
Простой цикл и повторяющий характер.
Создает
Notice: Undefined variable: i
, вот еще одна версия, скрывающая ошибку (65 символов):И версия без каких-либо ошибок (69 символов):
Другие функции в PHP:
sprintf
/printf
набивказаполнение через
str_pad
/str_repeat
функциииспользуя как
printf
иstr_repeat
функцииисточник
Скала 75 персонажей
источник
CJam - 20
Основной код находится во второй строке, первая строка предназначена только для получения параметров из стандартного ввода (в противном случае вам необходимо поместить параметры в код).
Попробуйте это на http://cjam.aditsu.net/
Примеры:
Объяснение:
:X
сохраняю последний параметр (0/1 направления) в переменной X-
вычитает X от цепного над положением, получение длиной первой последовательности символов (назовем его L)_
делает копию L"\|"X=
получает символ использовать первый:\
для X = 0 и|
для X = 1*
повторяет, что символ L разo
печатает строку, удаляя ее из стека,-
вычитает L из числа домино, получая длину второй последовательности символов (назовем это R),"|/"X=
переводит символ в используйте следующее:|
для X = 0 и/
для X = 1*
повторяет этот символ R разисточник
Обыкновенный Лисп
Это не победит в кодовом гольфе, но оно подчеркивает директиву формата оправдания Common Lisp:
Арифметика не плохая:
n
это общее количество домино;p
позиция первого свергнутого домино;d
либо0
либо1
, либо представляет левый и правый (как разрешено в комментариях) и используется в качестве индекса вx
;x
является строкой\
,|
и/
. Строка формата использует две (вложенные) директивы выравнивания, каждая из которых допускает добавочный символ. Таким образом:источник
PHP, 89 символов
Просто потому, что я люблю PHP.
РЕДАКТИРОВАТЬ: следующий код делает то же самое.
источник
($i+1>$p)
. 2) Переписать ваше троичное выражение, чтобы$d?($i+1<$p?'|':'/'):$i+1>$p?'|':'\\'
сохранить еще 3 байта. Или просто удалить==0
и инвертировать направления. 3) С помощью$i++<$a
вы можете удалить$i++
из пост условия и использовать$i
вместо$i+1
(-6 байт). 4)$i=0
не обязательно; но вам придется подавить уведомления (опция--n
), если вы удалите ее (-4 байта).J ,
23 2119 байтПопробуйте онлайн!
Ввод представляет собой список целых чисел в стандартном порядке.
источник
05AB1E , 19 байтов
У меня все еще есть ощущение, что он немного длинный, но он работает .. И лучше, чем первоначальное 23-байтовое решение, которое я имел с конструкцией if-else, которую я быстро отбросил ..
Порядок ввода такой же, как в задании: общая длина, индекс,
1
/0
для левого / правого соответственно.Попробуйте онлайн или проверьте оба теста .
Объяснение:
источник
С ++ 181
источник
return 0
изmain
.C(n)>>k>>p
будет коротким, чемC(n)C(k)C(p)
не так? И если определение для P () может привести к строковому аргументу, разве это не сохранит символы для всех кавычек? И когда вы сравниваете p с 'l' и 'r': 0 и 1 будут короче - в частности> 0 вместо == 'r' и <1 вместо == 'l' (при условии, что вы в порядке, используя числа вместо r / l - если нет, <'r' по-прежнему короче == 'l', а> 'l' по-прежнему короче == 'r')PHP -
105,97, 96Пример результатов:
источник
Javascript,
8185 символовПервый раз попробовал Codegolf, было весело, спасибо :)
источник
JavaScript - 85 символов
1 = слева, 0 = справа
источник
Clojure, 81 символ
источник
vb.net (~ 75с)
источник