Задний план
У меня есть лестница, опирающаяся на стену, и робот с дистанционным управлением, который может взобраться на нее. Я могу отправить роботу три разные команды:
UP
: робот делает один шаг вверх. Если он был на самой высокой ступени, он спотыкается, падает и взрывается.DOWN
: робот делает один шаг вниз. Если бы это было на самой низкой ступени, ничего не происходит.RESET
: робот возвращается к нижней ступени.
Я также могу отправить серию команд, и робот выполнит их одну за другой. Ваша задача - предсказать его движение.
вход
Ваши входные данные представляют собой положительное целое число N
, представляющее количество шагов в лестнице, и непустую строку C
поверх UDR
, представляющую команды, которые я отправил роботу. Вы можете предположить это N < 1000
. Робот инициализируется на самой низкой ступеньке лестницы.
Выход
Гарантируется, что в какой-то момент робот перелезет через самую высокую ступеньку и взорвется. Ваш вывод - это количество команд, которые он выполняет до того, как это произойдет.
пример
Рассмотрим входные данные, N = 4
и C = "UDDUURUUUUUUUDDDD"
робот, обозначенный как @
, движется по 4-х ступенчатой лестнице следующим образом:
|-| |-| |-| |-| |-| |-| |-| |-| |-| |@| |-||
|-| |-| |-| |-| |-| |@| |-| |-| |@| |-| |-||
|-| |@| |-| |-| |@| |-| |-| |@| |-| |-| |-|v
|@| U |-| D |@| D |@| U |-| U |-| R |@| U |-| U |-| U |-| U |-|# Boom!
Остальные команды не выполняются, так как робот взорвался. Взрыв произошел после 10 команд, поэтому правильный вывод есть 10
.
Правила и оценки
Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Контрольные примеры
1 U -> 1
1 DDRUDUU -> 4
4 UDDUUUUURUUUUDDDD -> 7
4 UDDUURUUUUUUUDDDD -> 10
6 UUUUUDRUDDDDRDUUUUUUDRUUUUUUUDR -> 20
10 UUUUUURUUUUUUURUUUUUUUURUUUUUUUUUUUUUU -> 34
6 UUUDUUUUDDDDDDDDDDDDDDRRRRRRRRRRRUUUUUU -> 8
6 UUUDUUUDURUDDDUUUUUDDRUUUUDDUUUUURRUUDDUUUUUUUU -> 32
20 UUDDUDUUUDDUUDUDUUUDUDDUUUUUDUDUUDUUUUUUDUUDUDUDUUUUUDUUUDUDUUUUUUDUDUDUDUDUUUUUUUUUDUDUUDUDUUUUU -> 56
354 UUDDUUDUDUUDDUDUUUUDDDUDUUDUDUDUDDUUUUDUDUUDUDUUUDUDUDUUDUUUDUUUUUDUUDUDUUDUDUUUUUDUDUUDUDUDUDDUUUUUUUDUDUDUDUUUUUDUDUDUDUDUDUDUDUUDUUUUUURUUUDUUUUDDUUDUDUDURURURUDUDUUUUDUUUUUUDUDUDUDUDUUUUUUDUDUUUUUUUDUUUDUUDUDUDUUDUDUDUUUUUUUUUUDUUUDUDUUDUUDUUUDUUUUUUUUUUUUUDUUDUUDUDUDUUUDUDUUUUUUUDUUUDUUUDUUDUUDDUUUUUUUUDUDUDUDUDUUUUDUDUUUUUUUUDDUUDDUUDUUDUUDUDUDUDUUUUUUUUUDUUDUUDUUUDUUDUUUUUUUUUUUDUDUDUDUUUUUUUUUUUUDUUUDUUDUDDUUDUDUDUUUUUUUUUUUUDUDUDUUDUUUDUUUUUUUDUUUUUUUUUDUDUDUDUDUUUUUUDUDUDUUDUDUDUDUUUUUUUUUUUUUUUDUDUDUDDDUUUDDDDDUUUUUUUUUUUUUUDDUDUUDUUDUDUUUUUUDUDUDUDUDUUUUDUUUUDUDUDUUUDUUDDUUUUUUUUUUUUUUUUUUDUUDUUDUUUDUDUUUUUUUUUUUDUUUDUUUUDUDUDUUUUUUUUUDUUUDUUUDUUDUUUUUUUUUUUUDDUDUDUDUUUUUUUUUUUUUUUDUUUDUUUUDUUDUUDUUUUUUUUUUUDUDUUDUUUDUUUUUUDUDUDUUDUUUUUUUUUUUUDUUUDUUDUDUDUUUUDUDUDUDUDUUUUUUUUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUUU -> 872
Ответы:
CJam,
262522 байтаФормат ввода - это инструкции в первой строке и высота лестницы во второй.
Проверьте это здесь.
объяснение
источник
C
8371 + 4 = 75 байтСпасибо @Josh за то, что показал мне стиль K & S , который позволил отключить 8 байтов !!
Разъяснение:
Пример вызова:
Живой тест на ideone
источник
z
иa
не сбрасывается.JavaScript (ES6),
5453 байтаобъяснение
Использует рекурсивную функцию внутри.
источник
Perl, 47 + 2 = 49 байт
Требуется
-p
флаг-i$N
для последней высоты и разделенный новой строкой список ходов:Как это работает:
Deparsed:
источник
JavaScript (SpiderMonkey 30+),
6564 байтаКак это работает
Сначала мы устанавливаем переменную
i
равной 0. Это будет отслеживать, сколько шагов поднялся робот. Затем для каждого символаc
во входной строке мы запускаем следующую логику:i
больше или равноn
, не делайте ничего.c
есть"D"
:i
0, оставьте все как есть.c
есть"U"
, увеличитьi
на 1.i
на 0.Отрезая if
i>=n
, мы не добавляем больше элементов в массив после того, как робот достигнет вершины. Таким образом, мы можем просто вернуть длину полученного массива.источник
Haskell, 65 байт
Пример использования:
f 4 "UDDUURUUUUUUUDDDD"
->10
.%
корректирует текущую позицию на лестнице,scanl
составляет список всех позиций,fst.span(<n)
принимает участие до взрыва иlength
подсчитывает шаги.источник
JavaScript (ES6), 65 байт
источник
0,i=0
может быть изменен наi=0
MATL ,
3734 байтаПопробуйте онлайн!
объяснение
Позиция на основе 0. Каждая новая позиция помещается в стек, сохраняя старые позиции. Таким образом, размер стека представляет количество движений до настоящего времени плюс 1.
Цикл используется для обработки каждой команды. Цикл
прекращается, когда позиция достигает высоты лестницыобрабатывает все команды, даже после взрыва (идея взята из ответа Мартина ). Окончательный результат определяется индексом первой позиции, которая равна высоте лестницы.источник
Python 2,
6362 байтаНапример,
f(4, 'UDDUURUUUUUUUDDDD')
есть10
.xnor нашел еще более короткое выражение:
2%~h
это действительно круто :)источник
%4
. Если я не ошибаюсь, вы можете сохранить персонажа, выполнив-[2%~h,~h,0][ord(s[0])%4]
.PowerShell,
8679 байтНебольшое переоснащение моего Когда Санта входит в подвал? ответ.
Принимает ввод
$a
и$b
, явно приведя$b
как char-массив. Затем мы|%{...}
перебираем все$b
. Каждую итерацию мы увеличиваем наш счетчик$d
.Затем
if
заявление, чтобы проверить, попали ли мы в топ-ge$a
. Если это так, мы выводим$d
иexit
. Операторif
построен из псевдо-троичного, созданного путем присвоения$c
минус-равно результату нескольких индексов в массиве.У нас есть трюк , что значения ASCII из
D
,R
иU
соответствуют0
,2
и1
когда берутся по модулю-4, так что$_%4
служат в качестве нашего первого индекса. Если это такR
, то устанавливается$c
равным$c-$c
, делая сброс. ЕслиU
это означает, что нам нужно идти вверх, значит,$c-(-1)
результат. В противном случае это aD
, поэтому нам нужно проверить, не находимся ли мы уже внизу (это!$c
- в PowerShell, «not-zero» равно «true» или1
) и установить$c
равным$c-0
или$c-1
соответственно.Редактировать - Сохранение 7 байтов с использованием минус-равного назначения, а не прямого назначения
источник
Perl 5, 61 байт
Включает два байта для
-F -i
. (-M5.01
бесплатно.)Ввод целого числа (например, 10) как
perl -M5.01 -F -i10 robot.pl
; ввод лестничных команд как STDIN.источник
-anF
прежде чем он напечатал бы что-нибудь для меня. но, похоже, он неявно включается только-F
в 5.20.3. Вы можете это проверить?-F
мне хватило (5.20 или 5.22 или около того). Iirc текущий perldoc perlrun говорит, что это подразумевает-a
и-a
подразумевает-n
.-i
? Я вижу, вы считаете это как 1, но я думаю, что на самом деле это должно быть засчитано как 3? :-)-i
и безperl -i10 -pe';'
противperl -pe';'
3 -х символов больше и затем номер входа - который я предполагаю , что мы не должны рассчитывать. Но я могу ошибаться, хотя об этом сегодня утром :-)Витси, 44 байта
Вероятно, могут быть некоторые сокращения - я придумаю еще кое-что, если смогу.
Объяснение (в процессе):
Попробуйте онлайн! (большой тестовый кейс)
источник
PHP, 88 байт
Это генерирует некоторые (3 + 2n, где n - количество выполненных команд) уведомлений, но это не имеет значения для игры в гольф, верно?
ungolfed:
источник
Python, 121 байт
источник
## Python, <N> bytes
чтобы показать другим ваш счет.0 if x==0 else x-1
наx and x-1
JavaScript,
131106 байт-Я знаю, что это не выиграет соревнование Code Golf, но это было забавное и глупое решение для реализации:
Я как бы пошел вразрез с «функциональным» маршрутом, приняв динамически сгенерированное императивное решение, любой экземпляр инструкции заменяется на приращение или уменьшение, а счетчик увеличивается.
Спасибо Cycoce за то, что сэкономил мне 29 байт!
источник
l=>s=>Function('i=c=0;'+s.replace(/./g,x=>`c++;i${{R:"=0",U:`++;if(i>=${l})return c`,D:"--"}[x]};`))()
Python 3, 90
Сохранено 6 байт благодаря DSM.
Довольно просто прямо сейчас.
Тестовые случаи:
источник
PHP, 129 байт
Не победа, а создание удовольствия. PHP, похоже, не любит пустые части в троичном операторе (он выдает синтаксическую ошибку), поэтому мне пришлось добавить
0
туда.Безголовая версия:
источник
PHP, 113 байт
Меньшая версия https://codegolf.stackexchange.com/a/74575/13216
Ungolfed:
источник
Pyth, 19 байт
Попробуйте онлайн: демонстрация или тестовый набор
Объяснение:
источник
Java, 250 байт
источник
# <language_name>, XX bytes
. Также вы можете уменьшить имена переменных до одного символа и удалить лишние пробелы, таким образом, количество ваших байтов уменьшится (что и является целью) ... А, и добро пожаловать в PPCG!int steps=1; int count=0;
чтобы использоватьint s=1,c=0;
- посмотрите, я изменил имя переменной - и так далее). Вы все еще можете показать свою ungolfed версию ниже golfed версии с объяснением (таким образом , легко для кого - то помочь вам игра в гольф больше байт).C, 91 байт
Нет предупреждений с
gcc -Wall
. Рекурсия и разделенные запятыми выражения.r.c
содержит голую функцию:комментарии,
Для справки,
roboladder.c
обертка,Makefile
для тестирования,источник
Mathematica,
114120 байтовАнонимная функция, которая принимает два аргумента (C, N). Осторожно используйте это, так как он не закрывает открываемый поток. Также он назначает все свои переменные глобально.
Отредактировано для замены
d=#-1&
наd=#~Max~1-1&
, чтобы Роби не копал.источник
Mathematica, 112 байт
источник
Clojure,
9284 байтаСчитает
n
до нуля вместо нуляn
, может использоватьtake-while pos?
.Оригинал:
Сопоставляет 2-й аргумент
U
с+
,D
с-
и другими сnil
. Редукционная функция запускается(operand position 1)
с ненулевымoperand
и0
иным образом. Принимает значения до тех пор, пока мы не превысим 1-й входной аргумент, и посчитает, сколько у нас есть.источник
Mathematica, 67 байт
Безымянные функции двух аргументов, положительного целого числа и списка символов, которые возвращают положительное целое число. Более простая
While
реализация, чем в других записях Mathematica, которая дает более конкурентную длину.источник