Я подумал о новом способе генерации моих паролей, и, хотя он, вероятно, не очень умный в долгосрочной перспективе, он все равно может стать веселым кодом-гольфом.
Взяв строку слов, пароль генерируется так:
- Выберите n-й символ в n-м слове
- Если n больше, чем слово, продолжайте считать в обратном направлении
Пример:
This is a fun task!
T s a u !
T - первый символ,
s - второй,
а - первый, но если идти вперед и назад, он также является третьим,
u - вторым, но из-за обратного отсчета это также четвертое
'!' является пятым персонажем в «задании!» и, таким образом, будет включен в окончательный пароль,Tsau!
правила
- На входе будет строка
- Разделяйте строку пробелами, все остальные символы должны быть включены
- Прописные буквы должны оставаться в верхнем регистре, то же самое с строчными
- Вы делаете n шагов в каждом слове, где n - количество слов, которые предшествовали плюс один
- Если n больше, чем слово, вы должны шагнуть назад через слово, если вы нажмете начало, вы идете вперед, пока не пройдете n раз
- Первый и последний символы вводятся только один раз, поэтому в качестве примера «веселье» на седьмой позиции идет «funufun» и заканчивается на n, а не «funnuff» и заканчивается на f
- Выход должен быть строкой
Примеры:
Input Output
Once Upon A Time OpAe
There was a man Taaa
Who made a task Waak
That was neat! Taa
This is a long string to display how the generator is supposed to work Tsagnoyotoipto
Самый короткий код в байтах побеждает!
to
12-е слово (0-индексированное) в длинной строке, и поэтому буква кода должна бытьt
, а неo
.Tsau!
это китайский дляFuck!
Ответы:
Python 2 , 72 байта
Попробуйте онлайн!
источник
05AB1E , 11 байт
Попробуйте онлайн!
объяснение
источник
Желе , 12 байт
Попробуйте онлайн!
источник
Java 10,
148117114110 байт-31 байт благодаря @SamYonnou , создав порт ответа JavaScript @ user71546 .
-4 байта, спасибо @SamYonnou снова, оптимизируя алгоритм для Java.
Попробуйте онлайн.
Объяснение:
источник
s->{int i=-1,j;for(var a:s.split(" ")){System.out.print(a.charAt(++i>(j=a.length()-1)?j>0?i/j%2==0?i%j:j-i%j:0:i));}}
==0
на<1
.++i>(j=a.length()-1)
условия, так как математика работает одинаково, независимо от результата этого условия:s->{int i=-1,j;for(var a:s.split(" "))System.out.print(a.charAt(0<(j=a.length()+i-++i)?i/j%2<1?i%j:j-i%j:0));}
0<(j=a.length()+i-++i)?
это,(j=a.length()-1)>0*i++?
поэтому объяснение было немного легче набрать (однако при этом не было сохранено ни одного байта).Древесный уголь , 16 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Я не часто использую последний параметр Slice.
источник
JavaScript (Node.js) ,
78706968 байт-1 байт @Arnauld
Попробуйте онлайн!
объяснение
источник
Красный , 135 байт
Попробуйте онлайн!
Удобочитаемый:
источник
Perl 5 , 76 байт
Попробуйте онлайн!
источник
k ,
313028 байтПопробуйте онлайн!
источник
|-1_
->1_|
Pyth , 12 байт
Попробуйте онлайн
источник
Japt
-P
, 11 байтПопытайся
Попытайся
Пояснения
источник
C (gcc) , 148 байтов (строковая версия), 114 байтов (печатная версия)
Если я должен вернуть строку (длинная версия):
Попробуйте онлайн!
В противном случае я просто печатаю и не беспокоюсь о буфере (короткая версия):
Попробуйте онлайн!
источник
-(j>1)-1
можно заменить на+~(j>1)
1 байт меньше, я думаю.putchar( t[ j=strlen(t)-1, k = i++ % (j ? j*2 : 1), k<j ? k : j+j-k ]);
попробуйте онлайн!*u++
наc[i]
и удалить.AWK, 79 байт
Главным образом потому, что мне любопытно увидеть какие-нибудь лучшие решения awk или bash!
Попробуйте онлайн!
источник
C # (.NET Core) , 111 байт
Попробуйте онлайн!
источник
Haskell,
656261 байтПопробуйте онлайн!
Требуется последняя версия,
Prelude
которая имеет<>
функцию.Изменить: -3 байта благодаря @ user28667, -1 байт благодаря @B. Мехта
источник
zipWith(\i w->(cycle$id<>reverse.drop 1.init$w)!!i)[0..].words
тоже работает.\i->(!!i).cycle.(id<>reverse.drop 1.init)
фактическоеw
упоминание (TIO)Stax , 9 байт
Запустите и отладьте его
Распакованный, размазанный и прокомментированный, это выглядит так.
Запустите этот
источник
PHP , 77 байт
Попробуйте онлайн!
источник
foreach(...){$c=...;echo$c[...];}
наforeach(...)echo($c=...)[...];
. Попробуйте онлайн: 87 байтов.=
сохранения двух байтов:while(ord($w=$argv[++$i]))echo($w.=strrev(substr($w,1,-1)))[~-$i%strlen($w)];
попробуйте онлайнPowershell
208186170 байтUngolfed:
Тестовые случаи ниже или попробуйте онлайн
источник
""|%{
с$args|%{
, но я думаю , что вы можете играть в гольф это более эффективно тоже;)J, 43 байта
ungolfed
<;._1 ' '&,
разделить на пробелы(, }.@}:)&.>
за каждое слово убей первого и последнего вяза и добавь к слову#@> | i.@#
взять остаток от длины каждого слова, разделенный на его индекс> {~"_1
возьми этот результат и вырви его из каждого слова.Попробуйте онлайн!
источник