Вот как выполнить возврат и повторную печать из одной строки в другую:
- Начните с первой строки.
- Удалите символы в конце, пока результат не станет префиксом второй строки. (Это может занять 0 шагов.)
- Добавляйте символы в конце, пока результат не станет равным второй строке. (Это также может занять 0 шагов.)
Например, путь от fooabc
до fooxyz
выглядит так:
fooabc
fooab
fooa
foo
foox
fooxy
fooxyz
задача
Имея список слов, напишите программу, которая забирает и перепечатывает свой путь от пустой строки ко всем последовательным словам в списке обратно к пустой строке. Выведите все промежуточные строки.
Например, учитывая список ввода ["abc", "abd", "aefg", "h"]
, вывод должен быть:
a
ab
abc
ab
abd
ab
a
ae
aef
aefg
aef
ae
a
h
правила
Вы можете вернуть или распечатать список строк или одну строку с каким-либо разделителем на ваш выбор. При желании вы можете включить начальные и конечные пустые строки. Входные данные гарантированно содержат как минимум одно слово, а каждое слово гарантированно содержит только строчные буквы ASCII ( a
- z
). Изменить: последовательные строки на входе гарантированно не равны друг другу.
Это код-гольф ; выигрывает самый короткий код в байтах.
Ссылочная реализация в Python 3: попробуйте онлайн!
["abc","abc"]
?a,abc,abcde,abc,a,abc,abcde
Ответы:
Pyth,
2523 байтаПопробуйте онлайн.
источник
Perl, 43 байта
42 байта кода +
-n
флаги.Чтобы запустить это:
источник
abc
он был напечатан 3 раза (но на самом деле, первый и третий раз он был без пробела). Я удалил это.Java 8, 144 байта
Этот похож на эталонную реализацию, но объединяет два цикла
while
. Это лямбда-выражение, принимающееString[]
параметр.Ungolfed
Подтверждения
источник
class B
вместоinterface B
? Вы можете запустить из закрытого класса пакета. Также рассмотрите возможность использования лямбды, поскольку вы уже указали Java8.interface B{static void main
меньше чемclass B{public static void main
.a->{/*your code*/}
, что назначит переменную типаjava.util.function.Consumer<String[]>
. Я не могу проверить в данный момент, однако.Mathematica, 149 байтов
источник
Сетчатка , 39 байт
Число байтов предполагает кодировку ISO 8859-1.
Попробуйте онлайн!
Вход и выход представляют собой разделенные строкой списки. Выходные данные включают в себя начальную и конечную пустую строку.
источник
Желе ,
312926 байтПопробуйте онлайн!
Как это работает
источник
Haskell ,
102 93 9190 байтПоследняя строка представляет собой анонимную функцию, которая принимает и возвращает список строк. Попробуйте онлайн!
объяснение
Мое решение рекурсивное. Во-первых,
?
вспомогательная инфиксная функция:a?b
дает первыеlength a
символыb
или целое,b
еслиa
длиннее. Далее я определяю инфиксную функцию!
. Идея состоит в томa!x
, что , гдеa
есть строка иx
список строк, создается путь отa
первой строки вx
и возвращается к хвостуx
. В последней строке я определяю анонимную функцию, которая добавляет пустую строку, а затем применяет!
пустую строку и ввод.Объяснение
!
:источник
Python 2,
118107103979392 байтаВвод дан как
['abc', 'abcdef', 'abcfed']
или как ["abc", "abcdef", "abcfed"]
.Редакция 1: -11 байт. Автор благодарности @xnor за его пост о советах по игре в гольф на Python, а также @Lynn за подсказку для меня и меня за то, что я умный. Были внесены два изменения: вместо того
not s.startswith(i)
, чтобы использоватьs.find(i)
, и вместо того, чтобыi!=s
использоватьi>s
.Редакция 2: -4 байта. Кредит приходит ко мне, понимая, что я сделал действительно глупую ошибку. Вместо использования отступов с одной или двумя вкладками я использовал отступ с одной или двумя пробелами.
Редакция 3: -6 байт. Кредит идет к @ mbomb007 за предложение поместить whiles в одну строку. Я также исправил ошибку, изменив
s.find(i)
наi.find(s)
.Редакция 4: -4 байта. Благодарю @xnor за понимание того, что мне не нужно хранить входные данные в переменной.
Редакция 5: -1 байт. Благодарю меня за то, что я понял, что
['']
это то же самое, что и[s]
при добавлении к входу.источник
while
каждый в одну строку. Также вы можете использовать<1
вместоnot
.startswith
.while
s в одну строку. Вы имеете в виду какwhile s.find(i):s=s[:-1];print s
? Кроме того, спасибо за предложение<1
, но я изменился на что-то еще более короткое благодаря одному из советов xnor в ветке Python tips.GNU M4, 228 или 232 байта¹
(¹ в зависимости от того, закончить файл
dnl\n
или нет - я все еще новичок в гольфе и M4)Кроме того, можно сохранить 3 байта, заменив второй аргумент
substr
from0
на пустую строку, но это приведет к большому количеству предупреждений о stderr.Ungolfed:
Использование:
источник
PHP,
11611110183 байтаПримечание: используется кодировка Windows-1252.
Запустите так:
объяснение
Tweaks
trim($c^$w,"\0")
проверки соответствия подстроки вместо$c&&strpos($w,$c)!==0
.~ÿ
для получения строки с байтом NUL вместо"\0"
$c=$c.ÿ&$w
суффикса$c
со следующим символом$w
источник
Пакет,
296291 байтВычисление общего префикса было громоздким.
источник
PHP, 153 байта
ужасно долго :(
Беги с
php -nr '<ode>' <text1> <text2> ...
.источник
JavaScript (ES6), 135 байт
Интересный вызов! Использование:
g(["abc", "abd", "aefg", "h"])
. Я не могу сохранить байты, написав это как одну функцию, так что это два. Новые строки не включены в число байтов.Я уверен, что это может быть уменьшено намного больше. Позже добавлю версию без присмотра.
источник
Javascript, 98 байт
Порт Якова Java ответ
источник