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.com
i e
postaci 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 golf golfowy , więc wygrywa najkrótszy kod (w bajtach).
Meeeeeeeeegram
Odpowiedzi:
V , 12 bajtów
Wypróbuj online!
Hexdump:
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:
Skompresowane wyrażenie regularne przekłada się na
Co znaczy
Wersja niekonkurencyjna (11 bajtów)
Ta wersja używa skrótu,
Yp
który nie był dostępny, gdy opublikowano to wyzwanie.źródło
cat filename | vim
zrobiłbym lub zrobiłbym coś innego?Vim,
27, 26, 25 bajtówWypróbuj online!
Dane wejściowe są w tym formacie:
Moje naiwne pierwsze podejście to trzy bajty dłużej:
Cieszę się również z tej odpowiedzi, ponieważ zaczyna się ona od mojego imienia.
Widzisz podobieństwo? Co?
Mniej skuteczne podejścia:
Wyjaśnienie:
źródło
k
za dużo :)(...)comk
obecnie w linii 5.:t
tutaj. NormalnyYp
zapisał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.|s
z99@:
lub nawet999@:
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.MATL ,
2016 bajtówWypróbuj online! Lub sprawdź przypadki testowe: 1 , 2 , 3 , 4 , 5 .
Premia
Zmodyfikowany kod, aby stopniowo zmniejszać ciąg (kompilator offline):
Lub spróbuj w MATL Online!
Wyjaśnienie
źródło
Haskell, 50 bajtów
Definiuje funkcję
(%)
zwracającą listę ciągów.Wyjaśnienie
(%)
nazywa się asw%c
, ponieważw
jest łańcuchem wejściowym ic
znakiem, który należy zachować. W skrócie, ta definicja działa poprzez rozdzieleniew
na pierwszy znak (a
) i resztę (x
), dzieleniex
przy pierwszym wystąpieniu znaku innego niżc
i rekurencyjne wywoływanie się po upuszczeniu jednego znaku.źródło
Retina ,
2827 bajtówLiczba bajtów zakłada kodowanie ISO 8859-1.
Wypróbuj online!
Wyjaśnienie
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.To odrzuca pierwszy znak, który a) nie jest na początku wejścia, b) nie jest równy oddzielnemu znakowi wejściowemu.
źródło
Pip ,
22262422 bajtówPobiera 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
,b
dostać CmdLine args;o
rozpoczyna się od wartości1
,x
jest""
):Sztuczki golfowe:
L
jest oceniany tylko raz, więc możemy tam wkraść się do pierwszego wydruku.#Pa-1
nie będzie działać, ponieważP
ma niski priorytet (parsowałby jako#P(a-1)
), ale możemy zmienić jego kolejnośćv+#Pa
, używającv
zmiennej wstępnie zainicjowanej do-1
.RA:
Operator zwraca nową wartośća
, dzięki czemu możemy drukować że ekspresja zamiast oddzielnegoPa
komunikatu.?
zamiast tego możemy użyć operatora trójskładnikowego .źródło
Perl 5, 29 bajtów
Mam 35 bajtów przy użyciu Strawberry Perl: 31 bajtów, plus 1
-nE
zamiast-e
, plus 3 dla spacji +-i
(używane do wprowadzania pojedynczej litery; dłuższy ciąg pochodzi ze STDIN).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.A zatem:
źródło
-l
opcję, która włącza automatyczny tryb obsługi nowej linii, w którymprint
drukuje dodatkową linię nowej linii (tutaj nie ma znaczenia) i-p
/-n
input usuwa nową linię (bardzo istotna). Jest to również przestarzałe, ale myślę, że można zastąpić^I
literalnym sterowaniem-I dla dodatkowego bajtu oszczędności. Wreszcie, myślę, żes/.\K[^$^I]/redo/e
byłby o jedną postać krótszy, chociaż nie jestem w 100% pewien, że to legalne miejsce na umieszczenieredo
.^I
, dotyczy to większości zmiennych z literą kontrolną, ale nie tej, IIRC. Ponownie\K
iredo
wymiana na/e
, dzięki! Przetestuję to, gdy będę miał okazję…Perl 6 ,
47 4038 bajtówRozszerzony:
...^
Zamiast tego użyto powodu...
,&[eq]
że nie powróci,True
dopóki ostatnia wartość nie zostanie powtórzona.źródło
05AB1E ,
2625 bajtówWypró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.źródło
DˆćUΔD²KRнõ.;DXìˆ}¯¨»
dla 21, ale używa nowych poleceń.Python 2,
7166 bajtów: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 :
Ten należy wywołać w formacie
print(Q('<String>','<Char>'))
.źródło
Python 3 , 72 bajty
Wypróbuj online!
Przejdź na dietę:
źródło
JavaScript (ES6), 74 bajty
źródło
f('test cases', 's')
(kończące się nastss
, zamiasttsss
). Myślę, żereplace
dzieje się tak, ponieważ usuwa pierwsze wystąpienie, więc usuwa pierwsząt
zamiast drugiejt
w czwartej iteracjimap
pętli.Ruby,
1481399790837762 bajtówNie 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
then
się;
igets.chop
zegets[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.dup
zas=""+a
poprzednie oświadczenie ifif s[i]!=c;s[i]="";p s;else i+=1;end
z(d!=c)?(s[i]="";p s):i+=1;
ogromną poprawą!źródło
=
s. Bardziej wyczerpujące wskazówki można znaleźć na naszej stronie porad .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łada,b,c=0,1,2
.do
,then
iend
), a około czwartej=
.c90,
129125 bajtówz białymi znakami:
bez białych znaków:
bez golfa:
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.
źródło
Dyalog APL , 27 bajtów
{×i←⊃1+⍸⍺≠1↓⎕←⍵:⍺∇⍵/⍨i≠⍳≢⍵}
⍺
to znak wykluczony,⍵
to ciąg początkowyargument wydruku; znajdź indeks
i
pierwszego nie⍺
po pierwszym znaku; jeśli znaleziono, zadzwoń rekurencyjnie zi
usuniętymźródło
Mathematica, 64 bajty
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.
źródło
FixedPointList
.PHP,
88848685828178 bajtów1 bajt zapisany dzięki @IsmaelMiguel, 3 bajty dzięki @ user59178, 3 bajty zainspirowane @ user59178
pobiera dane wejściowe z argumentów wiersza poleceń; Biegnij z
php -r <code> '<string>' <character>
To dodaje
54 bajtów kodu, ale oszczędza na wyjściu i dodatkoweecho$a;
.źródło
$argv[1]."\n"
można zapisać jako"$argv[1]\n"
$b
dodaniu 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.substr()
zamiast przypisywania$b
.substr
wyniku zarówno dla warunku, jak iprint
; więc powinienem to gdzieś przypisać. Ale mnie zainspirowałeś.for(;$b=substr($b?:".$argv[1]\n",1);)
ale to, co masz teraz jeszcze lepsze.05AB1E,
262423 bajtówDzięki @Kade za 2 bajty!
Dzięki @Emigna za 1 bajt!
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.źródło
Java 10,
155140139124 bajtówWypróbuj online.
Wyjaśnienie:
Stara 139 bajtów rekurencyjna odpowiedź:
-1 bajtów dzięki @Eugene . (Następnym razem zrób komentarz zamiast edytować czyjś post, proszę.)
Wypróbuj online.
Wyjaśnienie:
źródło
C #,
122117112 bajtówNie golfowany:
Zwraca kolekcję ciągów.
źródło
c
. W takim przypadku pętla będzie próbowała działać wiecznie.TSQL, 127 bajtów (z wyłączeniem definicji zmiennych)
Sformatowany:
źródło
patindex
, alealphabet
przykład nie wydaje się całkiem słuszny, wyświetla się waaphabet
dół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 razieupperCASE
przykład również się nie powiedzie, wyświetlającueE
w ostatnim wierszu.C #,
135138 :(137 bajtówGra w golfa:
Nie golfowany:
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.źródło
codeegolf e
dałbyce
zamiastcee
.if
sięwhile
i to działa.s.Length
aby 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);}}
Python 2 -
6573 bajtówI 76-bajtowe rozwiązanie rekurencyjne, ponieważ pomimo tego, że jest dłuższy niż pierwszy, bardziej mi się podoba:
źródło
Rakieta 194 bajtów
Nie golfowany:
Testowanie:
Wynik:
źródło
JavaScript (ES6), 64
69Zwracanie pojedynczego ciągu z znakami nowej linii
źródło
.map
była kumulatywna. Widziałem.map().filter()
i pomyślałem: „To byłoby świetne zrozumienie tablic!”, Ale zabiło go brak indeksu ws=>c=>[for(x of(i=0,z=[...s]))if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
([...z],c,i=0)=>[for(x of z)if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
Szybkie 3 -
151147 bajtówSwift nie jest idealnym językiem do gry w golfa, szczególnie jeśli dotyczy indeksowania łańcuchów. To najlepsze, co mogłem zrobić:
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 naString
("\(c)"
).Nie golfowany:
Poprzednie, nierekurencyjne rozwiązanie
źródło
while
potrzeba przestrzeni do skompilowania. Bawiłem się także pisaniem na klawiaturzeString
i próbowaniemprint
zamknięcia, ale nie oszczędzały one miejsca.Pyke,
261917 bajtówWypróbuj tutaj!
źródło
Mathematica, 78 bajtów
Cholera, Martin Ender, byłem prawie pierwszy: str
Funkcja bez nazwy; prosta implementacja z
While
pętlą i kilkoma zmiennymi tymczasowymi.źródło
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
źródło
Groovy, 34 bajty
źródło