Stwórz program „Ceeeeeeee”

95

Kiedyś napisałem program JavaScript, który pobierałby jako dane wejściowe ciąg znaków i znak i usuwałby wszystkie znaki z wyjątkiem pierwszego i znaku podanego jako dane wejściowe, jeden po drugim.

Na przykład obliczenie tego za pomocą danych wejściowych codegolf.stackexchange.comi epostaci daje:

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

Zachowuje pierwszą postać i wszystkie znaki e. Wszystkie pozostałe postacie są usuwane jeden po drugim.

Twoim zadaniem jest napisanie programu (lub funkcji), który pobiera dwa dane wejściowe i wyjściowe (lub zwraca) ciąg znaków, który osiąga ten efekt.

Dane techniczne

  • Możesz założyć, że ciąg nie będzie zawierał żadnych znaków nowej linii.
  • Drugim wejściem zawsze będzie jeden znak.
  • Jeśli odpowiedź ma postać funkcji, możesz zwrócić tablicę ciągów zawierających każdy wiersz wyniku.
  • Wynik może zawierać końcowy znak nowej linii.

Przypadki testowe

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

To jest , więc wygrywa najkrótszy kod (w bajtach).

Esolanging Fruit
źródło
27
Trochę losowo, ale +1
TuxCrafting
25
+1 zaMeeeeeeeeegram
FlipTack
W przypadku, gdy zwraca tablicę, czy każdy z elementów musi zawierać końcowy znak nowej linii?
Brad Gilbert b2gills,
@ BradGilbertb2gills No.
Esolanging Fruit
4
Meeeeeeeeeeeeem
Mathime,

Odpowiedzi:

5

V , 12 bajtów

òYpó.“„a]òd

Wypróbuj online!

Hexdump:

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

Przetestowałem to z najnowszą wersją V dostępną przed wyzwaniem i wszystko działa poprawnie, dzięki czemu ta odpowiedź jest konkurencyjna.

Wyjaśnienie:

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

Skompresowane wyrażenie regularne przekłada się na

.\zs[^e]

Co znaczy

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

Wersja niekonkurencyjna (11 bajtów)

Ta wersja używa skrótu, Ypktóry nie był dostępny, gdy opublikowano to wyzwanie.

DJMcMayhem
źródło
@ challengeer5 Awesome! Sprawdzę starą wersję i sprawdzę, czy działa poprawnie. Być może będę musiał go nieco zmodyfikować. Będę cię pingować, kiedy zaktualizuję.
DJMcMayhem
@ Challenger5 Zredagowałem odpowiedź i sprawdziłem, czy ta wersja działała w momencie opublikowania wyzwania.
DJMcMayhem
Jak mam wykonać kilka poleceń Vima przechowywanych w pliku w systemie Linux? Czy cat filename | vimzrobiłbym lub zrobiłbym coś innego?
ckjbgames
31

Vim, 27, 26 , 25 bajtów

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

Wypróbuj online!

Dane wejściowe są w tym formacie:

e
codegolf.stackexchange.com

Moje naiwne pierwsze podejście to trzy bajty dłużej:

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

Cieszę się również z tej odpowiedzi, ponieważ zaczyna się ona od mojego imienia.

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

Widzisz podobieństwo? Co?

Mniej skuteczne podejścia:

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

Wyjaśnienie:

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
DJMcMayhem
źródło
1
Myślę, że masz literówkę tam, gdzie podano dane wejściowe, jest ich kza dużo :)
geisterfurz007,
@ geisterfurz007 Nie jestem pewien, czy rozumiem, co masz na myśli?
DJMcMayhem
Mówi (...)comkobecnie w linii 5.
geisterfurz007
Nie ma powodu, aby używać :ttutaj. Normalny Ypzapisałby bajt. Oczywiście musisz przełączyć się <C-R>-na. Typowe reguły PPCG są frustrujące, ponieważ dla każdego rozsądnego przypadku testowego :t.|sz 99@:lub nawet 999@:byłoby poprawne, ale nie ma dobrego sposobu na uzyskanie nieskończonego powtarzania w ten sposób. Jesteś zmuszony używać mniej interesujących stratów.
udioica
22

MATL , 20 16 bajtów

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

Wypróbuj online! Lub sprawdź przypadki testowe: 1 , 2 , 3 , 4 , 5 .

Premia

Zmodyfikowany kod, aby stopniowo zmniejszać ciąg (kompilator offline):

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

enter image description here

Lub spróbuj w MATL Online!

Wyjaśnienie

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
Luis Mendo
źródło
3
GIFY! gify są fajne!
Brain Guider
20

Haskell, 50 bajtów

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

Definiuje funkcję (%)zwracającą listę ciągów.

Wyjaśnienie

(%)nazywa się as w%c, ponieważ wjest łańcuchem wejściowym i cznakiem, który należy zachować. W skrócie, ta definicja działa poprzez rozdzielenie wna pierwszy znak ( a) i resztę ( x), dzielenie xprzy pierwszym wystąpieniu znaku innego niż ci rekurencyjne wywoływanie się po upuszczeniu jednego znaku.

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]
Dianne
źródło
3
Czy potrafisz wyjaśnić kod?
bli
1
@bli Gotowe! Mam nadzieję, że to pomaga?
dianne
14

Retina , 28 27 bajtów

Liczba bajtów zakłada kodowanie ISO 8859-1.

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

Wypróbuj online!

Wyjaśnienie

;{G*1`

Tutaj jest dużo konfiguracji. Sam etap jest naprawdę sprawiedliwy G1`, który zachowuje tylko pierwszy wiersz, odrzucając znak wejściowy. *zamienia go w próbę suchą, co oznacza, że ​​wynik (tj. pierwsza linia łańcucha) jest drukowany bez faktycznej zmiany łańcucha. {mówi Retinie, aby uruchomiła oba etapy w pętli, dopóki łańcuch nie przestanie się zmieniać i ;uniemożliwi wyjście na końcu programu.

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

To odrzuca pierwszy znak, który a) nie jest na początku wejścia, b) nie jest równy oddzielnemu znakowi wejściowemu.

Martin Ender
źródło
10

Pip , 22 26 24 22 bajtów

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

Pobiera ciąg znaków jako pierwszy argument wiersza poleceń, znak jako drugi. Wypróbuj online!

Wyjaśnienie

Pętle nad znakami wejściowymi; jeśli postać jest równa postaci specjalnej, przejdź do następnej; jeśli nie, usuń go i wydrukuj ciąg.

Ungolfed wersja ( a, bdostać CmdLine args; orozpoczyna się od wartości 1, xjest ""):

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
 }

Sztuczki golfowe:

  • Nagłówek pętli dla Ljest oceniany tylko raz, więc możemy tam wkraść się do pierwszego wydruku. #Pa-1nie będzie działać, ponieważ Pma niski priorytet (parsowałby jako #P(a-1)), ale możemy zmienić jego kolejność v+#Pa, używając vzmiennej wstępnie zainicjowanej do -1.
  • RA:Operator zwraca nową wartość a, dzięki czemu możemy drukować że ekspresja zamiast oddzielnego Pakomunikatu.
  • Teraz obie gałęzie instrukcji if są pojedynczymi wyrażeniami, więc ?zamiast tego możemy użyć operatora trójskładnikowego .
DLosc
źródło
10

Perl 5, 29 bajtów

Mam 35 bajtów przy użyciu Strawberry Perl: 31 bajtów, plus 1 -nEzamiast -e, plus 3 dla spacji + -i(używane do wprowadzania pojedynczej litery; dłuższy ciąg pochodzi ze STDIN).

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

Jednak nie mam wątpliwości, że jest to wykonalne bez chomp;użycia <<<, który ma 29 bajtów, mimo że sam nie mogę go przetestować za pomocą Strawberry.

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

A zatem:

perl -im -nE'say;s/(.)[^$^I]/$1/&&redo' <<< "example"
msh210
źródło
Możesz po prostu określić „brak nowego wiersza na wejściu” (tak działa drugi program). Jeśli bardzo potrzebujesz usunąć znaki nowej linii na wejściu, spójrz na -lopcję, która włącza automatyczny tryb obsługi nowej linii, w którym printdrukuje dodatkową linię nowej linii (tutaj nie ma znaczenia) i -p/ -ninput usuwa nową linię (bardzo istotna). Jest to również przestarzałe, ale myślę, że można zastąpić ^Iliteralnym sterowaniem-I dla dodatkowego bajtu oszczędności. Wreszcie, myślę, że s/.\K[^$^I]/redo/ebyłby o jedną postać krótszy, chociaż nie jestem w 100% pewien, że to legalne miejsce na umieszczenie redo.
@ ais523, dziękuję za poradę dotyczącą nowego wiersza, ale myślę, że już wystarczająco dobrze poradziłem sobie z tym problemem. Mówiąc dosłownie ^I, dotyczy to większości zmiennych z literą kontrolną, ale nie tej, IIRC. Ponownie \Ki redowymiana na /e, dzięki! Przetestuję to, gdy będę miał okazję…
msh210
... i to nie działa. @ ais523
msh210
8

Perl 6 ,  47 40  38 bajtów

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

Rozszerzony:

{       # 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

}

...^Zamiast tego użyto powodu ..., &[eq]że nie powróci, Truedopóki ostatnia wartość nie zostanie powtórzona.

Brad Gilbert b2gills
źródło
7

05AB1E ,26 25 bajtów

¬ˆ[¦Ð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

Wypróbuj online!

Proszę to zanotować ¬²k0Q można go przepisać ¬²Q, ale z jakiegoś powodu nie działa, gdy bieżący znak jest znakiem cudzysłowu: Q zwraca rzeczywisty ciąg zamiast wartości logicznej i powoduje nieskończoną pętlę.

Ten kod może być dalej odtwarzany w golfa, ponieważ ¯J?jest duplikowany. Przeniesienie tej części w pętli usunie duplikację i pozwoli również upuścić zamykający nawias kwadratowy.

Osable
źródło
DˆćUΔD²KRнõ.;DXìˆ}¯¨»dla 21, ale używa nowych poleceń.
Magic Octopus Urn
7

Python 2, 71 66 bajtów:

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

Pełny program. Przyjmuje 2 wejścia przez STDIN w formacie '<String>','<Char>'.

Ponadto tutaj jest rozwiązanie rekurencyjne o wielkości 140 bajtów :

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)

Ten należy wywołać w formacie print(Q('<String>','<Char>')).

R. Kap
źródło
Nie jestem buffem w Pythonie, ale czy ten wydruk nie powinien wypisać tylko jednej linii?
Conor O'Brien
@ ConorO'Brien Tak, wcześniej źle przeczytałem ten post. Teraz jest naprawione.
R. Kap
7

Python 3 , 72 bajty

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

Wypróbuj online!

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

Przejdź na dietę:

😋🥕🍎🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🍎🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🥓🥔🍅🍄🍆
😋🥓🥓🥓🥓🍅🍄🍆
😋🥓🥓🥓🥓🍄🍆
😋🥓🥓🥓🥓🍆
😋🥓🥓🥓🥓
Guoyang Qin
źródło
6

JavaScript (ES6), 74 bajty

(s,c)=>[...t=s.slice(1)].map(d=>c!=d?s+=`
`+s[0]+(t=t.replace(d,``)):s)&&s
Neil
źródło
Myślę, że to powoduje niepoprawne wyjście dla f('test cases', 's')(kończące się na stss, zamiast tsss). Myślę, że replacedzieje się tak, ponieważ usuwa pierwsze wystąpienie, więc usuwa pierwszą tzamiast drugiej tw czwartej iteracji mappętli.
Lmis
@Lmis Dzięki za zwrócenie na to uwagi, myślę, że udało mi się naprawić jedną z moich wersji za „tylko” karę 7 bajtów.
Neil
5

Ruby, 148 139 97 90 83 77 62 bajtów

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

Nie jestem pewien, czy kod amatorski jest akceptowany na tej wymianie, ale jestem zainteresowany nauką kodowania golfa, chociaż jestem w tym okropny, jakakolwiek pomoc w tym, jak sprawiłbym, że ten program wygląda tak mały jak inne tutaj?

EDYTOWAĆ:

Zastąpione puts p

Usunięto tonę białych znaków i poprawnie zliczono bajty dzięki Kreatorowi pszenicy

Dzięki Challenger5 przeszedł od s=gets.chop;c=gets.chop;dos,c=gets.chop,gets.chop;

zastępuje thensię ;i gets.chopze gets[0]dzięki Mhutter!

Biorąc teraz dane wejściowe jako zmienne wiersza poleceń, np. prog.rb helloworld l

Dzięki licznym ulepszeniom wprowadzonym przez jeroenvisser101 w zamian a=s.dupza s=""+apoprzednie oświadczenie if if s[i]!=c;s[i]="";p s;else i+=1;endz (d!=c)?(s[i]="";p s):i+=1;ogromną poprawą!

Ben Hili
źródło
Witamy na stronie! Nie jestem ekspertem w golfie Ruby, ale wygląda na to, że masz dodatkową spację. Szczególnie w okolicach =s. Bardziej wyczerpujące wskazówki można znaleźć na naszej stronie porad .
Sriotchilism O'Zaic
Najprostszym sposobem na usunięcie bajtów jest na przykład wyeliminowanie nadmiaru białych znaków s=gets.chomp. Nie jestem pewien, czy możesz to zrobić w Ruby, ale w niektórych językach, takich jak Python, możesz łączyć wiele zadań w jedną instrukcję, na przykład a,b,c=0,1,2.
Esolanging Fruit
Hej, dziękuję za wskazówkę dotyczącą białych znaków, przeczytaj dokumentację ruby ​​i zrealizowane średniki mogą je zastąpić końcowymi instrukcjami: ') co do tworzenia s = gets.chop i c = gets.chop i cant do s, c = gets.chop lub cokolwiek w ten sposób niestety są zdecydowanie największą częścią kodu i chciałbym usunąć tę długą instrukcję.
Ben Hili
Masz jeszcze jakieś dodatkowe przestrzenie szczególnie przed słów kluczowych ( do, theni end), a około czwartej =.
Sriotchilism O'Zaic
Wygląda na to, że krótko zmieniasz się w liczbie bajtów. Sam liczę tylko 90 bajtów.
Sriotchilism O'Zaic
4

c90, 129 125 bajtów

z białymi znakami:

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

bez białych znaków:

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

bez golfa:

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

To zabiera wskaźnik na początek łańcucha i zapętla się, iterując ten wskaźnik, aż osiągnie koniec łańcucha. W pętli wypisuje pierwszy znak, a następnie wszelkie wystąpienia drugiego argumentu znalezionego między początkiem ciągu a wskaźnikiem. Następnie wywołuje on wskaźnik, wypisując resztę ciągu.

Musi to zostać skompilowane w systemie, w którym sizeof (int) == sizeof (char *). +3 bajty w przeciwnym razie.

Po raz pierwszy próbowałem tutaj gry w golfa, więc jestem pewien, że należy wprowadzić pewne optymalizacje.

Bobby Sacamano
źródło
3

Dyalog APL , 27 bajtów

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

to znak wykluczony, to ciąg początkowy

argument wydruku; znajdź indeks ipierwszego nie po pierwszym znaku; jeśli znaleziono, zadzwoń rekurencyjnie z iusuniętym

ngn
źródło
3

Mathematica, 64 bajty

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

Funkcja anonimowa. Pobiera dwa łańcuchy jako dane wejściowe i zwraca listę łańcuchów jako dane wyjściowe. Działa poprzez wielokrotne usuwanie pierwszego nieistnienia postaci.

LegionMammal978
źródło
Na pewno zacznę używać FixedPointList.
ngenisis,
3

PHP, 88 84 86 85 82 81 78 bajtów

1 bajt zapisany dzięki @IsmaelMiguel, 3 bajty dzięki @ user59178, 3 bajty zainspirowane @ user59178

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

pobiera dane wejściowe z argumentów wiersza poleceń; Biegnij zphp -r <code> '<string>' <character>


  • dołącza nowy wiersz do danych wejściowych w celu niejawnego wydruku końcowego.
    To dodaje 5 4 bajtów kodu, ale oszczędza na wyjściu i dodatkowe echo$a;.
Tytus
źródło
1
$argv[1]."\n"można zapisać jako"$argv[1]\n"
Ismael Miguel
1
Po $bdodaniu do niego nowego wiersza będzie on zawsze zgodny z prawdą, o ile ma długość> = 1. W związku z tym nie ""<jest to konieczne.
user59178,
Możesz zapisać kolejny bajt, używając trójki substr()zamiast przypisywania $b.
user59178,
@ user59178 Naprawdę cię nie złapałem: potrzebuję substrwyniku zarówno dla warunku, jak i print; więc powinienem to gdzieś przypisać. Ale mnie zainspirowałeś.
Tytus
Miałem na myśli, for(;$b=substr($b?:".$argv[1]\n",1);)ale to, co masz teraz jeszcze lepsze.
user59178,
3

05AB1E, 26 24 23 bajtów

Dzięki @Kade za 2 bajty!
Dzięki @Emigna za 1 bajt!

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

Wykorzystuje kodowanie CP-1252 . Wypróbuj online!

y²k0Êmoże być, y²Êale" bałagan to.

Prawdopodobnie można by grać w golfa więcej, ponieważ «powtarza się dwukrotnie. Proszę zostawić komentarz, jeśli masz jakieś sugestie lub sposoby na grę w golfa bardziej.

Oliver Ni
źródło
3

Java 10, 155 140 139 124 bajtów

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

Wypróbuj online.

Wyjaśnienie:

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

Stara 139 bajtów rekurencyjna odpowiedź:

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 bajtów dzięki @Eugene . (Następnym razem zrób komentarz zamiast edytować czyjś post, proszę.)

Wypróbuj online.

Wyjaśnienie:

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
Kevin Cruijssen
źródło
Czy nie byłoby o wiele krócej nie zawracać sobie głowy char [] i po prostu użyć s.charAt ()?
dpa97
@ dpa97 Ah, masz całkowitą rację. Na początku użyłem pętli foreach, ale zmieniłem ją na zwykłą pętlę for. Zapomniałem usunąć tablicę znaków. Dzięki.
Kevin Cruijssen
2

C #, 122 117 112 bajtów

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

Nie golfowany:

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

Zwraca kolekcję ciągów.

psycho
źródło
1
Niezła sztuczka z użyciem nietypowej kolekcji. Ale to nie zadziała, jeśli ostatni znak nie jest znakiem specjalnym c. W takim przypadku pętla będzie próbowała działać wiecznie.
paldir
1
@paldir Woops, masz rację! Włączając mój mózg tym razem, znalazłem lepszy (i krótszy!) Sposób.
psycho
Możesz usunąć nawias pętli for, aby zapisać 2 bajty.
PmanAce
@PmanAce Przepraszamy, co masz na myśli? Który nawias?
psycho
public IEnumerable F (string s, char c) {for (int i = 0; i <s.Length; ++ i) if (i <1 || s [i]! = c) return return i> 0? s = s.Remove (i--, 1): s; }
PmanAce
2

TSQL, 127 bajtów (z wyłączeniem definicji zmiennych)

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

Sformatowany:

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
dfundako
źródło
Dobre wykorzystanie patindex, ale alphabetprzykład nie wydaje się całkiem słuszny, wyświetla się w aaphabetdół aaa. Warto również wspomnieć, że należy to uruchomić na serwerze lub bazie danych z sortowaniem z uwzględnieniem wielkości liter, w przeciwnym razie upperCASEprzykład również się nie powiedzie, wyświetlając ueEw ostatnim wierszu.
BradC,
2

C #, 135 138 :( 137 bajtów

Gra w golfa:

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

Nie golfowany:

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

Funkcja zwraca kolekcję ciągów.

EDYCJA 1: @psycho zauważył, że algorytm nie został poprawnie zaimplementowany.

EDYCJA 2: Utworzono zmienną dla s.Length. Jeden bajt zapisany dzięki @TheLethalCoder.

paldir
źródło
1
Nie zadziała, jeśli znak wejściowy jest obecny więcej niż raz z rzędu. Np .: codeegolf edałby cezamiast cee.
psycho
@psycho Zamieniłem ifsię whilei to działa.
paldir
Lepszy ! Ale może być krótszy. Opublikuję własne!
psycho
1
Utwórz zmienną, s.Lengthaby zapisać jeden bajt: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 bajtów

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

I 76-bajtowe rozwiązanie rekurencyjne, ponieważ pomimo tego, że jest dłuższy niż pierwszy, bardziej mi się podoba:

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]
Lulhum
źródło
2

Rakieta 194 bajtów

(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)]))

Nie golfowany:

(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)])))

Testowanie:

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

Wynik:

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
""
rnso
źródło
2

JavaScript (ES6), 64 69

Zwracanie pojedynczego ciągu z znakami nowej linii

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>

edc65
źródło
Nieco dziwne, ponieważ nie bierze dwóch argumentów, ale jeden argument, a następnie zwraca inną funkcję, w której musisz podać drugi argument. Nie jestem pewien, czy takie było oczekiwane zachowanie.
MT0,
@ MT0 Jestem nieparzysta, ale jest akceptowana dla funkcji z 2 argumentami, ponieważ oszczędza 1 bajt. Dam ci referencje, kiedy je znajdę. Oto meta.codegolf.stackexchange.com/a/8427/21348
edc65
Świetna technika, nie zdawałem sobie sprawy, że modyfikacja trzeciego argumentu .mapbyła kumulatywna. Widziałem .map().filter()i pomyślałem: „To byłoby świetne zrozumienie tablic!”, Ale zabiło go brak indeksu w s=>c=>[for(x of(i=0,z=[...s]))if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
tablicach
1
Właściwie, przestawiając parametry, można uzyskać zrozumienie tablicy do 66:([...z],c,i=0)=>[for(x of z)if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
ETHprodukcje
@ETHproductions nie mogę uwierzyć, że się myliłem w liczbie bajtów ponownie . W każdym razie, dzięki
zmuszeniu
2

Szybkie 3 - 151 147 bajtów

Swift nie jest idealnym językiem do gry w golfa, szczególnie jeśli dotyczy indeksowania łańcuchów. To najlepsze, co mogłem zrobić:

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

Niestety, Swift potrzebuje miejsca wokół !=(ale nie dla ==), a Swift 3 upuścił ++operatora. Sztuką dla obu tych metod jest konwersja na tablicę znaków, która umożliwia indeksowanie liczb całkowitych, i użycie interpolacji łańcuchowej znaku w celu konwersji z powrotem na String( "\(c)").

Nie golfowany:

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

Poprzednie, nierekurencyjne rozwiązanie

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))
        }
    }
}
rabidaudio
źródło
Witamy w PPCG! Czy można usunąć niektóre białe znaki na końcu kodu?
ETHproductions
@ETHproductions niestety nie, operator trójskładnikowy i whilepotrzeba przestrzeni do skompilowania. Bawiłem się także pisaniem na klawiaturze Stringi próbowaniem printzamknięcia, ale nie oszczędzały one miejsca.
rabidaudio,
2

Pyke, 26 19 17 bajtów

jljjhF3<Q/Q*jih>s

Wypróbuj tutaj!

                  - Q = input
j                 - j = input_2
 ljjhF3           - for (i, j, j[0]) for i in range(len(j))
       <          -     j[:i]
        Q/        -    ^.count(Q)
          Q*      -   ^*Q
                s -  sum(j[0], ^, V)
            jih>  -   j[i+1:]
niebieski
źródło
Czy możesz dodać wyjaśnienie?
Esolanging Fruit
@ Challenger5 zrobione i grał w golfa 2 bajty!
Blue
1

Mathematica, 78 bajtów

Cholera, Martin Ender, byłem prawie pierwszy: str

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

Funkcja bez nazwy; prosta implementacja z Whilepętlą i kilkoma zmiennymi tymczasowymi.

Greg Martin
źródło
No dalej, oboje wiemy, że Mathematica nie jest konieczna
LegionMammal978,
1
<macha białą flagą>
Greg Martin
1

JavaScript ES6, 89 bajtów

Myślałem, że będzie to łatwe wyzwanie, ale jestem pewien, że coś tu brakuje.

Używa rekurencji i zwraca tablicę ciągów

(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>

Bassdrop Cumberwubwubwub
źródło
1

Groovy, 34 bajty

{a,b->a.inject{i,r->i+=r==b?b:""}}
Urna Magicznej Ośmiornicy
źródło
1
To takie dziwne, że stara odpowiedź została przegłosowana ...
Magic Octopus Urn