Сделать программу Ceeeeeeee


95

Однажды я написал программу на 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

Он держит первый символ и все es. Все остальные персонажи удаляются по одному.

Ваша задача - написать программу (или функцию), которая принимает два входа и выдает (или возвращает) строку, которая выполняет этот эффект.

Характеристики

  • Вы можете предположить, что строка не будет содержать никаких новых строк.
  • Вторым вводом всегда будет один символ.
  • Если ответ в форме функции, вы можете вернуть массив строк, содержащий каждую строку в выводе.
  • Вывод может содержать завершающий перевод строки.

Тестовые случаи

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

Это , поэтому выигрывает самый короткий код (в байтах).


27
Вроде случайно, но +1
TuxCrafting

25
+1 дляMeeeeeeeeegram
FlipTack

В случае, если он возвращает массив, каждый из элементов должен включать завершающий перевод строки?
Брэд Гилберт b2gills

@ BradGilbertb2gills Нет.
Esolanging Fruit

4
Meeeeeeeeeeeeem
Mathime

Ответы:


5

V , 12 байт

òYpó.“„a]òd

Попробуйте онлайн!

HexDump:

00000000: f259 70f3 2e93 8412 615d f264            .Yp.....a].d

Я проверил это с последней версией V, доступной перед испытанием , и все работает правильно, поэтому этот ответ конкурирует.

Объяснение:

ò         ò    " Recursively:
 Yp            "   Duplicate this line
   ó           "   Remove:
    .a]      "     A compressed regex
            d  " Delete our extra line

Сжатый регулярное выражение переводится как

.\zs[^e]

Что значит

.           " Any character
 \zs        " Leave the previous character out of the selection
    [^e]    " Any character except for 'e' (Or whatever is given for input)

Неконкурентная версия (11 байт)

Эта версия использует ярлык, Ypкоторый не был доступен, когда был опубликован этот вызов.


@ Challenger5 Отлично! Я проверю старую версию и проверю, что она работает правильно. Возможно, мне придется немного изменить его. Я буду пинговать тебя, как только обновлюсь.
DJMcMayhem

@ Challenger5 Я отредактировал ответ и убедился, что эта версия работала, когда было опубликовано задание.
DJMcMayhem

Как бы я выполнил кучу команд Vim, хранящихся в файле в системе Linux? Буду ли я cat filename | vimили я бы сделал что-то еще?
ckjbgames

31

Vim, 27, 26 , 25 байтов

DJqqYp:s/.\zs[^<C-r>-]<CR>@qq@qD

Попробуйте онлайн!

Вход поступает в следующем формате:

e
codegolf.stackexchange.com

Мой наивный первый подход на три байта длиннее:

i:s/.\zs[^<Right>]<Esc>"addqqYp@a@qq@qdd

Я также доволен этим ответом, потому что он начинается с моего имени.

DJqq:t$|s/.\zs[^<C-r>"]<CR>@qq@qD
DJMcMayhem

Видите сходство? А?

Менее успешные подходы:

i:s/.\zs[^<Right>]<Esc>"addqqYp@a@qq@qdd
i:s/.\zs[^<Right>]<CR>@q<Esc>"adkqqYp@aq@qdd
DJ:s/.\zs[^<C-r>"]<CR>uqqYp@:@qq@qdd
DJqq:t.|$s/.\zs[^<C-r>"]<CR>@qq@qdd

Объяснение:

D                                   " Delete everything on this first line
 J                                  " Remove this empty line
  qq                                " Start recording into register 'q'
    Y                               " Yank this line
     p                              " And paste it
      :s/                           " Run a substitute command on the last line in the buffer. Remove:
         .                          "   Any character
          \zs                       "   Move the selection forward (so we don't delete the first one)
             [^<C-r>-]              "   Followed by anything *except* for the character we deleted
                      <CR>          " Run the command
                          @q        " Call register 'q'
                            q       " Stop recording
                             @q     " Run the recursive macro
                               D    " Delete our extra line

1
Я думаю, что вы получили опечатку там, где вводится kслишком много :)
geisterfurz007

@ geisterfurz007 Я не уверен, что понял, что ты имеешь в виду?
DJMcMayhem

(...)comkВ строке 5 написано в настоящее время.
geisterfurz007

Там нет причин, чтобы использовать :tздесь. Нормальный Ypбы сохранить байт. Вам придется переключиться на <C-R>-конечно. Типичные правила PPCG разочаровывают, потому что для любого разумного контрольного примера, :t.|sс 99@:или даже 999@:было бы правильно, но нет хорошего способа получить бесконечное повторение таким способом. Вы вынуждены использовать менее интересные страты.
udioica

22

MATL , 20 16 байтов

y-f1X-"t[]@X@q-(

Попробуйте онлайн! Или проверьте контрольные примеры: 1 , 2 , 3 , 4 , 5 .

бонус

Измененный код, чтобы видеть, как строка постепенно сокращается (автономный компилятор):

y-f1X-"tt.3Y.XxD[]@X@q-(].3Y.XxDvx

введите описание изображения здесь

Или попробуйте в MATL Online!

объяснение

y        % Implicitly input string and char. Duplicate string onto top
-        % Subtract. Gives nonzero for chars in the input string that are
         % different from the input char
f        % Array of indices of nonzero values
1X-      % Remove 1 from that array. This gives an array of the indices of 
         % chars to be removed from the string
"        % For each
  t      %   Duplicate previous string
  []     %   Push empty array
  @      %   Push index of char to be removed. But this index needs to be 
         %   corrected to account for the fact that previous chars have
         %   already been removed...
  X@q-   %   ... So we correct by subtracting the 0-based iteration index
  (      %   Assign empty array to that position, to remove that char
         % Implicitly end for each
         % Implicitly display

3
GIFS! гифки это круто!
Brain Guider

20

Haskell, 50 байтов

w@(a:x)%c|(d,_:y)<-span(==c)x=w:(a:d++y)%c|0<1=[w]

Определяет функцию (%) возвращающую список строк.

объяснение

(%)вызывается как w%cс wвходной строкой и cсохраняемым символом. Короче говоря, это определение работает путем разделения wна первый символ ( a) и остаток ( x), разделения xна первое вхождение символа, отличного от c, и рекурсивного вызова самого себя с этим одним пропущенным символом.

w@(a:x)%c              -- define (%) with w separated into a and x.
 |(d,_:y)<-span(==c)x  -- split x; bind the string of `c` to d, and the rest
                       -- to _:y, dropping first character and calling the rest y.
  =w:(a:d++y)%c        -- if there was a character to drop, cons w onto the
                       -- sequence gained by recursively calling (%) with that
                       -- character removed (i.e. call with a:d++y).
 |0<1=[w]              -- if nothing needed to be dropped, the result sequence is
                       -- simply the one-element list [w]

3
Можете ли вы объяснить код?
Бли

1
@bli Готово! Надеюсь, это поможет?
Диана

14

Retina , 28 27 байт

Число байтов предполагает кодировку ISO 8859-1.

;{G*1`
R1r`(?!^|.*¶?\1$)(.)

Попробуйте онлайн!

объяснение

;{G*1`

Здесь много настроек. Сама сцена действительно просто G1`, которая сохраняет только первую строку, отбрасывая вводимый символ. *превращает его в пробный прогон, что означает, что результат (т. е. первая строка строки) печатается без фактического изменения строки. {говорит Retina запустить оба этапа в цикле до тех пор, пока строка не перестанет изменяться и ;не будет выводиться в конце программы.

R1r`(?!^|.*¶?\1$)(.)

Это отбрасывает первый символ, который а) не находится в начале ввода, б) не равен отдельному входному символу.


10

Пип , 22 26 24 22 байта

Lv+#Paa@oQb?++oPaRA:ox

Принимает строку как первый аргумент командной строки, символ как второй. Попробуйте онлайн!

объяснение

Зацикливание на символах ввода; если персонаж равен специальному персонажу, переходите к следующему; если нет, удалите его и напечатайте строку.

Ungolfed версия ( a, bполучить CmdLine арг, oначинается со значением 1, xявляется ""):

P a         Print a
L #a-1      Loop len(a)-1 times:
 I a@o Q b   If a[o] string-eQuals b:
  ++o         Increment o
 E {         Else:
  a RA: o x   In-place in a, Replace char At index o with x (i.e. delete it)
  P a         Print a
 }

Трюки с гольфом:

  • Заголовок цикла для Lвычисляется только один раз, поэтому мы можем прокрутить начальную печать туда. #Pa-1не будет работать, потому что Pимеет низкий приоритет (он будет разбираться как #P(a-1)), но мы можем изменить его v+#Pa, используя vпеременную, предварительно инициализированную для-1 .
  • RA:Оператор возвращает новое значение a, поэтому мы можем напечатать это выражение вместо того , чтобы отдельноPa заявление.
  • Теперь обе ветви оператора if являются единичными выражениями, поэтому мы можем использовать ?вместо них троичный оператор .

10

Perl 5, 29 байт

Я получил 35 байт, используя Strawberry Perl: 31 байт, плюс 1 -nEвместо -e, плюс 3 для пробела + -i(используется для однобуквенного ввода; более длинная строка из STDIN).

chomp;say;s/(.)[^$^I]/$1/&&redo

Тем не менее, я не сомневаюсь, что это выполнимо без chomp;использования <<<, которое составляет 29 байт, хотя я сам не могу проверить это с помощью Strawberry.

say;s/(.)[^$^I]/$1/&&redo

Таким образом:

perl -im -nE'say;s/(.)[^$^I]/$1/&&redo' <<< "example"

Вы можете просто указать «нет новой строки во вводе» (так работает вторая программа). Если вам крайне необходимо удалить символы новой строки во входных данных, посмотрите на -lпараметр, который включает режим автоматической обработки новой строки, в котором printпечатается дополнительная новая строка (здесь не имеет значения), а -p/ -ninput удаляет новую строку (очень важно). Кроме того, это устарело, но я думаю, что вы можете заменить ^Iбуквальный контроль-I для дополнительного байта экономии. Наконец, я думаю, что s/.\K[^$^I]/redo/eбыл бы на один символ короче, хотя я не уверен на 100%, что это законное место для размещения redo.

@ ais523, спасибо за совет по новой строке, но, думаю, я уже достаточно хорошо справился с этой проблемой. В буквальном смысле ^I, это верно для большинства переменных контрольной буквы, но не для этой, IIRC. Re \Kи положить redoв замену /e, спасибо! Я проверю это, когда у меня будет возможность ...
msh210

... и это не работает. @ ais523
msh210

8

Perl 6 ,  47 40  38 байт

->\a,\b{a,{S/^(."{b}"*:)./$0/}...^{$^a eq $^b}}
->\a,\b{a,{S/^(."{b}"*:)./$0/}...^&[eq]}
{$^b;$^a,{S/^(."$b"*:)./$0/}...^&[eq]}

Expanded:

{       # lambda with two placeholder parameters 「$a」 and 「$b」

  $^b;    # declare second parameter

  $^a,    # declare first parameter, and use it to seed the sequence

  {       # bare block lambda with implicit parameter 「$_」
    S/      # string replace and return
      ^       # beginning of string
      (       # capture into 「$0」
        .       # the first character
        "$b"*   # as many 「$b」 as possible
        :       # don't allow backtracking
      )
      .       # any character ( the one to be removed )

    /$0/      # put the captured values back into place
  }

  ...^      # repeat that until: ( and throw away the last value )

  &[eq]     # the infix string equivalence operator/subroutine

}

Причина ...^была в ...том, что вместо того , чтобы повторить последнее значение, &[eq]не будет возвращено True.


7

05AB1E ,26 25 байт

¬ˆ[¦Ðg_#¬²k0Qi²ˆë¯J?,]¯J?

¬ˆ                         Put the first character into an array
  [                        While true
   ¦                       Remove the first character
    Ð                      Triplicate
     g_#                   if the string is empty, break
        ¬²k0Qi             if the first character is equal to the one specified in the input
              ²ˆ           Add it to the array
                ë          Else
                 ¯J?       Display the array
                    ,      Display the remaining string
                     ]     End while
                      ¯J?  Display the last string

Попробуйте онлайн!

Обратите внимание, что это ¬²k0Qможно переписать ¬²Q, но по какой-то причине он не работает, когда текущий символ является кавычкой: Q возвращает фактическую строку вместо логического значения и вызывает бесконечный цикл.

Этот код может быть дополнен, так ¯J?как он дублируется. Перемещение этой части в цикле устранит дублирование, а также позволит опустить закрывающую квадратную скобку.


DˆćUΔD²KRнõ.;DXìˆ}¯¨»для 21, но это использует новые команды.
Волшебная Урна Осьминога

7

Python 2, 71 66 байт:

f,m=input();k=f[0]
while f:a=f[0]==m;k+=f[0]*a;f=f[1+a:];print k+f

Полная программа. Принимает 2 входа через STDIN в формате '<String>','<Char>'.

Кроме того, вот рекурсивное решение в настоящее время в 140 байтов :

Q=lambda c,p,k='',j=1,l=[]:c and Q(c[1:],p,k+c[0]*(j<2)+c[0]*(c[0]==p),j+1,l+[k+c])or'\n'.join(sorted({*l},key=l.index))+('\n'+k)*(k not in l)

Этот должен называться в формате print(Q('<String>','<Char>')).


Я не любитель питонов, но разве это не должно печатать только одну строку?
Конор О'Брайен

@ ConorO'Brien Да, я неправильно прочитал пост раньше. Это сейчас исправлено.
Р. Кап

7

Python 3 , 72 байта

def e(i,k):
 for r in i:
  if r!=k:i=i[0]+i[1:].replace(r,'',1);print(i)

Попробуйте онлайн!

e('😋🥕🍎🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆','🥓')

Сесть на диету:

😋🥕🍎🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🍎🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🥓🥔🍅🍄🍆
😋🥓🥓🥓🥓🍅🍄🍆
😋🥓🥓🥓🥓🍄🍆
😋🥓🥓🥓🥓🍆
😋🥓🥓🥓🥓

6

JavaScript (ES6), 74 байта

(s,c)=>[...t=s.slice(1)].map(d=>c!=d?s+=`
`+s[0]+(t=t.replace(d,``)):s)&&s

Я думаю, что это производит неправильный вывод для f('test cases', 's')(заканчивая stss, а не tsss). Я думаю, что это потому, что replaceудаляет первое вхождение, поэтому оно удаляет первое, tа не второе tв четвертой итерации mapцикла.
Lmis

@Lmis Спасибо за указание на это, я думаю, что я смог исправить одну из своих версий за «только» 7-байтовое наказание.
Нил

5

Рубин, 148 139 97 90 83 77 62 байта

a,c=$*;p s=""+a;i=1;while d=s[i];(d!=c)?(s[i]="";p s):i+=1;end

Не уверен, что на этом обмене будет принят любительский код, но я заинтересован в том, чтобы научиться кодировать гольф, хотя я ужасно в этом разбираюсь, какая-нибудь помощь в том, как бы эта программа выглядела такой же маленькой, как и другие?

РЕДАКТИРОВАТЬ:

Заменяет путы на 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;огромным прогрессом!


Добро пожаловать на сайт! Я не специалист по гольфу в Ruby, но, похоже, у вас есть лишние пробелы. Особенно вокруг =с. Для получения более полных советов вы можете посетить нашу страницу советов .
Пшеничный Волшебник

Например, самый простой способ удалить байты - это удалить лишние пробелы s=gets.chomp. Я не уверен, что вы можете сделать это в Ruby, но в некоторых языках, таких как Python, вы можете объединить несколько назначений в один оператор, например a,b,c=0,1,2.
Esolanging Fruit

Привет, спасибо за совет о пробелах, прочитайте документацию по ruby, и реализованные точки с запятой могут заменить их для конечных операторов: ') как для создания s = gets.chop и c = gets.chop, я не могу сделать s, c = gets.chop или что-нибудь еще к сожалению, это определенно самая большая часть кода, и я хотел бы удалить это длинное утверждение ..
Бен Хили

У вас все еще есть лишние пробелы, особенно перед ключевыми словами ( do, thenи end) и около четвертого =.
Пшеничный Волшебник

Похоже, что вы мало меняете количество байтов. Я считаю только 90 байтов сам.
Пшеничный Волшебник

4

c90, 129 125 байт

с пробелами:

main(q, x)
{
    for (char **v = x, *a = v[1], *b = a, *c;*b++;)
        for (c = a; c == a | *c == *v[2] && *b != *v[2] && putchar(*c),
            ++c != b || *b != *v[2] && !puts(b););
}

без пробелов:

main(q,x){for(char**v=x,*a=v[1],*b=a,*c;*b++;)for(c=a;c==a|*c==*v[2]&&*b!=*v[2]&&putchar(*c),++c!=b||*b!=*v[2]&&!puts(b););}

ungolfed:

#include <stdio.h>
int main(int argc, char **argv)
{
    char *a = argv[1];
    for (char *b = a + 1; *b; b++) {
        if (*b == *argv[2]) {
            continue;
        }
        putchar(*a);
        for (char *c = a + 1; c != b; c++) {
            if (*c == *argv[2]) {
                putchar(*c);
            }
        }
        puts(b);
    }
}

Это берет указатель на начало строки и выполняет цикл, повторяя этот указатель, пока не достигнет конца строки. Внутри цикла он печатает первый символ, а затем любые экземпляры второго аргумента, найденные между началом строки и указателем. После этого он вызывает указатель и выводит остаток строки.

Это должно быть скомпилировано в системе, где sizeof (int) == sizeof (char *). +3 байта в противном случае.

Это первый раз, когда я пробовал играть в гольф в коде, поэтому я уверен, что нужно сделать некоторые оптимизации.


3

Дьялог АПЛ , 27 байт

{×i←⊃1+⍸⍺≠1↓⎕←⍵:⍺∇⍵/⍨i≠⍳≢⍵}

это исключенный символ, является исходной строкой

аргумент печати; найти индекс iпервого не после первого символа; если найдено, вызовите рекурсивно с iудаленным


3

Mathematica, 64 байта

Most@FixedPointList[StringReplace[#,b_~~Except@a:>b,1]&,a=#2;#]&

Анонимная функция. Принимает две строки в качестве входных данных и возвращает список строк в качестве выходных данных. Работает путем многократного удаления первого неэкземпляра персонажа.


Я определенно собираюсь начать использовать FixedPointList.
ngenisis

3

PHP, 88 84 86 85 82 81 78 байт

1 байт сохранен благодаря @IsmaelMiguel, 3 байт благодаря @ user59178, 3 байта вдохновлен @ user59178

while($b=substr("$argv[1]\n",$i++))$a>""&$b[0]!=$argv[2]?print$a.$b:$a.=$b[0];

принимает входные данные из аргументов командной строки; бежать сphp -r <code> '<string>' <character>


  • добавляет новую строку к вводу для неявной окончательной печати.
    Это добавляет 5 4 байта кода, но экономит на выходе и дополнительный echo$a;.

1
$argv[1]."\n"можно записать как"$argv[1]\n"
Исмаэль Мигель

1
Когда $bк нему добавляется символ новой строки, он всегда будет правдивым, если он имеет длину> = 1. Как таковой, он ""<не нужен.
user59178

Вы можете сохранить другой байт, используя троицу substr()вместо назначения $b.
user59178 21.11.16

@ user59178 Я действительно не поймал тебя там: мне нужен substrрезультат как для условия, так и для print; поэтому я должен назначить это где-нибудь. Но Ты вдохновил меня.
Тит

Я имел в виду, for(;$b=substr($b?:".$argv[1]\n",1);)но то, что у вас сейчас, еще лучше.
user59178 21.11.16

3

05AB1E, 26 24 23 байта

Спасибо @Kade за 2 байта!
Спасибо @Emigna за 1 байт!

¬UDvy²k0Êiy¡¬s¦yý«Xs«=¦

Использует кодировку CP-1252 . Попробуйте онлайн!

y²k0Ê может быть y²Ê но все "портит.

Это, вероятно, может быть больше в гольфе, потому что «повторяется дважды. Пожалуйста, оставьте комментарий, если у вас есть какие-либо предложения или способы улучшить его.


3

Ява 10, 155 140 139 124 байта

c->s->{var r=s+"\n";for(int i=0;++i<s.length();)if(s.charAt(i)!=c)r+=(s=s.substring(0,i)+s.substring(i--+1))+"\n";return r;}

Попробуйте онлайн.

Объяснение:

c->s->{          // Method with character and String parameters and String return-type
  var r=s+"\n";  //  Result-String, starting at the input-String with trailing new-line
  for(int i=0;++i<s.length();)
                 //  Loop over the characters of the String, skipping the first
    if(s.charAt(i)!=c)
                 //   If the current character and the input-character are equal
      r+=(s=s.substring(0,i)+s.substring(i--+1))
                 //     Remove this character from the String `s`
         +"\n";  //     And append the new `s` with trailing new-line to the result-String
  return r;}     //  Return the result-String

Старый 139 байт рекурсивный ответ:

void c(String s,int c){System.out.println(s);for(int i=1;i<s.length();)if(s.charAt(i++)!=c){c(s.substring(0,i-1)+s.substring(i),c);break;}}

-1 байт благодаря @Eugene . (В следующий раз сделайте комментарий, а не редактируйте чужой пост, пожалуйста.)

Попробуйте онлайн.

Объяснение:

void c(String s,int c){     // Method with String and integer parameters and no return-type
  System.out.println(s);    //  Print the input-String with trailing new-line
  for(int i=1;i<s.length();)//  Loop over the characters of the String, skipping the first
    if(s.charAt(i++)!=c){   //   If the current character and the input-character are equal
      c(s.substring(0,i-1)+s.substring(i),c); 
                            //    Remove this character, and do a recursive call
      break;}}              //    And stop the loop

Не будет ли намного короче не беспокоиться о char [], а просто использовать s.charAt ()?
dpa97

@ dpa97 Ах, ты совершенно прав. Сначала я использовал цикл foreach, но изменил его на обычный цикл for. Забыл удалить char-массив. Благодарю.
Кевин Круйссен

2

C #, 122 117 112 байт

IEnumerable F(string s,char c){for(int i=0;i<s.Length;++i)if(i<1||s[i]!=c)yield return i>0?s=s.Remove(i--,1):s;}

Ungolfed:

public IEnumerable F(string s, char c) {
    for (int i = 0; i < s.Length; ++i) {
        if (i < 1 || s[i] != c)
            yield return i > 0 ? s = s.Remove(i--, 1) : s;
    }
}

Возвращает коллекцию строк.


1
Хороший трюк с использованием не универсальной коллекции. Но это не сработает, если последний символ не является специальным символом c. В этом случае цикл будет пытаться работать вечно.
Paldir

1
@paldir Woops, ты прав! Обратив внимание на это время, нашел лучший (и короче!) Способ.
псих

Вы можете удалить круглые скобки цикла for, чтобы сохранить 2 байта.
PmanAce

@PmanAce Извините, что вы имеете в виду? Какая скобка?
псих

public IEnumerable F (string s, char c) {for (int i = 0; i <s.Length; ++ i), если (i <1 || s [i]! = c), привести к возврату i> 0? s = s.Удалить (i--, 1): s; }
PmanAce

2

TSQL, 127 байт (исключая определения переменных)

DECLARE @1 VARCHAR(100)='codegolf.stackexchange.com'
DECLARE @2 CHAR(1) = 'o'

DECLARE @ char=LEFT(@1,1)WHILE patindex('%[^'+@2+']%',@1)>0BEGIN SET @1=STUFF(@1,patindex('%[^'+@2+']%',@1),1,'')PRINT @+@1 END

отформатирован:

DECLARE @1 VARCHAR(100) = 'codegolf.stackexchange.com'
DECLARE @2 CHAR(1) = 'o'
DECLARE @ CHAR = LEFT(@1, 1)

WHILE patindex('%[^' + @2 + ']%', @1) > 0
BEGIN
    SET @1 = STUFF(@1, patindex('%[^' + @2 + ']%', @1), 1, '')

    PRINT @ + @1
END

Хорошее использование patindex, но alphabetпример кажется не совсем правильным, он показывает aaphabetвниз aaa. Также стоит упомянуть, что это следует запускать на сервере или в базе данных с сортировкой с учетом регистра, в противном случае upperCASEпример также завершится неудачно, отображаясь ueEв последней строке.
BradC

2

C #, 135 138 :( 137 байт

Golfed:

IEnumerable<string>F(string s,char c){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);}}

Ungolfed:

    IEnumerable<string> F(string s, char c)
    {
        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);
        }
    }

Функция возвращает коллекцию строк.

EDIT1: @psycho заметил, что алгоритм не был реализован должным образом.

EDIT2: создана переменная для s.Length. Один байт сохранен благодаря @TheLethalCoder.


1
Не будет работать, если входной символ присутствует более одного раза подряд. Пример: codeegolf eдал бы ceвместо cee.
псих

@psycho Я поменялся ifс ним, whileи это работает.
Paldir

Лучше ! Но это может быть короче. Я выложу свой собственный!
псих

1
Создайте переменную для 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);}}
TheLethalCoder

2

Python 2 - 65 73 байта

lambda s,c:[s[0]+c*s[1:i].count(c)+s[i+1:]for i in range(len(s))]

И 76-байтовое рекурсивное решение, потому что, несмотря на то, что оно длиннее первого, оно мне больше нравится:

f=lambda s,c,i=1:s[i:]and[[s]+f(s[:i]+s[i+1:],c,i),f(s,c,i+1)][s[i]==c]or[s]

2

Ракетка 194 байта

(let p((s s)(n 1)(t substring)(a string-append))(displayln s)(cond[(>= n(string-length s))""]
[(equal? c(string-ref s n))(p(a(t s 0 n)(t s n))(+ 1 n)t a)][else(p(a(t s 0 n)(t s(+ 1 n)))n t a)]))

Ungolfed:

(define (f s c)
  (let loop ((s s)
             (n 1))
    (displayln s)
    (cond
      [(>= n (string-length s))""]
      [(equal? c (string-ref s n))
       (loop (string-append (substring s 0 n) (substring s n))
             (add1 n))]
      [else
       (loop (string-append (substring s 0 n) (substring s (add1 n)))
             n)])))

Тестирование:

(f "Test cases" #\s)
(f "codegolf.stackexchange.com" #\e)

Выход:

Test cases
Tst cases
Tst cases
Ts cases
Tscases
Tsases
Tsses
Tsses
Tsss
Tsss
""
codegolf.stackexchange.com
cdegolf.stackexchange.com
cegolf.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
ceexchange.com
ceechange.com
ceehange.com
ceeange.com
ceenge.com
ceege.com
ceee.com
ceee.com
ceeecom
ceeeom
ceeem
ceee
""

2

JavaScript (ES6), 64 69

Возврат одной строки с символами новой строки

s=>c=>[...s].map((x,i,z)=>i&&x!=c&&(z[i]='',s+=`
`+z.join``))&&s

F=
s=>c=>[...s].map((x,i,z)=>i&&x!=c&&(z[i]='',s+=`
`+z.join``))&&s
  

function update() {
  var s=S.value,c=C.value[0]
  O.textContent=F(s)(c)
}

update()
<input id=S value='Hello world!' oninput='update()'>
<input id=C value='!' oninput='update()'>
<pre id=O></pre>


Немного странно, что он принимает не два аргумента, а один аргумент, а затем возвращает другую функцию, где вам нужно дать второй аргумент. Я не уверен, что это было ожидаемое поведение.
MT0

@ MT0 Я странный, но он принят для функции с 2 аргументами, так как сохраняет 1 байт. Я дам вам ссылку, когда найду такую. Вот это meta.codegolf.stackexchange.com/a/8427/21348
edc65

Отличная техника, я не осознавал, что изменение третьего аргумента .mapбыло кумулятивным. Я увидел .map().filter()и подумал «Это сделало бы понимание массивов большим!», Но отсутствие индекса в s=>c=>[for(x of(i=0,z=[...s]))if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
массивах понимало

1
Фактически, переставляя параметры, вы можете получить понимание массива до 66:([...z],c,i=0)=>[for(x of z)if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
ETHproductions

@ETHproductions не может поверить, что я снова ошибся в подсчете байтов . В любом случае, благодаря тому, что я снова подумал об этом, я получил 64 со стандартным ES6
edc65

2

Swift 3 - 151 147 байт

Swift не идеальный язык для игры в гольф, особенно когда это касается индексации строк. Это лучшее, что я мог сделать:

func c(a:String,b:String){print(a);var q=Array(a.characters),i=1;while i<q.count{if "\(q[i])" != b{q.remove(at:i);c(a:String(q),b:b);break};i=i+1}}

К сожалению, Swift нужны пробелы вокруг !=(но не для ==), и Swift 3 упал ++оператор. Хитрость для обоих заключается в том, чтобы преобразовать в массив символов, который позволяет целочисленную индексацию, и использовать строковую интерполяцию символа для преобразования обратно в String( "\(c)").

Ungolfed:

func c(a:String, b:String) {
    print(a)
    var q = Array(a.characters)
    var i = 1
    while i < q.count {
        if "\(q[i])" != b {
            q.remove(at:i)
            c(a: String(q), b: b)
            break
        }
        i=i+1
    }
}

Предыдущее нерекурсивное решение

func c(a:String,b:String){var q=Array(a.characters),e={q.removeFirst()},z="\(e())";print(a);while !q.isEmpty{"\(e())"==b ? z=z+b : print(z+String(q))}}
func c(a:String, b:String) {
    var q = Array(a.characters)
    var z = "\(q.removeFirst())"
    print(a)
    while !q.isEmpty {
        if "\(q.removeFirst())" == b {
            z = z + b
        }else{
            print(z + String(q))
        }
    }
}

Добро пожаловать в PPCG! Можно ли удалить некоторые пробелы в конце кода?
ETHproductions

@ETHproductions, к сожалению, нет, троичный оператор и whileнеобходимые места для компиляции. Я также играл с typealiasing Stringи пытался установить printзакрытие, но они не экономили место.
Rabidaudio


1

Mathematica, 78 байт

Блин ты, Мартин Эндер, я был почти первым: p

(i=2;a={c=#};While[i<=Length@c,If[c[[i]]==#2,i++,c=c~Drop~{i};a=a~Append~c]];a)&

Безымянная функция; прямая реализация с Whileциклом и несколькими временными переменными.


Да ладно, мы оба знаем, что Mathematica не обязательна
LegionMammal978

1
<машет белым флагом>
Грег Мартин

1

JavaScript ES6, 89 байт

Я думал, что это будет легко, но я уверен, что что-то здесь упущено ..

Использует рекурсию и возвращает массив строк

(c,i=1,r)=>f=a=>a[i]?a[i++]==c?f(a):f(g=a.slice(0,i-1)+a.slice(i--),(r=r||[a]).push(g)):r

F=
  (c,i=1,r)=>f=a=>a[i]?a[i++]==c?f(a):f(g=a.slice(0,i-1)+a.slice(i--),(r=r||[a]).push(g)):r

G=_=>A.value.length>1 && (O.innerHTML = F(E.value)(A.value).join`
`)

G()
<input id=A oninput='G()' value='alphabet'>
<input id=E oninput='G()' value='a'>
<pre id=O>


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.