Соревнование
Учитывая две строки / массив строк, выведите первую строку, медленно сжимающуюся и расширяющуюся обратно во вторую строку.
Вы можете предположить, что строки всегда будут начинаться с одного и того же символа.
пример
Input:
"Test", "Testing"
Output:
Test
Tes
Te
T
Te
Tes
Test
Testi
Testin
Testing
Сначала вы выводите первое слово:
Test
Затем вы продолжаете удалять одну букву, пока строка не станет длиной в один символ:
Tes
Te
T
Затем продолжайте добавлять одну букву второго слова, пока это не будет сделано:
Te
Tes
Test
Testi
Testin
Testing
(если обе строки имеют длину одного символа, просто выведите одну из них один раз.)
Тестовые случаи
"Hello!", "Hi."
Hello!
Hello
Hell
Hel
He
H
Hi
Hi.
"O", "O"
O
"z", "zz"
z
zz
".vimrc", ".minecraft"
.vimrc
.vimr
.vim
.vi
.v
.
.m
.mi
.min
.mine
.minec
.minecr
.minecra
.minecraf
.minecraft
" ", " "
SSSSS
SSSS
SSS
SS
S
SS
SSS
"0123456789", "02468"
0123456789
012345678
01234567
0123456
012345
01234
0123
012
01
0
02
024
0246
02468
(примечание: в пробеле / четвертом контрольном примере замените S пробелами)
правила
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах! Tiebreaker - самая популярная публикация. Победитель будет выбран 09.10.2016.
Стандартные лазейки запрещены.
Ответы:
Pyth, 9 байт
Программа, которая принимает вторую строку, а затем первую строку в виде строк в кавычках в STDIN и печатает результат.
Попробуйте онлайн
Как это работает
источник
V , 14 байтов
Попробуйте онлайн!
Объяснение:
Теперь буфер выглядит так:
Нам просто нужно сделать то же самое в обратном порядке для следующей строки:
Более интересное альтернативное решение :
источник
Python, 93 байта
Начинается с пустой строки
r
, добавляетa
и новую строку и удаляет последний символa
до тех пор, пока он неa
станет пустым, затем добавляет требуемые частиb
и новую строку , сохраняя счетчикi
, который начинается с2
тех пор, пока неb
будет превышена длина , а затем вернетсяr
. Имеет завершающий перевод строки.Все тесты на ideone
источник
r=""
. Простойr
все равно будет работать.f=
. 2. Безr=''
настоящегоf('test','testing')
не будет работать; даf('test','testing','')
, но мы должны следовать спецификациям.05AB1E , 9 байтов
объяснение
Попробуйте онлайн!
источник
Retina,
504126 байтСпасибо Мартину Эндеру за сохранение 15 (!) Байтов.
Принимает ввод с двумя строками, разделенными новой строкой:
Попробуйте онлайн!
объяснение
Первая строка генерирует «шаги» обоих слов:
M
предназначен для режима совпадения,&
учитывает перекрывающиеся совпадения и!
печатает совпадения вместо их количества. Причина, по которой он меняется на противоположный, -r
опция «направо-налево»: двигатель начинает поиск совпадений в конце строки и продолжает движение к началу.Это получает все в правильном порядке:
O
все совпадения последующего регулярного выражения: символ в отдельной строке и каждый символ (включая символы новой строки) после него, который соответствует всей второй половине как один фрагмент, или иначе строка символов , который соответствует каждой отдельной строке. Эти совпадения затем сортируются по кодам, поэтому буква T, за которой следует новая строка, идет первой, а затем строки по возрастанию по длине.Теперь у нас есть только первая строка символов сверху, поэтому мы используем
A
режим ntigrep, чтобы отменить первое совпадение регулярного выражения по умолчанию.+
.Старая версия
Попробуйте эту версию онлайн!
объяснение
Первая строка такая же, поэтому смотрите объяснение этому выше.
Это переворачивает строки первой половины (второго входного слова). На самом деле
O
это строки, а регулярное выражение ограничивает совпадения: это должна быть строка из двух или более символов (..+
), за которой следует символ новой строки (¶
), начинающийся там, где остановился последний (\G
). В приведенном выше примере синглT
в середине не совпадает, так что ничего после этого не может.Теперь у нас есть правильные два компонента, но в неправильном порядке.
¶.¶
соответствует одиночке T посередине, которая нам не нужна, но разделяет две части. Они(.*)
захватывают все до и после, в том числе иs
новые строки благодаря режиму сингла. Два снимка заменяются в правильном порядке с новой строки между ними.Теперь мы закончили, если только входные строки не состоят из одного символа, в этом случае ввод не изменился. Чтобы избавиться от дубликата, мы заменяем
¶.$
(когда в последней строке строки один символ) ничего.источник
Python 2,
8882 байтаПринимает два входа, каждый в кавычках.
Спасибо @JonathanAllan за сохранение некоторых байтов и указание на ошибку.
источник
len(x)
вx=x[:len(x)-1]
In, так как срезы с отрицательным смещением работает - вы можете просто написатьx=x[:-1]
. Единственная проблема в том, что ваш код не" ", " "
очень хорошо справляется с тестовым примером.input()
и использовать формат ввода, например"<str1>", "<str2>"
for i in range(x):print x[-i:]
, а четвертую строку наfor i in range(1,y):print y[:-i]
. Не уверен, что это сработает.Perl,
3428 байтВключает
+2
в себя для-0n
Запустите строки в отдельных строках на STDIN:
slow.pl
:Пусть regex backtracking сделает всю работу ...
источник
Чеддер , 76 байт
Чуть дольше, чем мне бы хотелось. Я скоро добавлю объяснение
Попробуйте онлайн!
источник
|>
?Брахилог , 32 байта
Попробуйте онлайн!
объяснение
Brachylog не имеет встроенного префикса, поэтому мы получим префиксы с помощью
concatenate
(См. Предикат 2): префиксS
is,P
еслиP
объединяется сQ
(каким бы он ни был), приводит кS
.Основной предикат:
Предикат 1:
Предикат 2:
источник
Javascript,
10381 байтПример:
f("Test", "Testing")
Выход:
Оригинальный ответ
источник
Ява,
188179 байтОбновить
Ungolfed :
Использование :
источник
Haskell,
545347 байтПример использования:
((.reverse.t).(++).init.t) "Hello" "Hi!"
->["Hello","Hell","Hel","He","H","Hi","Hi!"]
.Некоторая бессмысленная магия. Это то же самое, что и
f x y = (init(t x))++reverse (t y)
гдеt
составляется список всех исходных подстрок, напримерt "HI!"
->["H","HI","HI!"]
.источник
t=reverse.tail.inits
?inits
нужноimport Data.List
.Пайк, 14 байт
Попробуй это здесь!
И 17 байтов только потому, что это отличное решение:
Попробуй это здесь!
источник
GNU sed,
5745 + 2 (рН-флаги) = 47 байтБег:
На входе должны быть две строки, разделенные новой строкой. Код запускается с помощью sed для каждой строки.
Цикл
:
итеративно удаляет один символ из конца строки. Выход связан с первой строки печатается непосредственно, за исключением первого символа:1{/../p}
. Вывод для второй строки сохраняется во2G;2h
время удаления в обратном порядке ( ) во время удаления и печатается в конце.источник
C (gcc) ,
102979593 байтаПопробуйте онлайн!
Первый цикл перезаписывает строку с 0 байтами, начиная с конца, и использует ее
puts()
для печати строки. Второй цикл не может просто перезаписать с самого начала, он должен хранить старое значение, чтобы он мог вернуть его обратно; 0 байт просто идет к концу.Спасибо @homersimpson и @ceilingcat за каждое бритье на 2 байта!
источник
n
качестве глобального междунар как:n;f(char*a,char*b){n=strlen(a)...
. И вы, вероятно, можете сделать этоn=*a=0
как цепочечное задание в теле вашего цикла for.Python 3, 104 байта
Мех.
Спасибо @DJMcMayhem за игру в гольф на 21 байт.
Идео это!
источник
n='\n'
и использовать n вместо'\n'
. Вы могли бы снять еще 8, если бы вместо печати использовали лямбду:n='\n';lambda x,y:n.join(x+n+n.join(x[:-i]for i in range(1,len(x)-1))+n+n.join(y[:i]for i in range(1,len(y)+1)))
REPL / Javascript, 109 байт
Использует ложную строку, чтобы уменьшить исходную строку
Злоупотребляет подстрокой с большими числами для увеличения второй, останавливается, когда собирается напечатать то же слово, что и в прошлый раз.
Демо-версия:
источник
a=>b=>...
и вызвать функцию с (a) (b)Brainfuck,
3855 байтИзменить: включены новые строки в выводе
источник
Dyalog APL ,
2013 байтов↑
matrify(⌽,\⍞)
reversed (⌽
) совокупная конкатенация (,\
) ввода символов (⍞
),
приурочен к1↓
один элемент выпал из,\⍞
кумулятивная конкатенация ввода символовПопробуй APL онлайн!
источник
Ракетка 193 байта
Тестирование:
источник
Флорид , 69 байт
Это начало. Принимает вход от STDIN.
Testcases
источник
JavaScript (ES6), 92 байта
Эти
replace
операторы образуют треугольник строк, который является именно тем, что требуется для второй половины вывода, однако первую половину необходимо перевернуть и удалить дублирующую односимвольную строку. Примечание: выводит начальный символ новой строки, если первая строка представляет собой один символ. Если это нежелательно, то для дополнительного байта эта версия всегда выводит завершающий символ новой строки:источник
C, 142 байта
Обеспечить
f(char* str1, char* str2)
.источник
TI-Basic, 56 байт
Пример использования
источник
Ява,
168136 байтТестовая программа Ungolfed
источник
(Lambdabot) Haskell - 41 байт
Более читаемый, но на два байта длиннее:
Выход:
источник
J, 18 байт
Ungolfed:
Это 7 поезд
Самая внутренняя
[: |. ]\@[
последовательность состоит из верхнего колпачка[:
слева, поэтому мы применяем|.
(реверс) к результату]\@[
, который является]\
(префиксы) над[
(левый аргумент).Вот как это выглядит на
testing, test
входе:Это дает нам первую порцию, почти. 5-поезд вне этого
([: }: ([: |. ]\@[))
, который применяется}:
(betail, удалить последний элемент) к вышеприведенному выражению:(Это потому, что у нас не может быть дубликата средней точки.)
Внешняя часть наконец-то:
Это состоит из
]\@]
(префиксы левого аргумента) и,~
(добавьте то, что слева, а что справа), оставляя нам желаемый результат:Контрольные примеры
источник
(,~}:@|.)&(]\)
PHP,
117109 байтPHP, 107 байт (не работает со строками, содержащими
0
)источник
C 111 байтов
Тест на недолговечность
источник
брейкфук, 162 байта
Попробуй здесь
Ввод принимает две строки, разделенные переводом строки.
Первая программа с brianfuck и первым гольф-кодом, так что я уверен, что предстоит много оптимизации. Хотя было весело делать это.
Ungolfed
источник