Hausaufgaben Zeit! Finden Sie mich die niedrigste gerade Ziffer in einer Zeichenfolge

12

Eine weitere brillante Frage von Stack Overflow wurde zu einer Herausforderung!

Schreiben Sie ein Programm, das:

  1. 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.
  2. Findet den Index (basierend auf 0 oder 1) der ersten niedrigsten geraden Ziffer .
  3. Gibt 2 Ganzzahlen , den Index und die niedrigste gerade Ziffer aus .
  4. Wenn es keine gerade Ziffer gibt , geben Sie -1 als Index zurück. Die zweite Zahl kann eine beliebige Zahl sein.
  5. 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.

Gemeinschaft
quelle
4
Was ist, wenn die niedrigste gerade Ganzzahl aus zwei Ziffern besteht? Ok, es war ein Witz.
Dr. Belisarius
5
Was ist los mit stdin?
John Dvorak
1
@ JanDvorak Weil willkürliche Regeln, deshalb.
7
Warum ist die Begrenzung von Null nicht gerade? Das scheint ziemlich seltsam.
Iszi
3
Ihre Eingabeanforderungen machen wirklich keinen Sinn: Bei den meisten Systemen erfolgt die Eingabe über stdin, unabhängig davon, ob Sie vom Programm dazu aufgefordert werden oder nicht. Ob der Eingang eingespeist wird oder nicht, wird vom Programm gesteuert. - Wenn Sie Benutzer ein interaktives Programm erstellen lassen wollten, sollten Sie die Ein- und Ausgabe (einschließlich der Formatierung) und die erforderliche Interaktion genau kennen.
MtnViewMark

Antworten:

6

Golfscript, 26 (28) Zeichen

'#{gets}'.'246'&8+$1<.@\?

Beispiel:

;'583746'
.'246'&8+$1<.@\?
#44

;'53771'
.'246'&8+$1<.@\?
#8-1

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ßer 8wird 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:

  • Die Spezifikation schreibt nicht vor, in welcher Reihenfolge die ganzen Zahlen ausgegeben werden. Verwenden Sie den Vorschlag des anderen @ Peter, um das Problem :x?xzu beheben (ich mag keine temporären Variablen.
  • Für die Angabe ist kein Trennzeichen zwischen den beiden Ganzzahlen erforderlich. Da es sich bei der gefundenen Ziffer immer um eine einzelne Ziffer handelt, spielt dies keine große Rolle. Wenn dies der Fall ist, hängen Sie an n@(das führt auch den Swap durch), n\(das nicht) oder ]`(das formatiert die Ausgabe als ["8" -1]).
John Dvorak
quelle
Sie sind nicht verrückt Anforderungen, sie sind beliebige Anforderungen: P
Die Spezifikation erfordert auch, dass der Index an erster Stelle steht, aber ich kann GolfScript nicht gut genug lesen, um festzustellen, ob Sie dies nicht getan haben
@LegoStormtroopr der einzige Punkt in der Spezifikation, der die Reihenfolge erwähnt, ist # 4: "Wenn es keine gerade Ziffer gibt, geben Sie -1 als Index zurück, die zweite Zahl kann alles sein". # 3 gibt die Reihenfolge nicht an; Was ist mit der Kühnheit ohne Begrenzer?
John Dvorak
Oh Schnappschuss, Sie sind richtig, Sir! Ich erwähnte die beiden auszugebenden Zahlen, aber nicht die Reihenfolge. Ich stehe korrigiert!
Sie können ersetzen .0=@?mit .@\?oder :x?xein Zeichen und vermeiden , dass die Zweifel über die Reihenfolge zu speichern. Netter Einsatz 8als Fallback.
Peter Taylor
5

APL (37)

(1-basiert standardmäßig, aber gehorcht ⎕IO)

{×⍴m←⍵/⍨⍵∊'2468':z,⍨⍵⍳⍕z←⌊/⍎¨m⋄¯1,0}⍞

Erläuterung:

  • : Benutzereingabe lesen
  • m←⍵/⍨⍵∊'2468': Entfernen Sie alle Zeichen, die nicht 2468in gespeichert sind m.
  • ×⍴m: sehen, ob es welche gibt
  • :: Wenn ja:
    • z←⌊/⍎¨m: werte jedes Zeichen in aus m, finde die niedrigste Zahl und speichere in z.
    • z,⍨⍵⍳⍕z: Liefert den Index von zin , gefolgt von z.
  • : Wenn nicht:
    • ¯1,0: Rückkehr (-1, 0)
Marinus
quelle
1
Wow, ich habe APL geschlagen (nicht mit der J-Lösung, aber immer noch ...)
John Dvorak
Erläuterung? APL ist so selbsterklärend ...;)
german_guy
3

Python 3, 69

Ideen von hier kombinieren .

s=input();print(([(s.find(x),x)for x in'2468'if x in s]+[(-1,0)])[0]) 
War ich
quelle
Ich mag die Verwendung eines Strings anstelle einer Liste und das daraus resultierende Weglassen der (jetzt entfernten) Anführungszeichen.
SimonT
@boothby Vermutlich haben Sie nicht bemerkt, dass ich Python 3 verwende. In Python 3 input () Akzeptiert einen String als Benutzereingabe.
Wasi
@SimonT `(Backticks) sind nicht nur Anführungszeichen. Es ist ein veralteter Alias ​​für repr () in Python 2. In Python 3 ist er jedoch nicht mehr verfügbar. Wenn ich also `` in Python 3 verwenden möchte, muss ich repr (etwas) schreiben, das 4 weitere Zeichen kostet. Deshalb werde ich es los;)
Wasi
@Wasi ja tatsächlich mein Fehler.
Stand
@Wasi, ja danke. Mir war das bewusst und mit "jetzt entfernt" meinte ich eigentlich entfernt als Teil der Sprache insgesamt. Prost.
SimonT
3

Ruby, 60 Zeichen

x=gets.chars.sort.find{|c|c=~/[2468]/};p x ?$_.index(x):-1,x
  • $_enthält die zuletzt gelesene Eingabe von gets.
  • pruft inspectdie Argumente auf und druckt die Ergebnisse aus.
richtig falten
quelle
3

Perl - - 94 - 53 Zeichen (oder 48)

Anstelle des index()nullbasierten Ansatzes verwenden wir posund beginnen bei eins. kein CPAN. Führen Sie dies mit aus perl -nEund es wartet auf Eingaben (von denen es auch empfangen kann STDIN).

Die erste match ( //) - Operation bearbeitet den Standardwert ( $_) aus der Eingabe, vergleicht ihn mit den angegebenen geraden Zahlen, sortfü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 $mfür eine zweite Übereinstimmungsoperation, die das erste Vorkommen des Werts von $min der ursprünglichen Zeichenfolge findet. Wir verwenden hier immer noch den Standardwert $_und speichern die Übereinstimmung gegen den Inhalt von $min $1(den Grund für das ()Herum $min der zweiten Anweisung). Danach posund sayerledigen Sie den Rest (und in weniger Zeichen als indexund print).

perl -nE'($m)=sort/[2468]/g;/($m)/g;$1?say pos.",$1":say"-1,0"'
33467
3,4

Wenn die Ausgabereihenfolge oder Kommas keine Rolle spielen, können Sie diese 5 Zeichen kürzer machen:

($m)=sort/[2468]/g;/($m)/g;$1?say$1.pos:say"-10"

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

$_=get;my $n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/"
G. Cito
quelle
War so darauf fokussiert, Python / Ruby zu schlagen, dass ich einen Einzeiler postete, der nicht funktionierte, wenn keine geraden Zahlen vorhanden waren $SHELL. Diese Arbeitsversion ist lächerlich lang und peinlich. Geschieht mir recht: wird später verkürzen, um Scham zu vermeiden :-(
G. Cito
Älterer Hack: if(/[2468]/){for$i(2,4,6,8){if(index($_,$i)>-1){say$i,",",index($_,$i)+1;last}}}else{say"0,-1"}
G. Cito
2
Gut, aber Platz bleibt für weiteres Golfen: ($m)=sort/[2468]/g;/$m/g;say$&?pos.",$&":"-1,0"(47 + 1 Byte, AFAIK -nkostet ein zusätzliches Byte).
Heiko Oberdiek
NB. posGibt den Offset zurück. Tatsächlich gibt es in Ihrem Beispiel also einen auf 1 basierenden Index zurück.
Draegtun
@ draegtun oopsie :-) danke. @Heiko stimmt das: Schalter sollten sonst zählenperl ‚s -Mjedes Mal gewinnen würde ;-)
G. Cito
3

Perl 6, 37 55 60 Zeichen

$_=get;say m/<{~.comb(/<[2468]>/).min}>/.from//-1,',',$/.Int

EDIT: 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. $/.fromRuft die Position der Übereinstimmung ab und ',', $/.Intist 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 :)

Mouq
quelle
1
Leider wird die erste gerade Zahl (2468) gefunden und nicht die niedrigste :( NB. Es gibt auch ein Problem, $/.fromwenn 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.
Draegtun
@draegtun ... Ich habe gestern bei meinem Perl5-Versuch einen ähnlichen Fehler gemacht (siehe unten). Mein Fix hat 70 Zeichen hinzugefügt! Habe es gerade mit einer ~ 50 char Version aktualisiert - was anscheinend funktioniert. Ich denke, wenn Sie alle geraden Ziffern in der Zahl sortieren, können Sie eine Übereinstimmung mit der (jetzt) ​​ersten Ziffer in der Sortierung herstellen und sicherstellen, dass Sie die niedrigste und die erste haben. Habe ich recht?
G. Cito
@ G.Cito Sieht für mich gut aus und hat schon +1 auf deine Antwort. Ich sehe, wie ich ein paar Zeichen abschneiden kann, aber ich sehe Heiko noch besser als das, was ich vorschlagen wollte!
Draegtun
@ Draegtun Oh, meine Güte, ich habe die Frage dann völlig falsch verstanden :( Vielen Dank! Ich werde dies so schnell wie
möglich
@mouq Hier ist ein Ansatz ein, der den gleichen Ansatz wie das perl5 Beispiel verwendet ich unten geschrieben: my $n; $_="333992";$n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/". Ich habe vor .combungefähr 20 Minuten erfahren und es gefällt mir bereits :-)
G. Cito
2

J, 44 Zeichen

echo(;{&i){._1,~(#~(#i)&>)'2468'i.~i=.1!:1]1

Gibt das letzte Zeichen der Eingabe aus, wenn keine gerade Ziffer gefunden wird

Beispiel:

   echo(;{&i){._1,~(#~(#i)&>)'2468'i.~i=.1!:1]1
523726
+-+-+
|1|2|
+-+-+
   echo(;{&i){._1,~(#~(#i)&>)'2468'i.~i=.1!:1]1
53771
+--+-+
|_1|1|
+--+-+

Erläuterung:

  • echo ... i=.1!:1]1ist 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 ( ).
John Dvorak
quelle
2

Python 2.7 - 76

Eine Referenzantwort, von der ich voll und ganz erwarte, dass sie geschlagen wird. Aber um die Leute anzufangen:

s=raw_input()
print[(s.index(`e`),e)for e in[2,4,6,8]if`e`in s][:1]or(-1,0)

quelle
3
Sie können durch eine Änderung aus einem Charakter rasieren indexzu find; Sie können auch ändern , [2,4,6,8]um 2,4,6,8(vorne mit Platz).
Justin
4
Kürzere:print[(s.find(`e`),e)for e in 2,4,6,8if`e`in s+'8'][0]
grc
4
Ich denke du hast deine eigene Regel gebrochen ... Seit wann ist raw_input nicht mehr Standard?
Cruncher
1
print[(s.index(c),c)for c in'2468'if c in s][0]or(-1,0)
Eric
2

R 104

y=as.integer(strsplit(scan(,""),"")[[1]]);z=which(!y%%2&y);a=z[which.min(y[z])];cat(a,"-1 0"[!sum(a)],y[a])

Beispiele (in R beginnt der Index bei 1):

_4_502
6  2

_3_501
-1 0 

583746
5  4
Sven Hohenstein
quelle
2

Powershell, 76 73 71

$s=read-host;2,4,6,8|%{if($i=$s.indexof("$_")+1){"$i,$_";break}};"-1,0"
  • $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 $iauf 1-basierten Index einer Ziffer in $soder 0wenn die Ziffer nicht gefunden wird
  • if( $i=... ){...} Die Bedingung ist erfüllt, wenn dies $inicht der Fall ist0
  • "$i,$_";break gibt den Index und die Ziffer aus und stoppt die Ausführung
  • "-1,0" sonst Ausgänge -1,0
Danko Durbić
quelle
Dies gibt nicht den richtigen Index aus. In PowerShell beginnen die Indizes wie in den für die Frage angegebenen Testfällen bei Null.
Iszi
1
Regel 2 besagt, dass der Index 0 oder 1 sein kann.
Danko Durbić
Oh. Hab das nicht bemerkt. In beiden Fällen handelt es sich um eine nullbasierte Variante, die nur 5 Zeichen länger ist. $s=read-host;(2,4,6,8)|%{if(($i=$s.indexof("$_"))-gt-1){"$i,$_";break}};'-1,0'
Iszi
Außerdem bin ich mir ziemlich sicher, dass die Klammern 2,4,6,8unnötig sind.
Iszi
Die auf Null basierende Variante kann um 2 Zeichen verlängert werden, wenn Sie die if-Bedingung in:if(1+($i=$s.indexof("$_")))
Danko Durbić,
2

C ++ 11, 173 (einschließlich zweier Zeilenumbrüche)

Hier ist die komprimierte Version:

#include<iostream> 
#include<string> 
int main(){std::string s;std::cin>>s;for(char c:"2468")for(char&k:s)if(k==c){std::cout<<(&k-&s[0])<<','<<c;return 0;}std::cout<<"-1,8";}

Hier ist die lesbare Version:

#include<iostream>
#include<string>
int main() {
    std::string s; // auto s = ""s; (since C++14: -3 characters)
    std::cin >> s;
    for (char c : "2468")
        for (char& k : s)
            if (k == c) {
                std::cout << (&k - &s[0]) << ',' << c;
                return 0;
            }
    std::cout << "-1,8";
}

Hier ist eine ältere Version:

C ++ 11, 175 (einschließlich zweier Zeilenumbrüche)

Hier ist die komprimierte Version:

#include<iostream>
#include<string>
int main(){std::string s;std::cin>>s;for(char c:"2468"){int i=s.find(c);if(i<s.size()){std::cout<<i<<','<<c;return 0;}}std::cout<<"-1,8";}

Hier ist die lesbare Version:

#include<iostream>
#include<string>
int main() {
    std::string s;
    std::cin >> s;
    for (char c : "2468") {
        int i = s.find(c);
        if (i < s.size()) {
            std::cout << i << ',' << c; 
            return 0;
        }
    }
    std::cout << "-1,8";
}
Schuh
quelle
Versuchen Sie es #define o std::cout<<. Ich denke, es schneidet Ihren Code um 1 Zeichen.
@ user2509848, nein, es sind eigentlich 2 Zeichen länger. Aber trotzdem danke :)
Schuh
k==c?std::cout<<(...),throw 0:0;- Der bedingte Operator kann ersetzen if, wenn Sie nur Ausdrücke benötigen. throwist ein Ausdruck und auch ein Zeichen kürzer als return.
MSalters
1

C, 80 Zeichen

main(){char a[81],b=strcspn((gets(a),a),"2468");printf("%d,%c",a[b]?b:-1,a[b]);}
Makarov
quelle
1

C # - 124

Ich bin ein bisschen zu spät zur Party

void Main(string[]a){var x=a[0].Where(w=>char.IsDigit(w));var y=x.Min();Console.Write(y%2==0?a[0].IndexOf(y)+","+y:"-1,0");}
jzm
quelle
0

Haskell, 79 Zeichen

s&d=filter((==d).snd)$zip[-1..]$'0':s
main=interact$show.head.("24680">>=).(&)

Dies läuft mit der Ausgabeformatierung etwas schnell und locker ab:

& echo 523726 | runhaskell 16083-LowEven.hs 
(1,'2')
& echo 583746 | runhaskell 16083-LowEven.hs 
(4,'4')
& echo 53771 | runhaskell 16083-LowEven.hs 
(-1,'0')
& echo _4___2 | runhaskell 16083-LowEven.hs 
(5,'2')
& echo 25376 | runhaskell 16083-LowEven.hs 
(0,'2')
MtnViewMark
quelle
0

PowerShell: 145 103

Änderungen vom Original
Fehlerquelch per Kommentar vom Fragesteller entfernt.

Code:

"$([array]::IndexOf(($s=(read-host)-split''|?{$_}),($x=$s|?{$_%2-eq0}|?{$_-gt0}|sort|select -f 1))),$x"

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, eine IndexOfMethode 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ür IndexOf.

$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ür IndexOf.

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

,$xDer 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 $ErrorActionPreferencejedoch 'SilentlyContinue'vor dem Ausführen festlegen .

Iszi
quelle
@DankoDurbić Jetzt, wo du mich besiegt hast, kannst du mir helfen, herauszufinden, warum ich das hier nicht verwenden kann $s.IndexOf? Es gab mir einen Fehler zu sagen, dass die Methode für dieses Objekt nicht existierte, obwohl $s|gmgesagt 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.
Iszi
Dein $sist string[]und $s.indexoffunktioniert nicht, weil ...[System.String[]] doesn't contain a method named 'indexOf'das vernünftig erscheint (ich verwende PS 2.0). $s|gmgibt Mitglieder von System.String, nicht zurück System.String[]. Ich bin mir nicht sicher, warum das so ist.
Danko Durbić
0

vb.net (108c)

Sub Main()
t=ReadLine()                          '12c
For Each c In "2468"                  '20c  
i=t.IndexOf(c)                        '14c
If i>=0 Then Exit For                 '21c
Next                                  ' 4c
WriteLine("{0},{1}",i,If(i<0,0,t(i))) '37c
End Sub

Riecht leicht, da es die dynamische Einstellung von VB ausnutzt. Option Explicit Off und Importiert System.Console .

Adam Speight
quelle
0

VB.net (193c) mit LINQ

Dieser verwendet hauptsächlich eine LINQ-Abfrage.

Dim r = From d In "2468" Group Join q In ReadLine.Select(Function(c, p) New With {.c = c, .i = p})
                              On d Equals q.c Into g = Group
                                        Skip While g.Count = 0 ' 138c
WriteLine(If(r.Any,r(0).g(0).i&","&r(0).g(0).c,"-1,0"))        '  55c
Adam Speight
quelle
0

Golf-Basic 84, 91 Zeichen

:L1/L1_L2i`L1:fpart(L1,2)2_L1:SortA(L1)@cumSum(L1)=length(L1):Thend`-1#d`cumSum(L1):Endd`L1
  • Stellen Sie sicher, dass es keine gibt 0 der Eingang (nicht einmal, wer hat gesagt, dass er ungerade sein muss?)
  • Eingabe in L1 abrufen (Liste 1)
  • Schleifensuchmodul von 2 für jeden Wert
  • Sortieren Sie L1 vom kleinsten zum höchsten
  • Zeigen Sie den Index (entweder -1 oder die kumulative Summe) und die kleinste Zahl an
Timtech
quelle
0

Borowski-Schale (sh), 88 Zeichen

(echo 88;sed 's/./\n&/g')|nl -v-1|awk '{print $2,$1}'|sed '/^[^2468]/d'|sort -n|head -n1

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 nlDienstprogramm), die den Kriterien entsprechenden Zeilen herauszufiltern, zu sortieren und die niedrigste Ziffer auszugeben. 88 -1Wird gedruckt, wenn keine gerade Ziffer gefunden wurde.

FireFly
quelle
0

C ++ - 223 221 Zeichen:

#include<iostream>
#include<string>using namespace std;
int main(){int s=9;int p=-1;string x;cout<<"Enter characters: ";cin>>x;for(int i=0;i<x.length();i++){int n=x[i]-48;if(n%2==0&n<s){s=n;p=i;}}cout<<p<<", "<<s;return 0;}

Lesbare Version:

#include<iostream>
#include<string>
using namespace std;

int main() {
    int s = 9;
    int p= - 1;
    string x;

    cout << "Enter characters: ";
    cin >> x;

    for (int i = 0; i < x.length(); i++) {
        int n = x[i] - 48;

        if (n % 2 == 0 & n < s) {
            s = n;
            p = i;
        }
    }

    cout << p << ", " << s;

    return 0;
}

Es ist lang, aber nicht so schlimm wie Java.


quelle
Es ist eigentlich 221 + 2 (neue Zeilenzeichen), sonst wird es nicht kompiliert.
Schuh
Oh. Wort nur erkannt 221, ich werde es ändern.
0

Javascript 93 Zeichen

b=prompt();((r=b.match(/[2468]/g)||[-1]).sort(function(a,b){return a-b})[0])+","+b.indexOf(r)

Holen Sie sich alle Ereignisnummern, sortieren Sie das Array und drucken Sie die erste Ziffer.

Felipe Miosso
quelle
0

Mathematica, 157 Zeichen

f = Row@{If[(x = Min@#) == Infinity, -1, Position[#, x][[1, 1]]],
      ",", x} &[IntegerDigits@ToExpression@StringReplace[#,
       {"0" -> "1", x_?DigitQ :> x, _ -> "1"}] /. _?OddQ -> Infinity] &

inputs = {"25376", "523726", "583746", "53771", "_4___2"}

f /@ inputs // Column

1,2

2,2

5,4

-1, ∞

6,2

Chris Degnen
quelle
0

Julia, 84

julia> f(a)=(for i=2:2:8;(k=search(a,'0'+i))==0||return(k,i);end;(-1,0))
julia> f(readline(STDIN))
583746
(5,4)
julia> f(readline(STDIN))
_4___2
(6,2)

Julia braucht wirklich einen kürzeren Weg, um Input zum Golfen zu bekommen. Ich zählte die Definition von fund einen Anruf an f. Eine Indizierung basiert darauf, warum sich die Antworten von den Beispielen unterscheiden.

gggg
quelle
0

JavaScript - 53 Zeichen

for(y=prompt(x=0);x<8&&(i=y.indexOf(x+=2))<0;);x+''+i

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.

MT0
quelle
0

C, 110 Zeichen

i,f,r,c,m=9;main(){while(r=getchar()>31){c=r-48;i++;if(c>=0&&~c&1&&c<m)m=c,f=i;}printf("%i,%i",m>8?-1:f-1,m);}

ungolfed:

i,f,r,c,m=9;
main(){
  while(r=getchar()>31){
    c=r-48;
    i++;
    if(c>=0&&~c&1&&c<m) m=c,f=i;
  }
  printf("%i,%i",m>8?-1:f-1,m);
}
MarcDefiant
quelle
0

Javascript, 69

a=prompt(),b=[-1,9];for(i in a)if(+a[i]%2==0&&+a[i]<b[1])b=[+i,+a[i]]

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

Danny
quelle
0

Rebol, 69

s: input for n 2 8 2[if f: find s n[print[index? f f/1]q]]print[-1 0]
draegtun
quelle
0

Rubin 55

p gets.chars.sort*''=~/[2468]/?[$_.index($&),$&]:[-1,0]
daniero
quelle
0

JavaScript / jQuery 149

Golf gespielt

$(function(){
var i=prompt(),k=-1,n=0,c,e="2468";
while(n<i.length){c=i.charAt(n);k=e.indexOf(c);if(k>=0){break;}n++;}$('#d').append(k+","+n);
});

Volle Quelle

<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
</head>
<body>
<div id="d"></div>
<script type="text/javascript">
$(function(){
var i=prompt();
var k=-1;
var n=0;
var c;
var e="2468";
while(n<i.length){
c=i.charAt(n);
k=e.indexOf(c);
if(k>=0){
break;
}
n++;
}
$('#d').append(k+","+n);
});
</script>
</body>
</html>
Bacchusbeale
quelle