Eine weitere brillante Frage von Stack Overflow wurde zu einer Code-Golf- Herausforderung!
Schreiben Sie ein Programm, das:
- Nimmt eine Zeichenfolge als eine Benutzereingabe (nicht verrohrt in oder Befehlszeilenargument). Der Datentyp der Eingabe muss eine Zeichenfolge sein. Wenn die Sprache bei der Eingabe automatisch ausgewertet wird, muss sie in eine Zeichenfolge umgewandelt werden.
- Findet den Index (basierend auf 0 oder 1) der ersten niedrigsten geraden Ziffer .
- Gibt 2 Ganzzahlen , den Index und die niedrigste gerade Ziffer aus .
- Wenn es keine gerade Ziffer gibt , geben Sie -1 als Index zurück. Die zweite Zahl kann eine beliebige Zahl sein.
- Im Sinne dieser Null ist das nicht gerade .
Testbeispiele mit der Zeichenfolge links geben die Werte rechts aus:
25376 --> 0,2
523726 --> 1,2
583746 --> 4,4
53771 --> -1,0
_4___2 --> 5,2
Der Gewinner: ist das Programm mit der niedrigsten Zeichenanzahl. Keine Boni, keine Strafen.
edit: (about stdin) Ich habe den Benutzereingabeteil vermasselt, im Grunde keine Piping-Daten und keine Befehlszeilenargumente. Sie müssen eine Benutzereingabeaufforderung innerhalb des Programms selbst bereitstellen.
Antworten:
Golfscript, 26 (28) Zeichen
Beispiel:
Live-Test: http://golfscript.apphb.com/?c=Oyc1Mzc3MScKLicyNDYnJjgrJDE8LjA9QD8%3D
Erläuterung:
'#{gets}'
ist eine Flucht nach Ruby, um die E / A-Anforderungen zu erfüllen; STDIN wird als leer angenommen.
Klont die Eingabe'246'&8+
findet, welche geraden Ziffern in der Eingabe vorhanden sind, außer8
wird immer beibehalten$1<
sortiert die Liste, nimmt dann die erste Ziffer, behält sie aber als Zeichenfolge bei.@\?
ordnet den Stapel {Ziffer, Eingabe, Ziffer} an und findet dann die Ziffer in der Eingabe; danke @peterTaylor, dass du mich auf die Signatur von [array, array] aufmerksam gemacht hast?
.Ich war dieses Mal sehr kühn mit der Interpretation der Spezifikationen. nämlich:
:x?x
zu beheben (ich mag keine temporären Variablen.n@
(das führt auch den Swap durch),n\
(das nicht) oder]`
(das formatiert die Ausgabe als["8" -1]
).quelle
.0=@?
mit.@\?
oder:x?x
ein Zeichen und vermeiden , dass die Zweifel über die Reihenfolge zu speichern. Netter Einsatz8
als Fallback.APL (37)
(1-basiert standardmäßig, aber gehorcht
⎕IO
)Erläuterung:
⍞
: Benutzereingabe lesenm←⍵/⍨⍵∊'2468'
: Entfernen Sie alle Zeichen, die nicht2468
in gespeichert sindm
.×⍴m
: sehen, ob es welche gibt:
: Wenn ja:z←⌊/⍎¨m
: werte jedes Zeichen in ausm
, finde die niedrigste Zahl und speichere inz
.z,⍨⍵⍳⍕z
: Liefert den Index vonz
in⍵
, gefolgt vonz
.⋄
: Wenn nicht:¯1,0
: Rückkehr(-1, 0)
quelle
Python 3, 69
Ideen von hier kombinieren .
quelle
Ruby, 60 Zeichen
$_
enthält die zuletzt gelesene Eingabe vongets
.p
ruftinspect
die Argumente auf und druckt die Ergebnisse aus.quelle
Perl - -
94- 53 Zeichen (oder 48)Anstelle des
index()
nullbasierten Ansatzes verwenden wirpos
und beginnen bei eins. kein CPAN. Führen Sie dies mit ausperl -nE
und es wartet auf Eingaben (von denen es auch empfangen kannSTDIN
).Die erste match (
//
) - Operation bearbeitet den Standardwert ($_
) aus der Eingabe, vergleicht ihn mit den angegebenen geraden Zahlen,sort
fügt die Übereinstimmungen in ein Array ein und speichert sie in einer "skalaren Liste"($m)
. Im skalaren Kontext ist der Listenwert des sortierten Arrays ein Element lang und besteht somit aus der niedrigsten übereinstimmenden geraden Ziffer in der Zahl.Nachdem wir die niedrigste gerade übereinstimmende Ziffer isoliert haben, verwenden wir
$m
für eine zweite Übereinstimmungsoperation, die das erste Vorkommen des Werts von$m
in der ursprünglichen Zeichenfolge findet. Wir verwenden hier immer noch den Standardwert$_
und speichern die Übereinstimmung gegen den Inhalt von$m
in$1
(den Grund für das()
Herum$m
in der zweiten Anweisung). Danachpos
undsay
erledigen Sie den Rest (und in weniger Zeichen alsindex
undprint
).Wenn die Ausgabereihenfolge oder Kommas keine Rolle spielen, können Sie diese 5 Zeichen kürzer machen:
Bei meinem früheren Versuch habe ich mich beeilt und einen Fehler gemacht - ich wollte nur Python und Ruby besiegen (aber es ist fehlgeschlagen) ... seufz.
Herzlichen Glückwunsch an den Gewinner und die anderen Teilnehmer zu ihren coolen Lösungen - insbesondere an
perl6
:-) Eine mögliche Perl6-Anpassung dieses Ansatzes könnte ".comb
(vorgeschlagen auf freenode von Masak et al. ).quelle
$SHELL
. Diese Arbeitsversion ist lächerlich lang und peinlich. Geschieht mir recht: wird später verkürzen, um Scham zu vermeiden :-(if(/[2468]/){for$i(2,4,6,8){if(index($_,$i)>-1){say$i,",",index($_,$i)+1;last}}}else{say"0,-1"}
($m)=sort/[2468]/g;/$m/g;say$&?pos.",$&":"-1,0"
(47 + 1 Byte, AFAIK-n
kostet ein zusätzliches Byte).pos
Gibt den Offset zurück. Tatsächlich gibt es in Ihrem Beispiel also einen auf 1 basierenden Index zurück.perl
‚s-M
jedes Mal gewinnen würde ;-)Perl 6,
375560 ZeichenEDIT: Ich habe die Frage das erste Mal falsch verstanden. Dieses Update sollte korrekt sein. Es findet die niedrigste Zahl von 2,4,6 oder 8, die die Eingabe enthält, und führt dann eine Regex-Übereinstimmung mit der Eingabe mit der niedrigsten Zahl durch.
$/.from
Ruft die Position der Übereinstimmung ab und',', $/.Int
ist ein Komma plus die Übereinstimmung selbst oder 0, wenn der Text nicht übereinstimmt.Während du hier bist, stimme G. Cito zu , der mir geholfen hat, meinen Eintrag in den Kommentaren und auf irc zu korrigieren :)
quelle
$/.from
wenn nichts gefunden wird (dies ist möglicherweise ein Fehler in meiner alten Version von Rakudo). Hier ist eine Variation Ihrer Lösung, die funktioniert ( Für mich!)my$x=get;for 2,4,6,8 ->$n{if $x~~/$n/ {say $/.from,",$/";exit}};say "-1 0";
Kommt mit 75 Zeichen, aber ich bin sicher, dass eine kürzere Perl6-Lösung hergestellt werden kann.my $n; $_="333992";$n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/"
. Ich habe vor.comb
ungefähr 20 Minuten erfahren und es gefällt mir bereits :-)J, 44 Zeichen
Gibt das letzte Zeichen der Eingabe aus, wenn keine gerade Ziffer gefunden wird
Beispiel:
Erläuterung:
echo ... i=.1!:1]1
ist Eingabe / Ausgabe. Viel länger als ich will. Die Eingabe wird in gespeicherti
.'2468'i.~
Findet das erste Vorkommen jeder geraden Ziffer in der Eingabe und gibt die Länge der Eingabe zurück, wenn die Ziffer nicht gefunden werden kann(#~(#i)&>)
lautet "Auswahl, wenn die Länge der Eingabe größer ist"; Wählen Sie mit anderen Worten die Indizes aus, die in die Eingabe zeigen. Viel länger als ich will._1,~
Fügt -1 nach hinten hinzu. Der Unterstrich ist die Art und Weise, wie J negative Werte darstellt.{.
Wählt das erste Element aus(;{&i)
verkettet es mit dem eingegebenen Zeichen an dieser Position in zwei Feldern; Da wir eine Zahl mit einem Zeichen verketten, ist eine Verkettung ohne Boxing (,
) nicht möglich. Wenn eine Anzeige ohne Box gewünscht wird, muss der Index":
zuerst mit zwei Zeichen formatiert werden ( ).quelle
Python 2.7 - 76
Eine Referenzantwort, von der ich voll und ganz erwarte, dass sie geschlagen wird. Aber um die Leute anzufangen:
quelle
index
zufind
; Sie können auch ändern ,[2,4,6,8]
um2,4,6,8
(vorne mit Platz).print[(s.find(`e`),e)for e in 2,4,6,8if`e`in s+'8'][0]
print[(s.index(c),c)for c in'2468'if c in s][0]or(-1,0)
R 104
Beispiele (in R beginnt der Index bei 1):
quelle
Powershell,
767371$s=read-host
speichert Benutzereingaben in$s
2,4,6,8|%{...}
Läuft, was in den{}
Ziffern 2, 4, 6 und 8 enthalten ist$i=$s.indexof("$_")+1
Setzt$i
auf 1-basierten Index einer Ziffer in$s
oder0
wenn die Ziffer nicht gefunden wirdif( $i=... ){...}
Die Bedingung ist erfüllt, wenn dies$i
nicht der Fall ist0
"$i,$_";break
gibt den Index und die Ziffer aus und stoppt die Ausführung"-1,0"
sonst Ausgänge-1,0
quelle
$s=read-host;(2,4,6,8)|%{if(($i=$s.indexof("$_"))-gt-1){"$i,$_";break}};'-1,0'
2,4,6,8
unnötig sind.if(1+($i=$s.indexof("$_")))
C ++ 11, 173 (einschließlich zweier Zeilenumbrüche)
Hier ist die komprimierte Version:
Hier ist die lesbare Version:
Hier ist eine ältere Version:
C ++ 11, 175 (einschließlich zweier Zeilenumbrüche)
Hier ist die komprimierte Version:
Hier ist die lesbare Version:
quelle
#define o std::cout<<
. Ich denke, es schneidet Ihren Code um 1 Zeichen.k==c?std::cout<<(...),throw 0:0;
- Der bedingte Operator kann ersetzenif
, wenn Sie nur Ausdrücke benötigen.throw
ist ein Ausdruck und auch ein Zeichen kürzer alsreturn
.C, 80 Zeichen
quelle
C # - 124
Ich bin ein bisschen zu spät zur Party
quelle
Haskell, 79 Zeichen
Dies läuft mit der Ausgabeformatierung etwas schnell und locker ab:
quelle
PowerShell:
145103Code:
Exemplarische Vorgehensweise:
"
..."
Alles in den Anführungszeichen wird in die Ausgabe einbezogen.$(
...)
Alles zwischen den Klammern wird als Befehl behandelt, und die Ausgabe dieses Codes wird anstelle der Befehle selbst eingeschlossen.[array]::IndexOf(
...)
Dies wird verwendet, um den Index eines Elements mit dem Array abzurufen. Der erste Parameter ist das zu durchsuchende Array-Objekt. Der zweite Parameter ist das zu findende Objekt. Dies gibt nur den Index des ersten übereinstimmenden Elements aus. Ich habe einfach versucht, eineIndexOf
Methode direkt gegen$s
(zB:$s.IndexOf($x)
, aber dies schlägt aus irgendeinem Grund fehl, den ich noch nicht herausgefunden habe - es wird behauptet, dass die Methode für dieses Objekt nicht existiert.(
...)
Ausdruck in der Klammer ist der erste Parameter fürIndexOf
.$s=
$ s ist eine Variable zum Speichern der Benutzereingaben.(read-host)-split''
Ruft Benutzereingaben ab und teilt sie in ein Array von Zeichen auf.`|?{$_}
Filtert zusätzliche leere Array-Elemente heraus, die von generiert werden-split''
.,(
...)
Ausdruck in der Klammer ist der zweite Parameter fürIndexOf
.$x=
$ s ist eine Variable zum Speichern der niedrigsten geraden Ziffer aus der Benutzereingabe.$s|?{$_%2-eq0}
Zieht die geraden Zahlen aus $ s heraus.|?{$_-gt0}
Ungültig macht null.|sort
Sortiert die restlichen Objekte in aufsteigender Reihenfolge.|select -f 1
Wählt das erste Objekt aus, bei dem es sich inzwischen um die niedrigste gerade Ziffer handelt.,$x
Der obige Code gibt den Index der niedrigsten geraden Ziffer aus. Dies fügt ein Komma hinzu und gibt dann die Ziffer selbst aus.Anmerkungen:
Dies ist vielleicht ein bisschen Stretching Regel # 4. Wenn es keine gerade Zahl gibt, enthält die Ausgabe keine zweite Zahl.
Dies wird auch einige nicht-terminierende Fehler auslösen, wenn die Eingabe nicht-numerische Elemente enthält. Das Skript wird weiterhin ausgeführt und gibt eine ordnungsgemäße Ausgabe aus. Möglicherweise möchten Sie dies
$ErrorActionPreference
jedoch'SilentlyContinue'
vor dem Ausführen festlegen .quelle
$s.IndexOf
? Es gab mir einen Fehler zu sagen, dass die Methode für dieses Objekt nicht existierte, obwohl$s|gm
gesagt wurde, dass dies der Fall war. Es funktioniert auf dem System, auf dem ich mich gerade befinde, aber nicht auf dem, auf dem ich es heute versucht habe. Handelt es sich um ein Versionskompatibilitätsproblem? Früheres System war PSv2, aktuell ist PSv4.$s
iststring[]
und$s.indexof
funktioniert nicht, weil...[System.String[]] doesn't contain a method named 'indexOf'
das vernünftig erscheint (ich verwende PS 2.0).$s|gm
gibt Mitglieder vonSystem.String
, nicht zurückSystem.String[]
. Ich bin mir nicht sicher, warum das so ist.vb.net (108c)
Riecht leicht, da es die dynamische Einstellung von VB ausnutzt. Option Explicit Off und Importiert System.Console .
quelle
VB.net (193c) mit LINQ
Dieser verwendet hauptsächlich eine LINQ-Abfrage.
quelle
Golf-Basic 84, 91 Zeichen
0
der Eingang (nicht einmal, wer hat gesagt, dass er ungerade sein muss?)quelle
Borowski-Schale (sh), 88 Zeichen
Ich dachte, ich würde zum Spaß eine Saitenverarbeitungssache machen. Technisch liest es von stdin, aber wenn Sie es interaktiv ausführen, fordert es den Benutzer zur Eingabe auf, da die Tastatur der Standard-stdin-Stream ist. Verwendet grundlegende Shell-Befehle, um die Eingabe in Zeilen aufzuteilen, zu nummerieren (mit dem nicht bekannten
nl
Dienstprogramm), die den Kriterien entsprechenden Zeilen herauszufiltern, zu sortieren und die niedrigste Ziffer auszugeben.88 -1
Wird gedruckt, wenn keine gerade Ziffer gefunden wurde.quelle
C ++ - 223
221Zeichen:Lesbare Version:
Es ist lang, aber nicht so schlimm wie Java.
quelle
Javascript 93 Zeichen
Holen Sie sich alle Ereignisnummern, sortieren Sie das Array und drucken Sie die erste Ziffer.
quelle
Mathematica, 157 Zeichen
quelle
Julia, 84
Julia braucht wirklich einen kürzeren Weg, um Input zum Golfen zu bekommen. Ich zählte die Definition von
f
und einen Anruf anf
. Eine Indizierung basiert darauf, warum sich die Antworten von den Beispielen unterscheiden.quelle
JavaScript - 53 Zeichen
Liest die Eingabe von der Eingabeaufforderung und gibt (an die Konsole) das niedrigste gerade Zeichen und (ohne Begrenzer) den ersten Index dieses Zeichens aus. Wenn es keine geraden Zeichen ungleich Null gibt, wird ausgegeben
8-1
.quelle
C, 110 Zeichen
ungolfed:
quelle
Javascript, 69
Liest den Wert und durchläuft jedes Zeichen. Wenn die Zahlendarstellung mod 2 gleich 0 ist und die Zahl kleiner als die bereits gespeicherte Zahl ist
b
, ersetzen Sie die Werte inb
quelle
Rebol, 69
quelle
Rubin 55
quelle
JavaScript / jQuery 149
Golf gespielt
Volle Quelle
quelle