Zadanie
Biorąc pod uwagę ciąg wejściowy, Twoim zadaniem jest generowanie danych wyjściowych 42
tylko wtedy, gdy wejściowy ciąg znaków jest dokładnie następujący:
abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiiijjjjjjjjjjkkkkkkkkkkkllllllllllllmmmmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooooooppppppppppppppppqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrsssssssssssssssssssttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzz
Może generować dowolną inną wartość, generować błąd lub wcale nie generować, jeśli dane wejściowe nie są równe wyżej wspomnianemu Łańcuchowi.
Zwycięskie kryterium
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach!
abbcccddddeeeee...zzabc
nie spełnia tego, jak przypuszczam, i widzę, że niektóre programy dają tak na tym wejściu.Odpowiedzi:
Golfscript, 20
z nową linią, 21 znaków (autor: Nabb)
W rzeczywistości Nabb pokonał mój, oto oryginalne rozwiązanie z nową linią, 22 znaki
To po prostu generuje łańcuch źródłowy i po prostu porównuje go z łańcuchem ze standardowego wejścia.
źródło
26,{).[96+]*}%n+=42`*
dla 21 (włącznie z nową linią).n+
ponieważ tablica nie jest płaska. Będziesz musiał zachować oryginalne 20 znaków lub dodać a,~
aby spłaszczyć wewnętrzne warunki tablicy.Ruby 1.9,
46 4239 znakówZakłada, że wejście nie jest zakończone znakiem nowej linii.
źródło
Program C -
7889Edycja: Nie drukuj 42, gdy są dodatkowe znaki.
Zakłada, że wejście nie ma końcowego nowego wiersza.
Jeśli prefiks nie pasuje, program kończy działanie. Jeśli prefiks pasuje, ale jest 1-3 dodatkowych znaków, drukuje 2. W przeciwnym razie zachowanie będzie niezdefiniowane.
Można to zmienić o jedną postać, zmieniając
exit(1)
nafork()
. Aha, i w związku z niepowiązanymi notatkami pamiętaj, aby zapisać wszystkie otwarte dokumenty na wypadek, gdyby z jakiegokolwiek powodu system się zablokował.źródło
PHP (60)
Zakładając, że dane wejściowe podano w wierszu polecenia:
Objaśnienie : możesz wyświetlić ciąg jako strukturę trójkąta.
Linia
j
zaczyna się od indeksui = j*(j+1)/2
(to wzór na liczbę trójkątną). Rozwiązanie równania kwadratowego powoduje,i
że indeks jest w linii,j = int((sqrt(8*i+1)-1)/2)
a zatem zawiera znak97 + int((sqrt(8*i+1)-1)/2)
. Zakres0-350
indeksu pozwala nam to uprościć96.5 + sqrt(2*(i+1))
, ale nie dotyczy to już większych wartości.Edycja : Przełączono na wprowadzanie wiersza polecenia zgodnie z sugestiami w komentarzach.
Edycja : używa operatora warunkowego do zapisania znaku
źródło
$s.=chr(96.5+sqrt($i+=2));
działa?Perl, 35
43Wymaga Perla 5.10 lub nowszego (działającego z
-E
), bez wprowadzania nowego wiersza.Bardziej podobały mi się regexy efektów ubocznych, ale wypowiedziano krótszy kod. Oto pamiątka. Przeznaczony również dla Perla 5.10 lub nowszego, ale tylko dla zaawansowanych / eksperymentalnych funkcji wyrażeń regularnych, więc
p
potrzebna jest tylko opcja wiersza poleceń.źródło
$a++."{$b}"
zamiast po prostu$a++.$b
?05AB1E , 7 bajtów (niekonkurujące)
Wypróbuj online!
Wyjaśnienie
Właśnie przechodzę przez kilka wyzwań, aby nauczyć się 05AB1E (i ogólnie golfa). To wyzwanie zostało wczoraj oznaczone jako aktywne i znalazłem krótkie rozwiązanie, więc dlaczego nie udostępnić? :)
źródło
Program Haskell -
71676457Zakłada brak końca nowej linii i nie wypisuje ani jednego.
Stosowanie:
źródło
zipWith
przystanków, gdy osiągnie koniec krótszej listy można wymienić['a'..'z']
ze['a'..]
i zapisać 3 znaki.[c|c<-['a'..'z'],_<-['a'..c]]
J, 29
przykład:
źródło
D: 94 znaków
Bardziej czytelnie:
źródło
Delphi,
164132Ten buduje ciąg i po prostu porównuje go z pierwszym argumentem wiersza poleceń. Jest krótszy i mniej trudny niż moje inne zgłoszenie:
(Zauważ, że ta wersja zakłada, że zmienne
c
ii
zaczynają się od 0, jak ma to miejsce w mojej wersji Delphi (2010).)Podobnie jak moje inne przesłanie, ten potrzebuje mniej znaków, jeśli tworzenie ciągów nie odbywa się w funkcji, tak jak wcześniej:
Delphi, 181
Zauważ, że wyjście nie potrzebuje nowej linii, więc WriteLn () zmieniło się w Write ().źródło
PHP - 45 znaków
Dziwię się, że nikt nie opublikował żadnej odpowiedzi wykorzystującej haszowanie. Jest to bardzo skuteczny sposób sprawdzania dokładności łańcucha.
Dane są dość trudne do skopiowania / wklejenia, ponieważ w środku kodu jest pusty bajt. Oto zrzut kodu w celach testowych.
źródło
Scala 79
źródło
Pyth, 14 lat
Po prostu konstruuje niezbędny ciąg, a następnie porównuje z danymi wejściowymi i mnoży przez 42.
źródło
m
sprawia mi kłopoty…m
, która stosuje funkcję do każdego elementu jej danych wejściowych. Dane wejściowe toG
alfabet.xGd
znajduje pozycjęd
znaku w alfabecie, wG
alfabecie.h
zwiększa to o jeden i*d
tyle razy replikuje postać. Pozam
funkcjąs
łączy wynikową listę ciągów w pojedynczy ciąg, a następnieqz
sprawdza, czy wynik jest równy wejściowemu. Wartości logiczne są przedstawiane tak,0
jakby były fałszywe, a1
jeśli prawdziwe, więc*42
wynikiem jest wartość „42
prawda” i „0
fałszywy”.Brachylog (2), 15 bajtów, wyzwanie dla postdate języka
Wypróbuj online!
A teraz odpowiedź, która działa na zupełnie innej zasadzie niż większość tutaj widziana. Jest to przesyłanie funkcji (pytanie nie określa, jaki rodzaj przesyłania jest pożądany, ale funkcje są domyślnie dozwolone).
Wyjaśnienie
Ta odpowiedź polega na zdefiniowaniu rodzaju ciągu: te, które a) zawierają wszystkie małe litery alfabetu, b) są posortowane, i c) dla których wzięcie liczby wystąpień każdego znaku w ciągu daje ciąg kolejnych liczby całkowite zaczynające się od 1. (Powinno być jasne, że istnieje wiele takich ciągów, ale ten, który chcemy w specjalnym przypadku, jest najkrótszy.) Następnie, jeśli ciąg spełnia te kryteria, dodajemy 16 do liczby różnych znaków w strunowy; spowoduje to 42, jeśli ciąg znaków jest tym, o który pyta nas specjalny przypadek, i co najmniej 43 we wszystkich innych przypadkach. (Jeśli łańcuch nie spełni któregokolwiek z kryteriów przynależności do kategorii, funkcja zakończy się niepowodzeniem, co jest trochę jak zgłoszenie wyjątku.)
Oto jak interpretować kod źródłowy:
źródło
R
6060Dzięki za sugestię @giusppe
źródło
paste
tutaj jest dobrze, ascan(,"")
zamiast tego możesz użyćreadline()
.Python (84)
Zakłada końcowy znak nowej linii na końcu danych wejściowych.
źródło
raw_input
zamiast tegosys.stdin.read
?raw_input
czyta tylko jedną linię; Nie byłem pewien, czy „wejście” będzie zawsze pojedynczą linią, czy też może będzie dyskwalifikujący sygnał wejściowy w późniejszych liniach.Python - 62 znaki
źródło
print("".join(x*chr(x+96)for x in range(27))==input())*42
.Perl,
4946 znakówdo użycia w programie, a nie w wierszu poleceń
$..=chr($+96)x$ for 1..26;$.eq(pop)&&print '42'pozdrowienia
rbo
Edycja: Pomysł zerwany z Ventero
źródło
PHP
928887 znakówEDYTOWAĆ
Zastąpiono
$j<0
z$j
ireturn $b==$a?42:0;
zecho $b==$a?42:0;
zastąpione
echo $b==$a?42:0;
zecho($b==$a)*42;
źródło
ECLiPSe Prolog - 173
źródło
JavaScript (91
939498102116)Użycie:,
a('string')
zwraca,42
jeśli jest zgodne ze specyfikacją, lub0
.http://jsfiddle.net/g25M3/6/
Edycja : Usunięto
var
i wyeliminowano dwa spacje wfor (
.Edycja 2 : Zmieniono
j>0
naj
ireturn (z==r)?42:0;
doreturn z==r?42:0
Edycja 3 : Zainicjuj za
i
pomocąi=''
, zmień(z==r)?42:0
do(z==r)*42
Edycja 4 : Zmień
for(;i<27;i++)
dowhile(i++<26)
Edycja 5 : Zmień
i=r='';while(i++<26)
dofor(i=r='';i++<26;)
ifor(j=i;j;j--)
dofor(j=i;j--;)
źródło
var
deklarowania zmiennych;)for (
.return(z==r)?42:0;
jereturn z==r?42:0
j>0
może być tylkoj
tak myślę.JavaScript 1.8, 99 znaków
Wyzywam cię, żebyś to zrozumiał :)
źródło
PHP - 59
Zakłada, że co najmniej 1 wejście jest dostarczane przez cli
Działa mniej więcej tak, że md5 może technicznie mieć duplikaty z algorytmem mieszającym.
źródło
PowerShell v2 +, 47 bajtów
Konstruuje zakres
1..26
, przekazuje go przez pętlę za pomocą|%{...}
. W każdej iteracji używamy operatora przecinka do skonstruowania literału tablicowego prądu[char]
pomnożonego przez numer bieżącej pętli. Następnie wykonujemy to-join
wszystko razem, aby skonstruować ciąg,abbcccdddd...
a następnie użyć rozróżnienia wielkości liter w-ceq
porównaniu z naszymi danymi wejściowymi$args
, co spowoduje albo$TRUE
albo$FALSE
. W PowerShell wartości logiczne można domyślnie rzutować odpowiednio jako1
lub0
, co dzieje się tutaj z42*
. Wydrukuje42
iff wejściowy jestabbccc...zzzzzzzzzzzzzzzzzzzzzzzzzz
i wyjdzie w0
przeciwnym razie.źródło
K, 26 bajtów
Dzięki
źródło
{$[x~.Q.a@&1+!26;42;]}
dla 22 bajtów.42*(&!27)~-96+"j"$
przez 18 bajtów (przenoszenie mojej odpowiedzi OK ).VBA 91
Nie było żadnych odpowiedzi VBA, ale to działa:
źródło
o="":For i=1To 26:o=o &String(i,Chr(i+96)):Next:?-42*([A1]=o)
A1
jako dane wejściowe.APL (Dyalog) ,
1817 bajtówWypróbuj online!
Cztery oczywiste bajty można zapisać, jeśli wolno nam używać wielkich liter.
42
42/⍨
jeśli (lit. replikowane przez)⍞
wprowadzanie znaków≡
jest identyczny z819⌶
małe litery⎕A
lphabet/⍨
replikowane przez⍳
jeden przez26
26źródło
Clojure - 61 znaków
Wykorzystuje następujące fakty:
źródło
JavaScript 144
Prawdopodobnie można to znacznie poprawić, rekursja zawsze była dla mnie bardzo ważna.
Sprężony
Mniej skompresowany
źródło
Delphi, 127
Ten odczytuje ciąg z danych wejściowych, porównuje go w miarę upływu czasu, zapisuje 42, gdy dane wejściowe pasują do ostatniego
z
.Delphi, 157
Delphi, 188
Ta wersja nie korzysta z funkcji, która zapisuje sporo znaków w porównaniu z poprzednią wersją tej techniki:
Delphi, 213
Niestety trochę długi, głównie z powodu długich słów kluczowych Delphi i potrzeby zainicjowania aplikacji konsolowych przed zapisaniem danych wyjściowych.Zauważ też, że zwiększyłem CmdLine o 77 znaków, ponieważ było to przesunięcie potrzebne do pominięcia mojej lokalnej ścieżki wykonywalnej (Delphi nie ma bezpośredniego wskaźnika argumentów). Dostosuj, aby dopasować do własnej konfiguracji (może prowadzić do 1 mniej znaków, gdy przesunięcie <10).
źródło
program a;
linię. I nawiasy wokółb^<>Char(c)
,i>0
ii=27
mogą zostać usunięte.if i>0then
że się skompiluje!)