Я воспроизводлю вторую часть первого дня «Появления кода» с разрешения создателя.
Санта пытается доставить подарки в большой жилой дом, но он не может найти правильный этаж - направления, которые он получил, немного запутаны. Он начинает с первого этажа (этаж 0) и затем следует инструкциям по одному символу за раз.
Открывающая скобка (
означает, что он должен подняться на один этаж, а закрывающая скобка )
означает, что он должен спуститься на один этаж.
Жилой дом очень высокий, а подвал очень глубокий; он никогда не найдет верхний или нижний этажи.
Учитывая набор инструкций, найдите положение первого персонажа, который заставляет его войти в подвал (этаж -1).
В качестве примеров:
ввод )
заставляет его войти в подвал в позиции персонажа 1.
ввод ()())
заставляет его войти в подвал в позиции персонажа 5.
Длинный вклад дается здесь , что должно дать решение 1797.
Это код гольф, поэтому выигрывает самое короткое решение!
Ответы:
Желе,
87 байтСпасибо @ Sp3000 за вывод 1 байта!
Попробуйте онлайн!
Как это устроено
источник
Python 2, 44 байта
Это умное решение было найдено с помощью Hallvabo, xsot, mitchs и whatisgolf по этой проблеме на анархическом гольфе . Если кто-то из вас захочет опубликовать это, я удалю это.
Хитрость заключается в том, чтобы парсер Python сделал всю работу. Функция
input()
пытается вычислить входную строку и выдает ошибку в первом непревзойденном парене. Эта ошибка при обнаружении имеет формукоторый включает в себя номер символа, где произошла ошибка.
источник
Python,
7977 байтВозможно, есть лучший способ сделать это, но у меня нет идей. Также это мой первый пост на Codegolf.
Спасибо @Erwan. для игры в гольф от 2 байтов.
источник
[0:g]
на[:g]
-2*ord(z)+81
по2*(z<')')-1
Python 3, 59
Сохранено 3 байта благодаря grc.
Мне очень не нравится выполнять ручную индексацию строк в Python. Это так неправильно.
источник
C, 55 байтов
Попробуй здесь .
Изменить: Не уверен, почему я оставил неиспользованную переменную там ...
источник
CJam, 10 байтов
или
или (кредиты Денису)
Проверьте это здесь.
объяснение
Как уже отмечал Симмонс,
()
это удачный выбор для CJam, так как это операторы декремента / приращения соответственно. Это означает, что если мы начинаем с нуля, мы ищем шаг, на котором Санта достигает 1-го этажа.источник
Лабиринт , 18 байт
Попробуйте онлайн! Этот ответ стал результатом сотрудничества с @ MartinBüttner.
объяснение
Обычный лабиринтный праймер (я говорю «обычный», но я на самом деле переписываю это каждый раз):
n*10 + <digit>
. Это позволяет легко накапливать большие числа. Чтобы начать новый номер, используйте_
, который толкает ноль.Этот код немного странный, поскольку для целей игры в гольф основной цикл объединяет две задачи в одну. Для первой половины первого прохода вот что происходит:
Теперь, когда стек был инициализирован с -1 сверху, фактическая обработка может начаться. Вот что делает основной цикл.
Последний дубликат добавляет элемент в стек для каждой итерации, которую мы выполняем. Это важно, потому что, когда мы достигаем нуля и идем вперед в NOP, мы делаем:
источник
Oracle SQL 11.2,
160159 байтUn-golfed
источник
Сетчатка ,
2221Попробуйте онлайн или попробуйте большой контрольный пример. (URL большой для большого тестового случая, дайте мне знать, если он сломался для вас, кажется, в Chrome нормально.)
1 байт сохранен благодаря Мартину!
Мы сопоставляем первый набор сбалансированных скобок и извлекаем его, а затем подсчитываем, сколько раз пустая строка будет соответствовать этому результату. Я не уверен, является ли это наилучшим способом сделать это в Retina, особенно если режим PCRE делает его короче, но использование
$#_
замены показалось более продолжительным из-за одной ошибки и проблемы с более чем одним совпадением.Этот алгоритм вызывает странное поведение для неверного ввода, он по существу предполагает, что, если Санта не доберется до подвала, он таинственным образом телепортируется туда после других движений.
источник
Grep + AWK, 51 байт
Команда
grep
помещает каждый символ на новую строку.источник
Pyth, 13 байт
объяснение
Попробуй здесь
Старый алгоритм, 15 байтов
Объяснение:
Попробуй здесь
Или, если разрешено использовать символы, отличные от
(
и)
, 9 байтов (перевод предварительной обработки на вход)объяснение
Попробуй здесь
источник
JavaScript (ES6), 58 байт
Работает путем рекурсивного удаления пары совпадающих
()
s до тех пор, пока первый символ не станет a)
. Предупреждение: не пытайтесь делать это со строками, которых недостаточно)
s. Пример:На данный момент он видит, что всего 12 символов было удалено, так что ответ 13.
источник
MATL ,
1211 байт1 байт сохранен с использованием идеи Денниса вычисления -1, возведенного во входную строку
Попробуйте онлайн!
источник
CJam,
1210 байтПопробуй это здесь.
Два байта спасены благодаря Мартину.
Объяснение:
источник
Javascript, 117 байт
Игнорирует других персонажей. Использует
prompt
иalert
.источник
Perl, 34 + 1 = 35 байт
Спасибо Деннису за несколько советов.
Беги с
-p
флагом. Это работает в Perl 5.10, но более поздние версии требуют пробела здесь:++ while
Более старая, негольфированная версия:
источник
Python, 44 байта
Пол
i
начинается1
так , что мы заканчиваем наi
время значение falsey0
. Если не завершено, рекурсивно добавьте единицу к результату с удалением первого символа и обновлением номера этажа на основе этого символа.источник
Javascript, 57 байт
Довольно просто, просто перебирает ввод, incs if '(' decs if ')'. Возвращает на первый негатив.
источник
Рубин, 47 байтов
Анонимная функция.
источник
C 73 байта
Ожидается ввод на STDIN; никакие символы кроме
(
и не)
могут появиться на входе (по крайней мере, пока мы не дойдем до ответа). Ввод должен быть ASCII.Издает ответ на STDOUT.
Использует 1-битную разницу между ASCII для
(
и)
.Красиво отформатированная версия:
источник
f=c=0
в инициализации цикла,for(f=c=0;f!=...
чтобы сохранить байт?PowerShell,
756562 байтаИспользует технику, аналогичную двоичным числам Parenthifiable, чтобы перебрать все входные символы, сохраняя текущую
$c
унцию+1
для каждого(
и-1
для каждого)
, а затем проверяя, не попали ли мы в минус (т. Е. Мы в подвале).Редактировать - сохранить 10 байтов путем итерации по фактическим символам, а не по их индексам
Редактировать 2 - сохранить 3 дополнительных байта путем замены проверки равенства по модулю, поэтому приведение неявно
источник
Mathematica,
6255 байтВсе длинные имена функций! Работает аналогично ответу Симмонса на CJam.
источник
Befunge 25 байтов
Выходы в одинарных. Это запускает вас на первом этаже и будет идти до 0.
источник
Ракетка (102)
Ungolfed
источник
APL, 18 символов
По-английски:
¯1*')'=⍵
: -1 где input = ")", 1 в противном случае;+\
: текущая сумма;1⍳⍨¯1=
: найти индекс первого -1.источник
Луа,
928987 байтОн принимает аргумент командной строки.
Изменить: сохранено 3 байта
Редактировать: Сохранено 2 байта и исправлена ошибка, которая могла произойти в крайних случаях, теперь она выводится через код выхода
Ungolfed
источник
к / кона ,
2321 байт2 байта сохраняются путем удаления ненужных скобок.
Использование:
источник
Perl, 40 + 1 = 41 байт
Требуется
-p
флаг:Предполагается действительный ввод.
Как это устроено:
источник
Javascript (ES6),
6867 байтПринимает ввод в качестве первого аргумента
объяснение
источник
Python (3,5),
787162 байтарекурсивное решение
это похоже на это решение для мини-гольфа
мы можем предположить, что Санта всегда достигает подвала
источник