Складіть програму «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 No.
Esolanging Fruit

4
Meeeeeeeeeeeeeem
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 Я не впевнений, чи отримаю те, що ти маєш на увазі?
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

enter image description here

Або спробуйте в 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
ПОДАРУНКИ! gif класні!
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 Готово! Сподіваємось, це допомагає?
dianne

14

Сітківка , 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

Приймає рядок як аргумент першого командного рядка, а символ - як другий. Спробуйте в Інтернеті!

Пояснення

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

Нерозроблена версія ( 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 байт, хоча я не можу перевірити його самостійно, використовуючи Полуничний.

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

Таким чином:

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

Ви можете просто вказати "немає нового рядка на вході" (саме так працює друга програма). Якщо вам погано потрібно видалити нові рядки на вході, погляньте на -lпараметр, який вмикає автоматичний режим обробки нового рядка, в якому printдрукується додатковий новий рядок (тут не має значення) та -p/ -nвведення видаляє новий рядок (дуже актуально). Крім того, це застаріле, але я думаю, що ви можете замінити ^Iбуквальний контроль - я на додатковий байт економії. Нарешті, я думаю, s/.\K[^$^I]/redo/eщо на один символ коротше, хоча я не на 100% впевнений, що це законне місце redo.

@ ais523, дякую за пораду в новому рядку, але, мабуть, я вже досить добре впорався з проблемою. Повторно ^I, це справедливо для більшості змінних контрольних букв, але не для цього, IIRC. Знову \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]}

Розширено:

{       # 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>')).


Я не батон python, але чи не слід друкувати лише один рядок?
Conor O'Brien

@ 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 Дякую, що вказав на це, я думаю, мені вдалося виправити одну з моїх версій за "лише" 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

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

Редагувати:

Замінено ставить с

Видалено тонну пробілу та правильно підрахував байти завдяки майстру пшениці

Завдяки 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.
Esolanging Fruit

Ей, дякую за пораду про пробіл, прочитайте документацію на рубіні, і реалізовані крапки з комою можуть замінити їх на закінчення висловлювань: ') як для створення s = get.chop і c = get.chop я не можу робити, c = get.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););}

неозорений:

#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

Математика, 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. Оскільки таке ""<є непотрібним.
користувач59178

Ви можете зберегти інший байт, скориставшись тернаром, substr()а не призначаючи $b.
користувач59178

@ user59178 Я вас там дуже не зловив: мені потрібен substrрезультат як для стану, так і для print; тому я повинен кудись це призначити. Але ти мене надихнув.
Тит

Я мав на увазі, for(;$b=substr($b?:".$argv[1]\n",1);)але те, що у вас зараз, ще краще.
користувач59178

3

05AB1E, 26 24 23 байт

Дякую @Kade за 2 байти!
Дякую @Emigna за 1 байт!

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

Використовує кодування CP-1252 . Спробуйте в Інтернеті!

y²k0Êможе бути, y²Êале" заплутав це.

Це, ймовірно, може бути більше в гольф, тому що «повторюється двічі. Будь ласка, залиште коментар, якщо у вас є якісь пропозиції або способи пограти ще більше.


3

Java 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

Хіба не було б набагато коротше, щоб не зациклюватися на знаку [], а просто використовувати s.charAt ()?
dpa97

@ dpa97 Ах, ти абсолютно правий. Спочатку я використовував цикл foreach, але змінив його на звичайний for-loop. Забули видалити char-масив. Дякую.
Kevin Cruijssen

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;}

Безголовки:

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 IEsumerable F (string s, char c) {for (int i = 0; i <s.Length; ++ i) якщо (i <1 || s [i]! = c) повернення доходу i> 0? s = s.Remove (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 байт

Гольф:

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);}}

Безголовки:

    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

Пітон 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)]))

Безголовки:

(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 байт. Я дам вам посилання, коли знайду його. Ось це мета.codegolf.stackexchange.com
a/8427/

Чудова техніка, я не розумів, що модифікація третього аргументу .mapбула кумулятивною. Я побачив .map().filter()і подумав "Це дозволило б зрозуміти великий масив!", Але відсутність індексу в розумінні масиву вбило його, і він закінчився однаковою довжиною: s=>c=>[for(x of(i=0,z=[...s]))if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)](btw, я рахую 68 байт для всіх цих).
ETHproductions

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

Швидкий 3 - 151 147 байт

Свіфт не є ідеальною мовою для гри в гольф, особливо якщо це стосується індексації рядків. Це найкраще, що я міг зробити:

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)").

Безголовки:

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потрібні пробіли для компіляції. Я також грав з тиражуванням Stringі намагався завершити роботу print, але вони не економили місця.
rabidaudio


1

Математика, 78 байт

Блін ти Мартин Ендер, я був майже першим: с

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

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


О, давай, ми обидва знаємо, що Математика не обов'язкова
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.