Odpowiedź na życie wszechświat i wszystko

46

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 , więc wygrywa najkrótszy kod w bajtach!

Mateen Ulhaq
źródło
Wiele z podanych tu rozwiązań jest błędnych, ponieważ drukują 42, gdy ciąg jest dłuższy niż pożądany ciąg, a prefiks pasuje do pożądanego ciągu.
fR0DDY,
@froddy: Co jeśli jedyne postacie? po ciągu (czy | są) łamanie linii? Mój zwykły mechanizm wejściowy nie dba o to, czy dane wejściowe są przerywane przez przerwanie linii, czy nie, ale na przykład dają to samo w obu przypadkach.
Joey,
@ fR0DDY: Nie było jasnej definicji tego, jak należy postępować z resztą danych wejściowych, więc nie ma tutaj „złego”.
PatrickvL,
3
@PatrickvL Wspomina „tylko”, jeśli dane wejściowe to podany ciąg. Więc abbcccddddeeeee...zzabcnie spełnia tego, jak przypuszczam, i widzę, że niektóre programy dają tak na tym wejściu.
fR0DDY,
2
@ fR0DDY: Powiem inaczej: nie ma specyfikacji, w jaki sposób ograniczane są dane wejściowe, więc można je interpretować. Nie ma też wzmianki o kodowaniu znaków (chyba większość z nas zakłada domyślne środowisko swojego środowiska - najpopularniejsze będą ANSI, UTF8 i UTF16LE). Nie ma też wzmianki o tym, jak wejście jest przedstawiane - czy jest wprowadzane za pomocą standardowego wejścia, parametru wiersza poleceń? Widzisz więc - posiadanie całej tej wolności ustępuje miejsca interpretacji, którą nazwałbyś „niepoprawną”, podczas gdy inni oceniliby ją jako „zgodną”. NOFI, ale dla niektórych z nas jest to codzienna praktyka.
PatrickvL,

Odpowiedzi:

20

Golfscript, 20

26,{.97+\{.}*}%=42`*

z nową linią, 21 znaków (autor: Nabb)

26,{).[96+]*}%n+=42`*

W rzeczywistości Nabb pokonał mój, oto oryginalne rozwiązanie z nową linią, 22 znaki

26,{.97+\{.}*}%n+=42`*

To po prostu generuje łańcuch źródłowy i po prostu porównuje go z łańcuchem ze standardowego wejścia.

TY
źródło
3
26,{).[96+]*}%n+=42`*dla 21 (włącznie z nową linią).
Nabb,
Heh, to nie działa bez, 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.
Nabb,
@Nabb, heheh, nie zdawałem sobie sprawy, że nowa linia to coś innego.
TY
13

Ruby 1.9, 46 42 39 znaków

p (?a..?z).map{|a|a*$.+=1}*""==gets&&42

Zakłada, że ​​wejście nie jest zakończone znakiem nowej linii.

Ventero
źródło
Co z nową linią od dostaje?
steenslag,
2
@steenslag: Specyfikacje nic nie mówią, że dane wejściowe są kończone znakiem nowej linii, więc to rozwiązanie zakłada, że ​​nie ma żadnych danych.
Ventero,
11

Program C - 78 89

Edycja: Nie drukuj 42, gdy są dodatkowe znaki.

Zakłada, że ​​wejście nie ma końcowego nowego wiersza.

main(i,j){for(i=1;i<27;i++)for(j=i;j--;getchar()==96+i?0:exit(1));puts("42"+!!gets(&i));}

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)na fork(). 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ł.

Joey Adams
źródło
1
Spowoduje to wydrukowanie 42, jeśli ciąg jest dłuższy niż pożądany ciąg, a prefiks pasuje do pożądanego ciągu.
fR0DDY,
8

PHP (60)

Zakładając, że dane wejściowe podano w wierszu polecenia:

for(;$i<702;)$s.=chr(96.5+sqrt($i+=2));echo$s!=$argv[1]?:42;

Objaśnienie : możesz wyświetlić ciąg jako strukturę trójkąta.

j     i   val
0     0   a
1   1-2   bb
2   3-5   ccc
3   6-9   dddd
4 10-14   eeeee
5 15-20   ffffff
      ...

Linia jzaczyna się od indeksu i = 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 znak 97 + int((sqrt(8*i+1)-1)/2). Zakres 0-350indeksu 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

sam hocevar
źródło
+1, to działa;) Umm, czy mógłbyś rozwinąć jak $s.=chr(96.5+sqrt($i+=2));działa?
Clyde Lobo,
Edytowane. Mam nadzieję, że to ma sens :-)
sam hocevar,
for (; $ i <702;) $ s. = chr (96,5 + sqrt ($ i + = 2)); echo ($ s == $ argv [1]) * 42; Tylko 61 znaków, przy założeniu wejścia standardowego
Viper_Sb
@Viper_Sb: dzięki za podpowiedź; Nie byłem pewien zasad, więc naśladowałem rozwiązanie Clyde'a. Pójdę z twoją sugestią.
sam hocevar,
1
@powtac składnia języka nie wymaga tutaj spacji
sam hocevar
7

Perl, 35 43

map$s.=$_ x++$a,a..z;say 42if<>~~$s

Wymaga 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 ppotrzebna jest tylko opcja wiersza poleceń.

$a=a;$_=/^(??{$b++;$a++."{$b}"}){26}$/&&42
JB
źródło
Doskonały. Starałem się pokonać ten rekursywny regex, ale nie mogłem zejść poniżej 43c. : - ((
gumowe buty
Dlaczego trzeba powiedzieć $a++."{$b}"zamiast po prostu $a++.$b?
Timwi
@Timwi, ponieważ potrzebuję tych nawiasów, aby pojawiły się w wynikowym ciągu. Nie chcę dopasowywać dosłownie „d4”, chcę „dddd”, wyrażony jako regex „d {4}”
JB
Oczywiście. Dzięki za wyjaśnienie!
Timwi
Do tego doszło 33-bajtowe rozwiązanie! Wypróbuj online!
Dom Hastings,
7

05AB1E , 7 bajtów (niekonkurujące)

AƶJQi42

Wypróbuj online!

Wyjaśnienie

A       push lowercase alphabet
 ƶ      lift every letter, push it and multiply it by its index
  J     join the list
   Qi   does it equal the input?
     42 push 42 and output implicitly

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ć? :)

Cinari
źródło
3
Witamy w PPCG!
Steadybox,
6

Program Haskell - 71 67 64 57

Zakłada brak końca nowej linii i nie wypisuje ani jednego.

f x|x==[c|c<-['a'..'z'],_<-['a'..c]]="42"
main=interact f

Stosowanie:

$ echo -n 'abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiiijjjjjjjjjjkkkkkkkkkkkllllllllllllmmmmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooooooppppppppppppppppqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrsssssssssssssssssssttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzz' | { ./42; echo; }
42
$ echo -n 'something else' | { ./42; echo; }
42: 42.hs:1:0-54: Non-exhaustive patterns in function f


$
Joey Adams
źródło
1
fwiw ten kod jest również nadal bardzo czytelny.
Dan Burton
1
Od zipWithprzystanków, gdy osiągnie koniec krótszej listy można wymienić ['a'..'z']ze ['a'..]i zapisać 3 znaki.
hammar
@hammar: Dzięki. Zaoszczędziłem jeszcze 1 znak za pomocą >> = (concatMap) zamiast concat i zipWith.
Joey Adams,
@hammar: Zaoszczędź jeszcze więcej, używając notacji zamiast >> = i lambda :-)
Joey Adams
2
@Joey: Lub jeszcze lepiej:[c|c<-['a'..'z'],_<-['a'..c]]
hammar
4

J, 29

f=:42#~((>:#a.{~97+])i.26)-:]

przykład:

f 'oasijfiojasef'

f 23841235

f 'abbccc...'
42
Eelvex
źródło
Lubię J. I uważam to za brzydkie i okropne. I lubię to.
patrz
4

D: 94 znaków

void f(S)(S s){S t;foreach(i;0..26)t~=array(repeat(cast(char)(i+'a'),i+1));s==t&&writeln(42);}

Bardziej czytelnie:

void f(S)(S s)
{
    S t;

    foreach(i; 0 .. 26)
        t ~= array(repeat(cast(char)(i + 'a'), i + 1));

    s == t && writeln(42);
}
Jonathan M. Davis
źródło
3

Delphi, 164 132

Ten 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:

var s:string;c,i:int8;begin repeat s:=s+Char(c+97);i:=i-1;c:=c+Ord(i<0);if i<0then i:=c;until c=26;Write(42*Ord(s=ParamStr(1)));end.

(Zauważ, że ta wersja zakłada, że zmienne ci izaczynają 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

program a;{$APPTYPE CONSOLE}function s(c,i:byte):string;begin if(i>0)then Exit(Char(c)+s(c,i-1));if(c<122)then Exit(s(c+1,c-95));end;begin if(s(97,1)=ParamStr(1))then Write(42);end.

Zauważ, że wyjście nie potrzebuje nowej linii, więc WriteLn () zmieniło się w Write ().

PatrickvL
źródło
3

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.

echo md5($argv[1],1)!='¯è a@ÛÚƒ:ïT�p'?:42;

Dane są dość trudne do skopiowania / wklejenia, ponieważ w środku kodu jest pusty bajt. Oto zrzut kodu w celach testowych.

65 63 68 6f 20 6d 64 35 28 24 61 72 67 76 5b 31 5d 2c 31 29 21 3d 27 af e8 a0 61 40 db da 7f 11 0f 83 3a ef 54 00 70 27 3f 3a 34 32 3b

HoLyVieR
źródło
2
Sprytny! Chociaż technicznie istnieją inne wartości wejściowe powodujące ten sam skrót, nie spełnia on całkowicie wymogu wyprowadzania 42 tylko wtedy, gdy dane wejściowe są w określonym formacie.
mellamokb
3

Scala 79

 if((for(i <- 1 to 26;j<-1 to i)yield(96+i).toChar).mkString==args(0))print(42)
Lalith
źródło
3

Pyth, 14 lat

*42qzsm*dhxGdG

Po prostu konstruuje niezbędny ciąg, a następnie porównuje z danymi wejściowymi i mnoży przez 42.

isaacg
źródło
„porównuje z wkładem i mnoży przez 42.” nigdy bym o tym nie pomyślał. Pomóż mi tylko ogolić 1 postać z mojego rozwiązania. Dzięki.
AndoDaan
Argh, spóźniłem się. Czy możesz wyjaśnić, jak to działa? Ta funkcja msprawia mi kłopoty…
Jim
1
@ Jim Zaczynamy od funkcji mapy m, która stosuje funkcję do każdego elementu jej danych wejściowych. Dane wejściowe to Galfabet. xGdznajduje pozycję dznaku w alfabecie, w Galfabecie. hzwiększa to o jeden i *dtyle razy replikuje postać. Poza mfunkcją słączy wynikową listę ciągów w pojedynczy ciąg, a następnie qzsprawdza, czy wynik jest równy wejściowemu. Wartości logiczne są przedstawiane tak, 0jakby były fałszywe, a 1jeśli prawdziwe, więc *42wynikiem jest wartość „ 42prawda” i „ 0fałszywy”.
isaacg
3

Brachylog (2), 15 bajtów, wyzwanie dla postdate języka

⊇Ạ∧?o?ọtᵐ~⟦₁+₁₆

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:

⊇Ạ∧?o?ọtᵐ~⟦₁+₁₆
⊇Ạ               {the input} contains all lowercase letters
  ∧              and
   ?o?           the input sorts to itself
                 {and; implied when two conditions overlap}
     ?ọ          the {character, number of occurrences} pairs for the input
       tᵐ        when the second element of each is taken
         ~       create an output that could have been produced by
          ⟦₁     outputting the list of integers from 1 to some input inclusive;
            +₁₆  add 16 to that input {and output it}

źródło
3

R 60 60

if(readline()==paste0(rep(letters,1:26),collapse=""))cat(42)

if(scan(,"")==paste(rep(letters,1:26),collapse=""))cat(42)

Dzięki za sugestię @giusppe

Kun Ren
źródło
Myślę, że pastetutaj jest dobrze, a scan(,"")zamiast tego możesz użyć readline().
Giuseppe,
2

Python (84)

Zakłada końcowy znak nowej linii na końcu danych wejściowych.

import sys
if ''. join (c * chr (c + 96) dla cw zakresie (27)) + '\ n' == sys.stdin.read (): print 42
Hoa Long Tam
źródło
1
Dlaczego nie użyć raw_inputzamiast tego sys.stdin.read?
Juan
1
@Juan: raw_inputczyta 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.
Hoa Long Tam
2

Python - 62 znaki

print("".join(x*chr(x+96) for x in range(27))==raw_input())*42
gnibbler
źródło
2
Może być krótszy w Pythonie 3: print("".join(x*chr(x+96)for x in range(27))==input())*42.
mbomb007
2

Perl, 49 46 znaków

do użycia w programie, a nie w wierszu poleceń

$..=chr($+96)x$ for 1..26;$.eq(pop)&&print '42'

join('',map$_ x++$x,'a'..'z')eq pop&&print'42'

pozdrowienia

rbo

Edycja: Pomysł zerwany z Ventero

kalosze
źródło
2

PHP 92 88 87 znaków

function _($a){for($i=97;$i<123;$i++)for($j=$i-96;$j;$j--)$b.=chr($i);echo($b==$a)*42;}

EDYTOWAĆ

Zastąpiono $j<0z $ji return $b==$a?42:0;zecho $b==$a?42:0;

zastąpione echo $b==$a?42:0;zecho($b==$a)*42;

Clyde Lobo
źródło
2
Może być 80 znaków, gdyby nie wszystkie dziwaczne znaki dolara.
Joey Adams,
Zobacz także mój wpis dotyczący rozwiązania z jedną pętlą.
sam hocevar,
2

ECLiPSe Prolog - 173

c(_,[],_):-!. c(A,M,N):-length(L,N),checklist('='(A),L),append(F,L,M),P is N-1,B is A-1,c(B,F,P). ?- read_string(end_of_file,351,S),string_list(S,L),c(122,L,26),writeln(42).
rdzeń rdzeniowy
źródło
2

JavaScript (91 93 94 98 102 116 )

Użycie:, a('string')zwraca, 42jeśli jest zgodne ze specyfikacją, lub 0.

function a(z){for(i=r='';i++<26;)for(j=i;j--;)r+=String.fromCharCode(i+96);return(z==r)*42}

http://jsfiddle.net/g25M3/6/

Edycja : Usunięto vari wyeliminowano dwa spacje w for (.

Edycja 2 : Zmieniono j>0na ji

  1. return (z==r)?42:0; do
  2. return z==r?42:0

Edycja 3 : Zainicjuj za ipomocą i='', zmień

  1. (z==r)?42:0 do
  2. (z==r)*42

Edycja 4 : Zmień

  1. for(;i<27;i++) do
  2. while(i++<26)

Edycja 5 : Zmień

  1. i=r='';while(i++<26) do
  2. for(i=r='';i++<26;) i
  3. for(j=i;j;j--) do
  4. for(j=i;j--;)
mellamokb
źródło
Cóż, możesz zmniejszyć kolejne 12 znaków, jeśli nie używasz vardeklarowania zmiennych;)
Clyde Lobo
@Clyde: Dzięki! Znalazłem też, że mogę usunąć miejsce pomiędzy for (.
mellamokb
Tak, właśnie miałem zasugerować to samo;) Och i ja kodowałem rozwiązanie w PHP przy użyciu tej samej logiki, co twoja
Clyde Lobo
Możesz zapisać kolejne 2 znaki, zastępując return(z==r)?42:0;jereturn z==r?42:0
Clyde Lobo
j>0może być tylko jtak myślę.
TY
2

JavaScript 1.8, 99 znaków

function c(x)(x.replace(/([a-z])\1*/g,function(m)!(a-m.length)*m.charCodeAt(0)-96-a++,a=1)==0)*a+15

Wyzywam cię, żebyś to zrozumiał :)

Casey Chu
źródło
2

PHP - 59

Zakłada, że ​​co najmniej 1 wejście jest dostarczane przez cli

echo md5($argv[1])!='afe8a06140dbda7f110f833aef540070'?:42;

Działa mniej więcej tak, że md5 może technicznie mieć duplikaty z algorytmem mieszającym.

syntaqx
źródło
2

PowerShell v2 +, 47 bajtów

42*(-join(1..26|%{,[char]($_+96)*$_})-ceq$args)

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 -joinwszystko razem, aby skonstruować ciąg, abbcccdddd...a następnie użyć rozróżnienia wielkości liter w -ceqporównaniu z naszymi danymi wejściowymi $args, co spowoduje albo $TRUEalbo $FALSE. W PowerShell wartości logiczne można domyślnie rzutować odpowiednio jako 1lub 0, co dzieje się tutaj z 42*. Wydrukuje 42iff wejściowy jest abbccc...zzzzzzzzzzzzzzzzzzzzzzzzzzi wyjdzie w 0przeciwnym razie.

AdmBorkBork
źródło
możesz zapisać bajt :) Wypróbuj online!
mazzy
2

K, 26 bajtów

{(::;42)x~,/(1+!26)#'.Q.a}
{(::;42)x~,/(1+!26)#'.Q.a}"hello"
{(::;42)x~,/(1+!26)#'.Q.a}"abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiiijjjjjjjjjjkkkkkkkkkkkllllllllllllmmmmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooooooppppppppppppppppqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrsssssssssssssssssssttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzz"
42

Dzięki

Chromozorz
źródło
{$[x~.Q.a@&1+!26;42;]}dla 22 bajtów.
streetster
1
42*(&!27)~-96+"j"$przez 18 bajtów (przenoszenie mojej odpowiedzi OK ).
streetster
2

VBA 91

Nie było żadnych odpowiedzi VBA, ale to działa:

Function f(t)
    For i = 1 To 26
        o = o & String(i, Chr(i + 96))
    Next
    f = -42 * (t = o)
End Function
OSG
źródło
Czy naprawdę niemożliwe jest usunięcie z tego białych znaków?
Esolanging Fruit
1
Wersja skrócona, 61 bajtów -o="":For i=1To 26:o=o &String(i,Chr(i+96)):Next:?-42*([A1]=o)
Taylor Scott,
@ Challenger5 Nie, to nie jest niemożliwe. Komentarz Taylora Scott jest dokładnie taki. Działa w oknie natychmiastowym i pobiera wartość z komórki A1jako dane wejściowe.
Inżynier Toast
2

APL (Dyalog) , 18 17 bajtów

42/⍨⍞≡819⌶⎕A/⍨⍳26

Wypró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 z

819⌶ małe litery

⎕Alphabet

/⍨ replikowane przez

 jeden przez

26 26

Adám
źródło
1

Clojure - 61 znaków

(fn[a](if(=(mapcat #(repeat%(char(+% 96)))(range 1 27))a)42))

Wykorzystuje następujące fakty:

  • Clojure może interpretować dowolny ciąg znaków automatycznie jako ciąg znaków
  • Mogę użyć zakresu liczb od 1 do 26, aby utworzyć znaki i powtórzyć je poprawną liczbę lub razy, aby wygenerować „poprawne” wejście
mikera
źródło
zapisałby 6 znaków, jeśli Clojure zezwoli na zagnieżdżone # () s ..... ważne żądanie funkcji dla Clojure 1.4 Myślę, że!
mikera
1

JavaScript 144

Prawdopodobnie można to znacznie poprawić, rekursja zawsze była dla mnie bardzo ważna.

Sprężony

function r(a,b,d,c){c++;if(b<d)a+=r(a,b+1,d,c);for(i=0;i<c;i++)a=String.fromCharCode(b)+a;return a}function q(a){if(q==r(a,97,122,0))return 42};

Mniej skompresowany

function r(s, c, x, w){        
    w++;
    if(c < x)
        s += r(s, c + 1, x, w);
    for(i = 0; i < w; i++)
        s = String.fromCharCode(c) + s;              
    return s;
}
function q(z){
    if(q==r(z,97, 122, 0))
        return 42;            
}

alert(q("rgrg"));
Tom Gullen
źródło
1

Delphi, 127

var b:Char;c,i:Int8;begin repeat if i<0then i:=c;Read(b);if c+97<>Ord(b)then Exit;i:=i-1;c:=c+Ord(i<0)until i=27;Write(42);end.

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

var b:pchar;c,i:byte;begin b:=CmdLine+85;c:=97;i:=1;repeat Inc(b);if b^<>Char(c)then Exit;Dec(i);if i>0then Continue;c:=c+1;i:=c-96;until i=27;Write(42);end.

Delphi, 188

program a;{$APPTYPE CONSOLE}var b:pchar;c,i:byte;begin b:=CmdLine+85;c:=97;i:=1;repeat Inc(b);if(b^<>Char(c))then Exit;Dec(i);if(i>0)then Continue;c:=c+1;i:=c-96;until(i=27);Write(42);end.

Ta wersja nie korzysta z funkcji, która zapisuje sporo znaków w porównaniu z poprzednią wersją tej techniki:

Delphi, 213

program a;{$APPTYPE CONSOLE}function t(b:pchar;c,i:byte):byte;begin repeat Inc(b);if(b^<>Char(c))then Exit(0);Dec(i);if(i>0)then Continue;c:=c+1;i:=c-96;until(i=27);t:=42;end;begin WriteLn(t(CmdLine+77,97,1));end.

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

PatrickvL
źródło
Możesz ustawić typ aplikacji w ProjectOptions / DelphiCompiler / Linking / GenerateConsoleApplication. Możesz także pominąć program a;linię. I nawiasy wokół b^<>Char(c), i>0i i=27mogą zostać usunięte.
Wouter van Nifterick
@Wouter van Nifterick: Dzięki za sugestie, zastosuję je również do innych moich zgłoszeń. (Nawet nie wiedziałem, if i>0thenże się skompiluje!)
PatrickvL,