Antwort auf das Leben, das Universum und alles

46

Aufgabe

Wenn Sie einen String als Eingabe angeben, besteht Ihre Aufgabe darin, 42 nur dann auszugeben , wenn der Eingabe-String genau wie folgt lautet :

abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiiijjjjjjjjjjkkkkkkkkkkkllllllllllllmmmmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooooooppppppppppppppppqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrsssssssssssssssssssttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzz

Es kann jeden anderen Wert ausgeben, einen Fehler erzeugen oder überhaupt nicht ausgegeben werden, wenn die Eingabe nicht der oben genannten Zeichenfolge entspricht.


Gewinnkriterium

Das ist , also gewinnt der kürzeste Code in Bytes!

Mateen Ulhaq
quelle
Viele der hier angebotenen Lösungen sind falsch, weil sie 42 ausgeben, wenn die Zeichenfolge länger als die gewünschte Zeichenfolge ist und das Präfix mit der gewünschten Zeichenfolge übereinstimmt.
Freitag,
@Froddy: Was ist, wenn die einzigen Zeichen? Nach der Zeichenfolge (ist | sind) ein Zeilenumbruch? Mein üblicher Eingabemechanismus kümmert sich nicht darum, ob die Eingabe durch einen Zeilenumbruch beendet wird oder nicht, sondern liefert beispielsweise in beiden Fällen das gleiche Ergebnis.
Joey
@ fR0DDY: Es gab keine klare Definition, wie der Rest der Eingabe behandelt werden soll, daher gibt es hier kein "Falsch".
PatrickvL
3
@PatrickvL Es wird "nur" erwähnt, wenn die Eingabe die angegebene Zeichenfolge ist. So abbcccddddeeeee...zzabcgenügt nicht , dass ich nehme an, und ich kann einige Programme sehen gibt ja auf diesem Eingang.
Freitag,
2
@ fR0DDY: Um es anders auszudrücken: Es gibt keine Spezifikation, wie Eingaben abgegrenzt werden, das ist also offen für Interpretationen. Es gibt auch keine Erwähnung der Zeichenkodierung (ich vermute, die meisten von uns nehmen die Standardeinstellung ihrer Umgebung an - ANSI, UTF8 und UTF16LE werden die beliebtesten sein). Auch nicht erwähnt, wie die Eingabe dargestellt wird - wird sie über die Standardeingabe über einen Befehlszeilenparameter eingegeben? Sie sehen, all diese Freiheiten geben einer Interpretation Platz, die Sie als "falsch" markieren würden, während andere sie als "konform" beurteilen würden. NOFI, aber dies ist für einige von uns tägliche Praxis.
PatrickvL

Antworten:

20

Golfscript, 20

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

mit neuer Zeile, 21 Zeichen (von Nabb)

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

Eigentlich hat Nabb meine geschlagen, hier ist die Originallösung für mit neuer Leitung, 22 Zeichen

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

Dies erzeugt einfach eine Quellzeichenfolge und vergleicht sie nur mit der Zeichenfolge von stdin.

SIE
quelle
3
26,{).[96+]*}%n+=42`*für 21 (inkl. newline).
Nabb
Heh, es geht nicht ohne das, n+weil das Array nicht flach ist. Sie müssen entweder Ihre ursprünglichen 20 Zeichen beibehalten oder a hinzufügen ~, um die inneren Begriffe des Arrays zu reduzieren.
Nabb
@Nabb, heheh, ich wusste nicht, dass Newline es anders macht.
SIE
13

Ruby 1.9, 46 42 39 Zeichen

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

Angenommen, die Eingabe wird nicht mit einem Zeilenumbruch abgeschlossen.

Ventero
quelle
Wie sieht es mit der Newline aus?
Steenslag
2
@steenslag: Die Spezifikation sagt nichts aus, wenn die Eingabe durch einen Zeilenumbruch beendet wird. Diese Lösung geht also davon aus, dass es keinen gibt.
Ventero
11

C-Programm - 78 89

Bearbeiten: 42 nicht drucken, wenn zusätzliche Zeichen vorhanden sind.

Angenommen, die Eingabe enthält keine nachgestellte Newline.

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

Wenn das Präfix nicht übereinstimmt, wird das Programm beendet. Wenn das Präfix übereinstimmt, aber 1-3 zusätzliche Zeichen vorhanden sind, wird 2 gedruckt. Andernfalls wird ein undefiniertes Verhalten erzeugt.

Dies kann durch Ändern exit(1)von um ein Zeichen verkürzt werden fork(). Vergessen Sie nicht, alle offenen Dokumente zu speichern, falls Ihr System aus irgendeinem Grund abstürzt.

Joey Adams
quelle
1
Dies gibt 42 aus, wenn die Zeichenfolge länger als die gewünschte Zeichenfolge ist und das Präfix mit der gewünschten Zeichenfolge übereinstimmt.
Freitag,
8

PHP (60)

Angenommen, die Eingabe erfolgt in der Befehlszeile:

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

Erläuterung : Sie können die Zeichenfolge als Dreieckstruktur anzeigen.

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

Die Linie jbeginnt am Index i = j*(j+1)/2(das ist die Dreieckszahlformel). Das Lösen der quadratischen Gleichung führt dazu, dass der Index ionline ist j = int((sqrt(8*i+1)-1)/2)und daher Zeichen enthält 97 + int((sqrt(8*i+1)-1)/2). Der 0-350Indexbereich ermöglicht es uns, dies zu vereinfachen, dies 96.5 + sqrt(2*(i+1))gilt jedoch nicht mehr für größere Werte.

Bearbeiten : Auf die Kommandozeilen-Eingabe umgestellt, wie in den Kommentaren vorgeschlagen.
Bearbeiten : Verwendet einen bedingten Operator, um ein Zeichen zu speichern

sam hocevar
quelle
+1, das funktioniert;) Umm könntest du bitte erläutern, wie das $s.=chr(96.5+sqrt($i+=2));funktioniert?
Clyde Lobo
Bearbeitet Ich hoffe, es macht Sinn :-)
Sam Hocevar
für (; $ i <702;) $ s. = chr (96,5 + sqrt ($ i + = 2)); echo ($ s == $ argv [1]) * 42; Nur 61 Zeichen, vorausgesetzt, stdin Eingabe
Viper_Sb
@Viper_Sb: danke für den Hinweis; Ich war mir über die Regeln nicht sicher und ahmte Clydes Lösung nach. Ich werde mit Ihrem Vorschlag gehen.
Sam Hocevar
1
@ Powtac die Sprachsyntax benötigt hier kein Leerzeichen
Sam Hocevar
7

Perl, 35-43

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

Benötigt Perl 5.10 oder neuer (ausgeführt mit -E), keine Zeilenumbrüche in der Eingabe.

Ich mochte meine regex Nebenwirkungen besser, aber der kürzere Code hat gesprochen. Hier ist es als Andenken. Auch für Perl 5.10 oder höher gedacht, jedoch nur für erweiterte / experimentelle reguläre Ausdrücke. Daher ist nur eine pBefehlszeilenoption erforderlich.

$a=a;$_=/^(??{$b++;$a++."{$b}"}){26}$/&&42
JB
quelle
Ausgezeichnet. Ich habe versucht, diese rekursive Regex zu schlagen, konnte aber nicht unter 43c kommen. : - ((
Gummistiefel
Warum ist es notwendig zu sagen, $a++."{$b}"anstatt nur $a++.$b?
Timwi
@ Timwi, weil ich diese geschweiften Klammern brauche, um in der resultierenden Zeichenfolge zu erscheinen. Ich möchte nicht mit "d4" übereinstimmen, ich möchte "dddd", ausgedrückt als Regex "d {4}"
JB
Na sicher. Danke fürs Erklären!
Timwi
Habe dafür eine 33-Byte-Lösung gefunden! Probieren Sie es online!
Dom Hastings
7

05AB1E , 7 Bytes (nicht konkurrierend)

AƶJQi42

Probieren Sie es online!

Erläuterung

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

Mache einfach einige Herausforderungen durch, um 05AB1E (und das Golfen im Allgemeinen) zu lernen. Diese Herausforderung wurde gestern als aktiv markiert und ich habe eine kurze Lösung gefunden. Warum also nicht teilen? :)

Cinari
quelle
3
Willkommen bei PPCG!
Steadybox
6

Haskell-Programm - 71 67 64 57

Nimmt keine nachgestellte Zeile an und gibt auch keine aus.

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

Verwendungszweck:

$ 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
quelle
1
fwiw dieser code ist auch noch sehr gut lesbar.
Dan Burton
1
Da zipWithstoppt , wenn das Ende der kürzeren Liste erreicht, können Sie ersetzen ['a'..'z']mit ['a'..]3 Zeichen speichern.
Hammar
@ Hammar: Danke. Ich habe 1 Zeichen gespart, indem ich >> = (concatMap) anstelle von concat und zipWith verwendet habe.
Joey Adams
@ Hammar: Noch mehr gespart durch die Verwendung von do-Notation anstelle von >> = und Lambda :-)
Joey Adams
2
@ Joey: Oder noch besser:[c|c<-['a'..'z'],_<-['a'..c]]
Hammar
4

J, 29

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

Beispiel:

f 'oasijfiojasef'

f 23841235

f 'abbccc...'
42
Eelvex
quelle
Ich mag J. Und ich finde es hässlich und schrecklich. Und ich mag es.
Siehe auch
4

D: 94 Zeichen

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

Mehr leserlich:

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
quelle
3

Delphi, 164, 132

Dieser erstellt eine Zeichenfolge und vergleicht sie nur mit dem ersten Befehlszeilenargument. Es ist kürzer und weniger knifflig als meine andere Vorlage:

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.

(Beachten Sie , dass diese Version geht davon aus, dass die cund iVariablen bei 0 initialisiert beginnen, wie es der Fall in meiner Version von Delphi ist (2010).)

Wie meine andere Übermittlung benötigt diese weniger Zeichen, wenn der Stringaufbau nicht in einer Funktion stattfindet, wie ich es zuvor getan habe:

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.

Beachten Sie, dass für die Ausgabe kein Zeilenumbruch erforderlich ist, sodass aus WriteLn () Write () wurde.

PatrickvL
quelle
3

PHP - 45 Zeichen

Ich bin überrascht, dass niemand eine Antwort gepostet hat, die Hashing verwendet hat. Es ist eine sehr größeneffiziente Methode zum Testen der exakten Saite.

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

Die Daten können nur schwer kopiert / eingefügt werden, da sich in der Mitte des Codes ein Null-Byte befindet. Hier ist ein Hex-Dump des Codes zu Testzwecken.

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
quelle
2
Klug! Da es technisch gesehen andere Eingabewerte gibt, die denselben Hash ergeben, wird die Anforderung der Ausgabe von 42 nur dann nicht vollständig erfüllt, wenn die Eingabe im angegebenen Format vorliegt.
Mellamokb
3

Scala 79

 if((for(i <- 1 to 26;j<-1 to i)yield(96+i).toChar).mkString==args(0))print(42)
Lalith
quelle
3

Pyth, 14

*42qzsm*dhxGdG

Erstellt einfach die erforderliche Zeichenfolge, vergleicht sie mit der Eingabe und multipliziert sie mit 42.

isaacg
quelle
'vergleicht mit der Eingabe und multipliziert mit 42.' hätte ich mir nie gedacht. Du hilfst mir nur, 1 Charakter von meiner Lösung zu entfernen. Vielen Dank.
AndoDaan
Argh, ich bin zu spät gekommen. Kannst du erklären, wie es funktioniert? Die Funktion macht mmir Probleme ...
Jim
1
@Jim Wir beginnen mit der Map-Funktion, mdie auf jedes Element seiner Eingabe eine Funktion anwendet. Die Eingabe ist Gdas Alphabet. xGdFindet die Position des dBuchstabens im Alphabet im GAlphabet. herhöht das um eins und *drepliziert den Charakter so oft. Kombiniert außerhalb der mFunktion sdie resultierende Liste von Zeichenfolgen zu einer einzelnen Zeichenfolge und qzprüft dann , ob das Ergebnis mit der Eingabe übereinstimmt. Boolesche Werte werden als " 0Falsch" und " 1Wahr" dargestellt. Dies *42ergibt den Wert " 42Wahr" und " 0Falsch".
isaacg
3

Brachylog (2), 15 Bytes, Sprachnachstellung

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

Probieren Sie es online!

Und nun zu einer Antwort, die nach einem ganz anderen Prinzip funktioniert als die meisten, die hier zu sehen sind. Dies ist eine Funktionsübermittlung (die Frage gibt nicht an, welche Art von Übermittlung gewünscht wird, aber Funktionen sind standardmäßig zulässig).

Erläuterung

Diese Antwort definiert eine Art von Zeichenfolge: Diejenigen, die a) alle Kleinbuchstaben des Alphabets enthalten, b) in sortierter Reihenfolge sind und c) für die die Anzahl der Vorkommen jedes Zeichens in der Zeichenfolge eine Folge von aufeinanderfolgenden ergibt Ganzzahlen ab 1. (Es sollte klar sein, dass es viele solcher Zeichenfolgen gibt, aber die Zeichenfolge, die wir in Sonderfällen verwenden möchten, ist die kürzeste.) Wenn die Zeichenfolge diese Kriterien erfüllt, addieren wir 16 zur Anzahl der unterschiedlichen Zeichen in Zeichenfolge; Dies ergibt 42, wenn die Zeichenkette diejenige ist, die wir in einem Sonderfall fragen, und mindestens 43 in allen anderen Fällen. (Wenn die Zeichenfolge eines der Kriterien für die Zugehörigkeit zur Kategorie nicht erfüllt, endet die Funktion mit einem Fehler. Dies ähnelt dem Auslösen einer Ausnahme.)

So interpretieren Sie den Quellcode:

⊇Ạ∧?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}

quelle
3

R, 60 58

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

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

Danke für den Vorschlag von @giusppe

Kun Ren
quelle
Ich denke gerade pasteist hier in Ordnung, und Sie können scan(,"")anstelle von verwenden readline().
Giuseppe
2

Python (84)

Nimmt eine abschließende neue Zeile am Ende der Eingabe an.

Import sys
if ''. join (c * chr (c + 96) für c in range (27)) + '\ n' == sys.stdin.read (): print 42
Hoa Long Tam
quelle
1
Warum nicht raw_inputstattdessen verwenden sys.stdin.read?
Juan
1
@Juan: raw_inputliest nur eine einzelne Zeile; Ich war mir nicht sicher, ob "die Eingabe" immer eine einzelne Zeile sein würde oder ob die Eingabe in späteren Zeilen disqualifiziert werden könnte.
Hoa Long Tam
2

Python - 62 Zeichen

print("".join(x*chr(x+96) for x in range(27))==raw_input())*42
Knabberzeug
quelle
2
Könnte in Python 3 kürzer sein: print("".join(x*chr(x+96)for x in range(27))==input())*42.
mbomb007
2

Perl, 49 46 Zeichen

zur Verwendung in einem Programm, nicht in der Befehlszeile

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

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

Grüße

rbo

Bearbeiten: Idee aus Ventero gerissen

Gummistiefel
quelle
2

PHP 92 88 87 Zeichen

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

BEARBEITEN

Ersetzt $j<0mit $jund return $b==$a?42:0;mitecho $b==$a?42:0;

Ersetzt echo $b==$a?42:0;durchecho($b==$a)*42;

Clyde Lobo
quelle
2
Könnten 80 Zeichen sein, wenn nicht all die verdammten Dollarzeichen.
Joey Adams
Siehe auch meinen Eintrag für eine Single-Loop-Lösung.
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).
Core-Dump
quelle
2

JavaScript (91 93 94 98 102 116 )

Verwendung: Gibt a('string')zurück, 42wenn gemäß Spezifikation gültig, oder 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/

Bearbeiten : varZwei Leerzeichen in entfernt und entfernt for (.

Edit 2 : Geändert j>0zu j, und

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

Bearbeiten 3 : Initialisieren imit i='', ändern

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

Edit 4 : Ändern

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

Edit 5 : Ändern

  1. i=r='';while(i++<26) zu
  2. for(i=r='';i++<26;) und
  3. for(j=i;j;j--) zu
  4. for(j=i;j--;)
mellamokb
quelle
Nun, Sie können weitere 12 Zeichen reduzieren, wenn Sie keine varVariablen deklarieren;)
Clyde Lobo
@ Clyde: Danke! Auch festgestellt, dass ich Leerzeichen zwischen entfernen könnte for (.
Mellamokb
Yeah, wollte dasselbe vorschlagen;) Oh, und ich habe eine Lösung in PHP programmiert, die dieselbe Logik wie Ihre verwendet
Clyde Lobo
Sie können durch das Ersetzen noch 2 Zeichen speichern return(z==r)?42:0;mitreturn z==r?42:0
Clyde Lobo
j>0könnte nur jich denke sein.
SIE
2

JavaScript 1.8, 99 Zeichen

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

Ich wage dich, einen Sinn daraus zu machen :)

Casey Chu
quelle
2

PHP - 59

Es wird vorausgesetzt, dass mindestens 1 Eingang über cli bereitgestellt wird

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

Es funktioniert mehr oder weniger, mit der Ausnahme, dass md5 technisch mit dem Hashing-Algorithmus dupliziert werden kann.

syntaqx
quelle
2

PowerShell v2 +, 47 Byte

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

Erstellt einen Bereich 1..26, füttert diesen durch eine Schleife mit |%{...}. Bei jeder Iteration verwenden wir den Komma-Operator , um ein Array-Literal des Stroms [char]multipliziert mit der aktuellen Schleifennummer zu erstellen. Wir -joinkonstruieren dann alle zusammen den String abbcccdddd...und verwenden dann einen -ceqVergleich mit Groß- und Kleinschreibung gegen unsere Eingabe $args, was entweder $TRUEoder ergibt $FALSE. In PowerShell können boolesche Werte implizit als 1oder umgewandelt werden 0, was hier mit der geschieht 42*. Wird ausgedruckt, 42wenn die Eingabe ist, abbccc...zzzzzzzzzzzzzzzzzzzzzzzzzzund wird 0sonst ausgegeben .

AdmBorkBork
quelle
Sie könnten ein Byte speichern :) Versuchen Sie es online!
mazzy
2

K, 26 Bytes

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

Vielen Dank

Chromozorz
quelle
{$[x~.Q.a@&1+!26;42;]}für 22 Bytes.
Streetster
1
42*(&!27)~-96+"j"$für 18 Bytes (Portierung meiner OK- Antwort).
Streetster
2

VBA 91

Es gab keine VBA-Antworten, aber das funktioniert:

Function f(t)
    For i = 1 To 26
        o = o & String(i, Chr(i + 96))
    Next
    f = -42 * (t = o)
End Function
OSG
quelle
Ist es wirklich unmöglich, Leerzeichen daraus zu entfernen?
Esolanging Fruit
1
Kondensierte Version, 61 Bytes -o="":For i=1To 26:o=o &String(i,Chr(i+96)):Next:?-42*([A1]=o)
Taylor Scott
@ Challenger5 Nein, das ist nicht unmöglich. Taylors Scott-Kommentar ist genau das. Es wird im Direktfenster ausgeführt und übernimmt den Wert aus der Zelle A1als Eingabe.
Ingenieur Toast
2

APL (Dyalog) , 18 17 Bytes

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

Probieren Sie es online!

Vier offensichtliche Bytes können gespeichert werden, wenn wir Großbuchstaben verwenden dürfen.

42 42

/⍨ if (lit. repliziert von)

 Zeicheneingabe

 ist identisch mit

819⌶ die Kleinbuchstaben

⎕AEin Lphabet

/⍨ repliziert von

 eins durch

26 26

Adam
quelle
1

Clojure - 61 Zeichen

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

Nutzt die folgenden Fakten aus:

  • Clojure kann jeden String automatisch als Zeichenfolge interpretieren
  • Ich kann den Zahlenbereich von 1 bis 26 verwenden, um sowohl die Zeichen zu erstellen als auch die richtige Anzahl oder Anzahl zu wiederholen, um die "richtige" Eingabe zu generieren
mikera
quelle
würde 6 Zeichen sparen, wenn Clojure geschachtelte # () erlaubt ..... wichtige Feature-Anfrage für Clojure 1.4, denke ich!
mikera
1

Javascript 144

Kann wahrscheinlich deutlich verbessert werden, Rekursion war mir schon immer ein Kopf weit.

Komprimiert

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

Weniger komprimiert

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

Dieser liest die Zeichenkette von der Eingabe, vergleicht sie, schreibt 42, wenn die Eingabe bis zur letzten übereinstimmt 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.

Diese Version verwendet keine Funktion, die im Vergleich zur vorherigen Version dieser Technik einige Zeichen spart:

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.

Leider etwas lang, hauptsächlich wegen der langen Schlüsselwörter von Delphi und der Notwendigkeit, Konsolenanwendungen zu initialisieren, bevor sie Ausgaben schreiben können.

Beachten Sie auch, dass ich CmdLine um 77 Zeichen erhöht habe, da dies der Offset war, den ich zum Überspringen meines lokalen ausführbaren Pfads benötigte (Delphi hat keinen direkten Argumentzeiger). Passen Sie es an Ihre eigenen Einstellungen an (kann zu 1 Zeichen weniger führen, wenn der Versatz <10 ist).

PatrickvL
quelle
Sie können den Anwendungstyp unter ProjectOptions / DelphiCompiler / Linking / GenerateConsoleApplication festlegen. Sie können die program a;Zeile auch weglassen . Und die Klammern b^<>Char(c), i>0und i=27können entfernt werden.
Wouter van Nifterick
@Wouter van Nifterick: Danke für die Vorschläge, ich werde sie auch auf meine anderen Beiträge anwenden. (Ich wusste nicht einmal, if i>0thenwürde kompilieren!)
PatrickvL