Однажды я написал программу на JavaScript, которая будет принимать в качестве входных данных строку и символ и будет удалять все символы, кроме первого и символа, заданного в качестве входных данных, один за другим.
Например, вычисление этого с входными данными codegolf.stackexchange.com
и e
для символа дает:
codegolf.stackexchange.com
cdegolf.stackexchange.com
cegolf.stackexchange.com
ceolf.stackexchange.com
celf.stackexchange.com
cef.stackexchange.com
ce.stackexchange.com
cestackexchange.com
cetackexchange.com
ceackexchange.com
ceckexchange.com
cekexchange.com
ceexchange.com
ceechange.com
ceehange.com
ceeange.com
ceenge.com
ceege.com
ceee.com
ceeecom
ceeeom
ceeem
ceee
Он держит первый символ и все e
s. Все остальные персонажи удаляются по одному.
Ваша задача - написать программу (или функцию), которая принимает два входа и выдает (или возвращает) строку, которая выполняет этот эффект.
Характеристики
- Вы можете предположить, что строка не будет содержать никаких новых строк.
- Вторым вводом всегда будет один символ.
- Если ответ в форме функции, вы можете вернуть массив строк, содержащий каждую строку в выводе.
- Вывод может содержать завершающий перевод строки.
Тестовые случаи
Test Cases
, s
:
Test Cases
Tst Cases
Ts Cases
TsCases
Tsases
Tsses
Tsss
Make a "Ceeeeeeee" program
, e
:
Make a "Ceeeeeeee" program
Mke a "Ceeeeeeee" program
Me a "Ceeeeeeee" program
Mea "Ceeeeeeee" program
Me "Ceeeeeeee" program
Me"Ceeeeeeee" program
MeCeeeeeeee" program
Meeeeeeeee" program
Meeeeeeeee program
Meeeeeeeeeprogram
Meeeeeeeeerogram
Meeeeeeeeeogram
Meeeeeeeeegram
Meeeeeeeeeram
Meeeeeeeeeam
Meeeeeeeeem
Meeeeeeeee
Hello World!
, !
:
Hello World!
Hllo World!
Hlo World!
Ho World!
H World!
HWorld!
Horld!
Hrld!
Hld!
Hd!
H!
Hello World!
, z
:
Hello World!
Hllo World!
Hlo World!
Ho World!
H World!
HWorld!
Horld!
Hrld!
Hld!
Hd!
H!
H
alphabet
, a
:
alphabet
aphabet
ahabet
aabet
aaet
aat
aa
upperCASE
, e
:
upperCASE
uperCASE
uerCASE
ueCASE
ueASE
ueSE
ueE
ue
Это код-гольф , поэтому выигрывает самый короткий код (в байтах).
Meeeeeeeeegram
Ответы:
V , 12 байт
Попробуйте онлайн!
HexDump:
Я проверил это с последней версией V, доступной перед испытанием , и все работает правильно, поэтому этот ответ конкурирует.
Объяснение:
Сжатый регулярное выражение переводится как
Что значит
Неконкурентная версия (11 байт)
Эта версия использует ярлык,
Yp
который не был доступен, когда был опубликован этот вызов.источник
cat filename | vim
или я бы сделал что-то еще?Vim,
27, 26, 25 байтовПопробуйте онлайн!
Вход поступает в следующем формате:
Мой наивный первый подход на три байта длиннее:
Я также доволен этим ответом, потому что он начинается с моего имени.
Видите сходство? А?
Менее успешные подходы:
Объяснение:
источник
k
слишком много :)(...)comk
В строке 5 написано в настоящее время.:t
здесь. НормальныйYp
бы сохранить байт. Вам придется переключиться на<C-R>-
конечно. Типичные правила PPCG разочаровывают, потому что для любого разумного контрольного примера,:t.|s
с99@:
или даже999@:
было бы правильно, но нет хорошего способа получить бесконечное повторение таким способом. Вы вынуждены использовать менее интересные страты.MATL ,
2016 байтовПопробуйте онлайн! Или проверьте контрольные примеры: 1 , 2 , 3 , 4 , 5 .
бонус
Измененный код, чтобы видеть, как строка постепенно сокращается (автономный компилятор):
Или попробуйте в MATL Online!
объяснение
источник
Haskell, 50 байтов
Определяет функцию
(%)
возвращающую список строк.объяснение
(%)
вызывается какw%c
сw
входной строкой иc
сохраняемым символом. Короче говоря, это определение работает путем разделенияw
на первый символ (a
) и остаток (x
), разделенияx
на первое вхождение символа, отличного отc
, и рекурсивного вызова самого себя с этим одним пропущенным символом.источник
Retina ,
2827 байтЧисло байтов предполагает кодировку ISO 8859-1.
Попробуйте онлайн!
объяснение
Здесь много настроек. Сама сцена действительно просто
G1`
, которая сохраняет только первую строку, отбрасывая вводимый символ.*
превращает его в пробный прогон, что означает, что результат (т. е. первая строка строки) печатается без фактического изменения строки.{
говорит Retina запустить оба этапа в цикле до тех пор, пока строка не перестанет изменяться и;
не будет выводиться в конце программы.Это отбрасывает первый символ, который а) не находится в начале ввода, б) не равен отдельному входному символу.
источник
Пип ,
22262422 байтаПринимает строку как первый аргумент командной строки, символ как второй. Попробуйте онлайн!
объяснение
Зацикливание на символах ввода; если персонаж равен специальному персонажу, переходите к следующему; если нет, удалите его и напечатайте строку.
Ungolfed версия (
a
,b
получить CmdLine арг,o
начинается со значением1
,x
является""
):Трюки с гольфом:
L
вычисляется только один раз, поэтому мы можем прокрутить начальную печать туда.#Pa-1
не будет работать, потому чтоP
имеет низкий приоритет (он будет разбираться как#P(a-1)
), но мы можем изменить егоv+#Pa
, используяv
переменную, предварительно инициализированную для-1
.RA:
Оператор возвращает новое значениеa
, поэтому мы можем напечатать это выражение вместо того , чтобы отдельноPa
заявление.?
вместо них троичный оператор .источник
Perl 5, 29 байт
Я получил 35 байт, используя Strawberry Perl: 31 байт, плюс 1
-nE
вместо-e
, плюс 3 для пробела +-i
(используется для однобуквенного ввода; более длинная строка из STDIN).Тем не менее, я не сомневаюсь, что это выполнимо без
chomp;
использования<<<
, которое составляет 29 байт, хотя я сам не могу проверить это с помощью Strawberry.Таким образом:
источник
-l
параметр, который включает режим автоматической обработки новой строки, в которомprint
печатается дополнительная новая строка (здесь не имеет значения), а-p
/-n
input удаляет новую строку (очень важно). Кроме того, это устарело, но я думаю, что вы можете заменить^I
буквальный контроль-I для дополнительного байта экономии. Наконец, я думаю, чтоs/.\K[^$^I]/redo/e
был бы на один символ короче, хотя я не уверен на 100%, что это законное место для размещенияredo
.^I
, это верно для большинства переменных контрольной буквы, но не для этой, IIRC. Re\K
и положитьredo
в замену/e
, спасибо! Я проверю это, когда у меня будет возможность ...Perl 6 ,
47 4038 байтExpanded:
Причина
...^
была в...
том, что вместо того , чтобы повторить последнее значение,&[eq]
не будет возвращеноTrue
.источник
05AB1E ,
2625 байтПопробуйте онлайн!
Обратите внимание, что это
¬²k0Q
можно переписать¬²Q
, но по какой-то причине он не работает, когда текущий символ является кавычкой: Q возвращает фактическую строку вместо логического значения и вызывает бесконечный цикл.Этот код может быть дополнен, так
¯J?
как он дублируется. Перемещение этой части в цикле устранит дублирование, а также позволит опустить закрывающую квадратную скобку.источник
DˆćUΔD²KRнõ.;DXìˆ}¯¨»
для 21, но это использует новые команды.Python 2,
7166 байт:Полная программа. Принимает 2 входа через STDIN в формате
'<String>','<Char>'
.Кроме того, вот рекурсивное решение в настоящее время в 140 байтов :
Этот должен называться в формате
print(Q('<String>','<Char>'))
.источник
Python 3 , 72 байта
Попробуйте онлайн!
Сесть на диету:
источник
JavaScript (ES6), 74 байта
источник
f('test cases', 's')
(заканчиваяstss
, а неtsss
). Я думаю, что это потому, чтоreplace
удаляет первое вхождение, поэтому оно удаляет первое,t
а не второеt
в четвертой итерацииmap
цикла.Рубин,
1481399790837762 байтаНе уверен, что на этом обмене будет принят любительский код, но я заинтересован в том, чтобы научиться кодировать гольф, хотя я ужасно в этом разбираюсь, какая-нибудь помощь в том, как бы эта программа выглядела такой же маленькой, как и другие?
РЕДАКТИРОВАТЬ:
Заменяет путы на p
Удалил тонну пробелов и правильно подсчитал байты благодаря Wheat Wizard
Благодаря challenger5 пошел от
s=gets.chop;c=gets.chop;
доs,c=gets.chop,gets.chop;
заменены
then
на;
иgets.chop
сgets[0]
благодарностью Mhutter!Взяв ввод в качестве переменных командной строки сейчас, например.
prog.rb helloworld l
Благодаря многочисленным улучшениям по jeroenvisser101 заменяющих
a=s.dup
сs=""+a
и предыдущее , если заявлениеif s[i]!=c;s[i]="";p s;else i+=1;end
с(d!=c)?(s[i]="";p s):i+=1;
огромным прогрессом!источник
=
с. Для получения более полных советов вы можете посетить нашу страницу советов .s=gets.chomp
. Я не уверен, что вы можете сделать это в Ruby, но в некоторых языках, таких как Python, вы можете объединить несколько назначений в один оператор, напримерa,b,c=0,1,2
.do
,then
иend
) и около четвертого=
.c90,
129125 байтс пробелами:
без пробелов:
ungolfed:
Это берет указатель на начало строки и выполняет цикл, повторяя этот указатель, пока не достигнет конца строки. Внутри цикла он печатает первый символ, а затем любые экземпляры второго аргумента, найденные между началом строки и указателем. После этого он вызывает указатель и выводит остаток строки.
Это должно быть скомпилировано в системе, где sizeof (int) == sizeof (char *). +3 байта в противном случае.
Это первый раз, когда я пробовал играть в гольф в коде, поэтому я уверен, что нужно сделать некоторые оптимизации.
источник
Дьялог АПЛ , 27 байт
{×i←⊃1+⍸⍺≠1↓⎕←⍵:⍺∇⍵/⍨i≠⍳≢⍵}
⍺
это исключенный символ,⍵
является исходной строкойаргумент печати; найти индекс
i
первого не⍺
после первого символа; если найдено, вызовите рекурсивно сi
удаленнымисточник
Mathematica, 64 байта
Анонимная функция. Принимает две строки в качестве входных данных и возвращает список строк в качестве выходных данных. Работает путем многократного удаления первого неэкземпляра персонажа.
источник
FixedPointList
.PHP,
88848685828178 байт1 байт сохранен благодаря @IsmaelMiguel, 3 байт благодаря @ user59178, 3 байта вдохновлен @ user59178
принимает входные данные из аргументов командной строки; бежать с
php -r <code> '<string>' <character>
Это добавляет
54 байта кода, но экономит на выходе и дополнительныйecho$a;
.источник
$argv[1]."\n"
можно записать как"$argv[1]\n"
$b
к нему добавляется символ новой строки, он всегда будет правдивым, если он имеет длину> = 1. Как таковой, он""<
не нужен.substr()
вместо назначения$b
.substr
результат как для условия, так и дляprint
; поэтому я должен назначить это где-нибудь. Но Ты вдохновил меня.for(;$b=substr($b?:".$argv[1]\n",1);)
но то, что у вас сейчас, еще лучше.05AB1E,
262423 байтаСпасибо @Kade за 2 байта!
Спасибо @Emigna за 1 байт!
Использует кодировку CP-1252 . Попробуйте онлайн!
y²k0Ê
может бытьy²Ê
но все"
портит.Это, вероятно, может быть больше в гольфе, потому что
«
повторяется дважды. Пожалуйста, оставьте комментарий, если у вас есть какие-либо предложения или способы улучшить его.источник
Ява 10,
155140139124 байтаПопробуйте онлайн.
Объяснение:
Старый 139 байт рекурсивный ответ:
-1 байт благодаря @Eugene . (В следующий раз сделайте комментарий, а не редактируйте чужой пост, пожалуйста.)
Попробуйте онлайн.
Объяснение:
источник
C #,
122117112 байтUngolfed:
Возвращает коллекцию строк.
источник
c
. В этом случае цикл будет пытаться работать вечно.TSQL, 127 байт (исключая определения переменных)
отформатирован:
источник
patindex
, ноalphabet
пример кажется не совсем правильным, он показываетaaphabet
внизaaa
. Также стоит упомянуть, что это следует запускать на сервере или в базе данных с сортировкой с учетом регистра, в противном случаеupperCASE
пример также завершится неудачно, отображаясьueE
в последней строке.C #,
135138 :(137 байтGolfed:
Ungolfed:
Функция возвращает коллекцию строк.
EDIT1: @psycho заметил, что алгоритм не был реализован должным образом.
EDIT2: создана переменная для
s.Length
. Один байт сохранен благодаря @TheLethalCoder.источник
codeegolf e
дал быce
вместоcee
.if
с ним,while
и это работает.s.Length
сохранения одного байта:int i=1,l;for(;;){yield return s;l=s.Length;while(i<l&&s[i]==c)i++;if(i>=l)break;s=s.Remove(i,1);}}
Python 2 -
6573 байтаИ 76-байтовое рекурсивное решение, потому что, несмотря на то, что оно длиннее первого, оно мне больше нравится:
источник
Ракетка 194 байта
Ungolfed:
Тестирование:
Выход:
источник
JavaScript (ES6), 64
69Возврат одной строки с символами новой строки
источник
.map
было кумулятивным. Я увидел.map().filter()
и подумал «Это сделало бы понимание массивов большим!», Но отсутствие индекса вs=>c=>[for(x of(i=0,z=[...s]))if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
([...z],c,i=0)=>[for(x of z)if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
Swift 3 -
151147 байтSwift не идеальный язык для игры в гольф, особенно когда это касается индексации строк. Это лучшее, что я мог сделать:
К сожалению, Swift нужны пробелы вокруг
!=
(но не для==
), и Swift 3 упал++
оператор. Хитрость для обоих заключается в том, чтобы преобразовать в массив символов, который позволяет целочисленную индексацию, и использовать строковую интерполяцию символа для преобразования обратно вString
("\(c)"
).Ungolfed:
Предыдущее нерекурсивное решение
источник
while
необходимые места для компиляции. Я также играл с typealiasingString
и пытался установитьprint
закрытие, но они не экономили место.Пайк,
261917 байтПопробуй это здесь!
источник
Mathematica, 78 байт
Блин ты, Мартин Эндер, я был почти первым: p
Безымянная функция; прямая реализация с
While
циклом и несколькими временными переменными.источник
JavaScript ES6, 89 байт
Я думал, что это будет легко, но я уверен, что что-то здесь упущено ..
Использует рекурсию и возвращает массив строк
источник
Groovy, 34 байта
источник