Проведя некоторое время на этом сайте, я пришел к тому, чтобы насладиться вещами как можно короче. Это может быть причиной того, что меня недавно обидели строки, содержащие одни и те же символы более одного раза. Ваша задача - написать функцию или программу, которая объединяет данную строку в соответствии со следующими правилами:
Начните с 0-конденсата , то есть ищите первую (самую левую) пару тех же символов с 0 другими символами между ними. Если такая пара найдена, удалите один из двух символов и перезапустите алгоритм, выполнив еще одну 0-конденсацию . Если такая пара не найдена, перейдите к следующему шагу. Примеры:
programming
-C0->programing
aabbcc
-C0->abbcc
test
-C0->test
Затем выполните 1-конденсацию , то есть найдите первую пару одинаковых символов с 1 другим символом между ними. Если такая пара найдена, удалите один из них и все символы между ними и перезапустите с 0-конденсатом . Если такая пара не найдена, перейдите к следующему шагу. Примеры:
abacac
-C1->acac
java
-C1->ja
Продолжайте с 2-конденсацией и так далее до n-конденсации, где n - это длина исходной строки, каждый раз при перезапуске после конденсации удаляются некоторые буквы. Примеры:
programing
-C2->praming
abcdafg
-C3->afg
Результирующая строка называется сжатой и содержит каждый символ не более одного раза.
Входные данные:
Строка в нижнем регистре печатаемых символов ascii.
Выход:
Конденсируют строки в соответствии с указанными выше правилами.
Примеры:
examples -> es
programming -> praming
puzzles -> puzles
codegolf -> colf
andromeda -> a
abcbaccbabcb -> acb
if(x==1):x++ -> if(x+
fnabnfun -> fun
abcdefae -> abcde
Подробные примеры, чтобы уточнить, как работает алгоритм:
fnabnfun -C0-> fnabnfun -C1-> fnabnfun -C2-> fnfun -C0-> fnfun -C1-> fun -C0-> fun
-C1-> fun -C2-> ... -C8-> fun
abcbaccbabcb -C0-> abcbacbabcb -C0-> abcbacbabcb -C1-> abacbabcb -C0-> abacbabcb
-C1-> acbabcb -C0-> acbabcb -C1-> acbcb -C0-> acbcb -C1-> acb -C0-> acb
-C1-> ... -C12-> acb
Ваш подход не должен реализовывать алгоритм сверху, пока ваше решение и алгоритм возвращают одинаковые выходные данные для всех разрешенных входных данных. Это вызов для игры в гольф .
Спасибо @Linus за полезные комментарии в песочнице!
Ответы:
JavaScript (ES6), 74 байта
источник
Perl,
38313029 байтЭто должно оставить языки без игры в гольф далеко позади ...
-1 за
$-[0]
благодарность Райли-1 за
@{-}
благодарность ДадаВключает +1 для
-p
Внести вклад в STDIN
condense.pl
:Эта 27-байтовая версия должна работать, но это не так, потому что perl не интерполирует
@-
в регулярных выражениях (см. Https://stackoverflow.com/questions/39521060/why-are-etc-not-interpolated-in-strings )источник
@{\@-}
часть? Я думал, что@-
содержит индексы каждого совпадения, так как он «подсчитывает» на каждой итерации. Кроме того, если вы печатаете@{\@-}
до и после каждой замены, она печатает только 1 или 2././g
Прогрессирует на 1 в строке каждый раз, за исключением случаев, когда строка изменяется, а затем сбрасывается на 0. Если вы печатаете@-
после,/./g
но до того, какs///
вы увидите, что она идет вверх (используйте тест, где оставшаяся строка достаточно велика)$-[0]
дает числа, которые я ожидал. Имеет ли@{\@-}
действие , как$-[0]
из - за регулярные выражения контекста , но не при печати по какой - то причине?$-[0]
на байт короче, чем@{\@-}
если бы они были одинаковыми."@{\@-}"
это не то же самое, что@{\@-}
(без"
)."@{\@-}"
же, как"@-"
. И это также должно быть верно для замены регулярных выражений, но это не так. Одновременно$-[0]
должно работать, но не работает. PS: Вы, вероятно, каким-то образом применили скалярный контекст,@-
когда делали свой отпечаток, так что вы всегда получаете 1 или 2CJam , 35 байт
Попробуйте онлайн!
Вы можете увидеть отдельные уплотнения, вставив
ed
источник
Python 2,
117104101 байтРекурсивно делать необходимые замены. Я строю регулярное выражение динамически.
Попробуйте онлайн
источник
return i>len(t) and t or s!=t and f(t) or f(t,i+1)
для получения -4 байтовreturn t if i>len(t)else s!=t and f(t)or f(t,i+1))
e=s==t;return i>len(t)and t or f(t,i*e+e)
вы можете удалитьi=0
из определения функции, но вам придется вызывать с 0 start.Perl
5352Включает +1 для -p
Попробуйте это на Ideone .
источник
Mathematica, 101 байт
Должен быть способ сделать это короче ...
источник
PHP, 90 байт
или 92 байта
источник
+$i
вместо$i+=0
(-2). 2)for
цикл вместоwhile
может сохранить два байта и разрешить удаление фигур (-4). 3)$i=++$i*!$c
вместо$i=$c?0:$i+1
(-1). 4)\\2
не требуется, удалите скобки (-2). 5) Вы можете разрешить ограничение9
вместо1
скорости (+0)+$i
не работает в каждом случае. Попробуйhammer
. PHP не жалуется на пустые скобки в регулярном выражении; но он не соответствует желаемому. Кстати: я считаю 91, а не 90. Но попробуйте новый 1)for($s=$argv[$c=1];$s[$i=++$i*!$c];)
$i+=0
и попробую ваше предложение позже. Что значит с молотком?puzzle
или что-то еще,(.)//1
но это нормально с твоим предложением или$i´=0
Рубин,
756457 байт(56 байт кода +
p
опция командной строки.)Использование строковой интерполяции внутри регулярного выражения для управления длиной заменяемых совпадений.
Тест:
источник
Haskell ,
9788 байтПопробуйте онлайн!
Старый 97 байт:
Попробуйте это на Ideone .
Объяснение:
(!)
Функция выполняет один п-конденсация , когда дана строка раз целого и один раз с первых п символами удаляют, например ,abcdbe
иcdbe
для 2-конденсации, путем рекурсивного сравнения двух ведущих персонажей.источник