Недавно я потворствовал некоторой ностальгии в форме Bookworm Deluxe:
Если вы еще этого не видели, это словесная игра, цель которой состоит в том, чтобы соединить соседние плитки и сформировать слова. Чтобы определить, является ли строка допустимым словом, она проверяет его по своему внутреннему словарю, который хранится в сжатом формате, который выглядит следующим образом:
aa
2h
3ed
ing
s
2l
3iis
s
2rdvark
8s
4wolf
7ves
Правила распаковки словаря просты:
Прочитайте число в начале строки и скопируйте столько символов из начала предыдущего слова. (Если числа нет, скопируйте столько символов, сколько вы делали в прошлый раз.)
Добавьте следующие слова к слову.
Итак, наше первое слово aa
, за которым следует 2h
, что означает «скопировать первые две буквы aa
и добавить h
», формируя aah
. Затем 3ed
становится aahed
, и поскольку в следующей строке нет номера, мы снова копируем 3 символа в форму aahing
. Этот процесс продолжается на протяжении всего словаря. Результирующие слова из небольшого примера ввода:
aa
aah
aahed
aahing
aahs
aal
aaliis
aals
aardvark
aardvarks
aardwolf
aardwolves
Ваша задача состоит в том, чтобы выполнить эту распаковку как можно меньше байтов.
Каждая строка ввода будет содержать ноль или более цифр, 0-9
за которыми следуют одна или несколько строчных букв a-z
. Вы можете взять ввод и выдать вывод либо в виде списка строк, либо в виде отдельной строки со словами, разделенными любым символом, кроме 0-9
/ a-z
.
Вот еще один небольшой тестовый пример с несколькими крайними случаями, не описанными в этом примере:
abc cba 1de fg hi 0jkl mno abcdefghijk 10l
=> abc cba cde cfg chi jkl mno abcdefghijk abcdefghijl
Вы также можете проверить свой код в полном словаре: ввод , вывод .
0
начальных0
s не будет?locate
Программа использует этот тип кодирования на путевых именах.Ответы:
Vim, 57 байт
Попробуйте онлайн!
источник
<H<G
работать вместо последней замены?<
решение будет достаточно удалено.:%s/ *
вместо последней замены, чтобы сохранить два байта.JavaScript (ES6),
66 6261 байтПопробуйте онлайн!
комментарии
источник
Perl 6 ,
5048 байтов-2 байта благодаря nwellnhof
Попробуйте онлайн!
Порт решения Арно . Чувак, этот
R||
трюк был "американскими горками" от «Я думаю, что это могло быть возможно», до «нет, это невозможно», до «вроде возможно» и, наконец, «ага!»Объяснение:
$l [R||]=~$/
Часть примерно переводится ,$l= ~$/||+$l
но ... это имеет такое же количество байтов:(
. Первоначально он сохранял байты, используя анонимную переменную, поэтомуmy$l
он исчез, но это не работает, поскольку область теперь является заменой, а неmap
блоком кода. Ну что ж. В любом случае,R
это обратный метаоператор, поэтому он переворачивает аргументы||
, поэтому$l
переменной присваивается новый номер (~$/
), если он существует, в противном случае он сам снова.Это может быть 47 байт, если Perl 6 не выдал своего рода избыточную ошибку компилятора
=~
.источник
Рубин ,
494543 байтаПопробуйте онлайн!
объяснение
источник
C
6557 байтПопробуйте онлайн!
Объяснение:
источник
брейкфак , 201 байт
Попробуйте онлайн!
Требует завершающий перевод строки в конце ввода. Версия без этого требования на 6 байт длиннее:
брейкфук , 207 байт
Попробуйте онлайн!
Обе версии предполагают, что все числа строго меньше 255.
объяснение
Лента выложена следующим образом:
Ячейка «число» равна 0, если цифры не введены, и n + 1, если число n введено. Вход берется в ячейку с отметкой «85».
источник
Python 3.6+,
172195156123122121104 байтаПопробуйте онлайн!
объяснение
Я прогнулся и использовал регулярные выражения. Это сэкономило как минимум 17 байтов. :
Когда строка вообще не начинается с цифры, длина этой строки будет
0
. Это значит, что:будет,
n
еслиt
пусто, аint(t)
иначе.удаляет номер, из которого найдено регулярное выражение
s
(если номер не найден, он удаляет0
символы, оставляя неs
обрезанным), и заменяет все, кроме первыхn
символов предыдущего слова, на текущий фрагмент слова; а также:выводит текущее слово.
источник
Haskell,
8281 байтПринимает и возвращает список строк.
Попробуйте онлайн!
Редактировать: -1 байт благодаря @Nitrodon.
источник
Japt,
191817 байтПервоначально вдохновлен решением JS Арно .
Попытайся
источник
Желе , 16 байт
Попробуйте онлайн!
Как это работает
источник
Python 2 , 118 байт
Попробуйте онлайн!
источник
Сетчатка 0.8.2 , 69 байт
Попробуйте онлайн! Ссылка включает в себя более сложные тестовые случаи. Объяснение:
Для всех строк, которые начинаются с букв, скопируйте число из предыдущей строки, циклически, пока все строки не начнутся с цифры.
Перевести число в одинарное.
Используйте группы балансировки, чтобы заменить все
1
буквы на соответствующие буквы из предыдущей строки. (Оказывается, это немного сложнее, чем замена всех трасс1
s.)источник
Красный , 143 байта
Попробуйте онлайн!
источник
Java (JDK) , 150 байт
Попробуйте онлайн!
источник
Groovy , 74 байта
Попробуйте онлайн!
Объяснение:
источник
Желе , 27 байт
Попробуйте онлайн!
источник
Perl 5
-p
,4541 байтПопробуйте онлайн!
Объяснение:
источник
Groovy ,
10399 байтПопробуйте онлайн!
источник
05AB1E ,
201917 байтПопробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
Common Lisp, 181 байт
Попробуйте онлайн!
Ungolfed:
Как обычно, длинные идентификаторы Common Lisp делают его не особенно подходящим для PPCG.
источник
Python 2 ,
10110099 байтПопробуйте онлайн!
источник
C # (интерактивный компилятор Visual C #) , 134 байта
Попробуйте онлайн!
-9 байт благодаря @ASCIIOnly!
Менее гольф ...
источник
l=n>0?n:l
на,l=m>0?n:l
потому что это не было в том случае, если строка начиналась с нуля (0jkl
). Спасибо за совет!Scala ,
226129102 байтаСпасибо @ ASCII-только за их работу здесь (и за Groovy ответ).
Попробуйте онлайн!
источник