Herausforderung
Berechnen Sie bei einem Array mit einstelligen Zahlen, ob zwei davon 10 ergeben, und drucken Sie sie aus
Beispiel
Eingang
(1,2,3,4,5,5,6,7)
Dies kehrt zurück ((4,6),(5,5),(3,7))
Eingang
(1,2,3,4,5)
Dies kehrt zurück ()
. da gibt es nur eine 5
Eingang
(5,5,5,5,5)
Dies kehrt zurück, ((5,5),(5,5))
da es eine ungerade Anzahl von 5s gibt und jede 5 nur einmal verwendet werden kann
Regeln
Hier sind die Regeln!
- Angenommen, die Eingabe ist nur ein unsortiertes Array positiver einstelliger Ganzzahlen
- Jede Zahl wird nur einmal gepaart, dh wenn es drei 5er gibt, bildet sie nur 1 Paar (5,5). Wenn es (3,3,7) gibt, bildet es nur 1 Paar (3,7)
- Für die Eingabe: Sie können jede Art von Klammern (oder das Fehlen von Klammern) verwenden, solange die Leser erkennen können, dass die Eingabe ein einzelnes Array von Zahlen ist.
- Für die Ausgabe: Es muss wie ein Array von Paaren aussehen. Wenn das Array dieselbe Form wie Ihre Eingabe hat (Wenn Sie in Ihrer Eingabe keine Klammern verwendet haben, müssen Sie Symbole verwenden, damit jeder Leser erkennen kann, dass es sich um Paare in einem Array handelt.)
Testfälle
(1,2,3,4,5,5,6,7) =((4,6),(5,5),(3,7))
(1,2,3,4,5) = ()
(5,5,5,5,5) = ((5,5),(5,5))
(1,2,3,3,4,5,6,7)=((3,7),(4,6))
(9,8,7,6,4,4,3,1)=((9,1),(7,3),(6,4))
Viel Glück!
Die shorter
Antwort lautet: Je besser!
Bearbeiten 1: Aktualisieren Sie die Regeln und Testfälle anhand von Kommentaren
Bearbeiten 2: Aktualisieren Sie die Regeln, um das Eingabeformat zu definieren.
Bearbeiten 3: Aktualisieren Sie die Regeln, um das Ausgabeformat zu definieren. versuchen, so entgegenkommend wie möglich zu sein.
(5,5)
für den endgültigen Testfall geben?(1,2,3,3,4,5,6,7)
1,2,3,4,5,5,6,7
?Antworten:
GolfScript,
454237 ZeichenDer neue Ansatz verwendet auch Arrays mit einem einzelnen Element als Eingabe. Darüber hinaus ist es einige Zeichen kürzer.
Vorherige Version:
Der in diesem Code verwendete Algorithmus wird wie folgt beschrieben:
Der Code erwartet in STDIN ein Array mit mindestens zwei Ziffern.
Beispiele (siehe online ):
quelle
Python 2.7 (70)
Testfälle:
Ein Byte extra für die schöne Klammer.
quelle
<?$a=fgetcsv(STDIN);while($a){$b=10-array_pop($a);if($a[$b]){unset($a[$b]);echo"($b,",10-$b,")";}}
Javascript,
188183181153141121123112 11210598ZeichenGolfen in JS ist etwas schwierig, aber ich wollte mich nur mit diesem Problem auseinandersetzen. Hier ist der Code:
Eingabe: zB
[1,2,3,3,4,5,6,7]
. Ausgabe zB[[4,6],[3,7]]
an die Konsole.105-> 98: Verwendet Daniels großartigen Algorithmus, um den Code komplett neu zu schreiben! In seiner Antwort finden Sie einen lesbaren Algorithmus.Völlig durcheinander gebrachtes Zeug, also auf 105 Zeichen zurückgesetzt.112-> 105: Auf
i
Null initialisiert , Ausgabe vono.push
to setk
(k=a[i]=a[j]=-o.push...
) verwendet und Ausgabe an Konsole protokolliert, anstatt zu eliminieren,"["+
und+"]"
da die Konsole bereits gut ausgibt.123-> 112: Jetzt äußere Klammern in der Ausgabe entfernt, da Golfscript möglicherweise :) Auch endlich Vorschlag zum Entfernen angewendet
|=0
.121-> 123: Geändert
o+="("+p+","+k+"),"
zuo.push("("+[p,k]+")")
(fügt 2 Zeichen hinzu :() undo
ein Array anstelle eines Strings (o=""
->o=[]
) erstellt. Jetzt ist die Ausgabe nicht mehr falsch (wie((5,5),(5,5),)
).141-> 121: Von nun angenommen , auf dass die Frage bedeutet , dass wir Eingang in der Sprache der Array - Format bekommen könnten, den Fall in JS ist ist
[a,b,c,...]
und gemachto
, der Ausgang „Akkumulator“ eine Zeichenfolge anstelle einem Arrays (o.push(...),
->o+=...,
).153-> 141: Array-Einträge zurücksetzen, anstatt sie nach der Verwendung zu entfernen.
181-> 153: Angewandte Änderungen an
u=[]
, neu angeordnete Schleifen,a[i]
&a[j]
-> temporäre Variablen, konvertiert wenn Logik und konvertiert int Logik ina[i]|=0
.183-> 181: Ersetzt
i<=0
durchi+1
und das gleiche fürj
.188-> 183: Platziert
o=[]
innenprompt()
() und ersetzt;
for(j=i;
mitfor(j=i-1;
().i==j&&
(Danke Mellamokb, Paul Walls und Ryan!)
quelle
i>=0
miti+1
undj>=0
mitj+1
2 Zeichen zu speichern.u=[]
anstelle vonx
) angewendet , die Schleifen neu angeordnet, um von 0 aufwärts zu gehen, Variablen zugewiesena[i]
unda[j]
temporär, um wiederholte Referenzen zu speichern, einige Variableninitialisierungen in andere Anweisungen verschoben, dieif
Logik in verkettete||
Logik konvertiert und konvertiert das int parsing auf das prägnanterea[i]|=0
, um eine Gesamteinsparung von 30 Zeichen zu erhalten :). Hier ist mein Testgeschirr, das die Genauigkeit der Lösung demonstriert: jsfiddle.net/GKUDb/8 und die 151-stellige Golf-Arbeitslösung: jsfiddle.net/DVtW2 .o+="("+[p,k]+")"
).for(a=eval(prompt(o=[])),i=-1;k=a[j=++i]|=0;)for(;p=a[--j];)k+p-10||(o.push("["+[p,k]+"]"),k=a[i]=a[j]=-1);alert(o)
, bringt sie auf 115a=eval(prompt(o=[])),i=-1
ina=eval(prompt(i=o=[]))
ohne Verlust der Treue, für weitere 3 Charakter Einsparungen.J,
545350464544 ZeichenVerwendungszweck:
Der Algorithmus ist im Grunde:
+/|:(1+i.9)=/
(<.|.)
(also 1 und 9, 2 und 8 usw.)1 9
Paar) und lassen Sie alles nach den ersten fünf Paaren fallen<.4({.,-:@{::)
implementiert beide vorherigen Schritte).-
die Nummer aus(>:,.9&-)I.
quelle
Python (142)
Die Eingabe sollte in eckigen Klammern statt in runden Klammern erfolgen. http://ideone.com/p2QR11
Algorithmus:
Wenn eine ernsthaft fehlerhafte Ausgabe zulässig ist (90) : http://ideone.com/GR762f
quelle
C
142,138, 124Testen:
Implementierungshinweise:
quelle
Perl 52
Beweis:
Und es gibt einen ungolfed kommentierten Code:
Vielleicht sehen die Erklärungen wie Pidgin-Französisch aus (ich bin kein englischer Schriftsteller). Wenn also jemand sie bearbeiten und verständlicher machen möchte, tun Sie dies bitte.
quelle
Javascript -
131129125 ZeichenIch gehe davon aus, dass die Reihenfolge und in den verschachtelten Ergebnisarrays nicht obligatorisch ist :)
Bewertete Testfälle:
Bearbeiten : Da die Problembeschreibung "Array" lautet, sprechen wir über die sprachspezifische Notation eines Arrays, oder?
quelle
Mathematica 70
Verwendungszweck
quelle
PostScript (46)
Dies verwendet handcodierte binäre Token, daher hier ein Hexdump:
Ich habe die Binärdatei hochgeladen, wenn Sie sie ausprobieren möchten.
Dies erwartet, dass sich die Zahlen auf dem Stapel befinden. Sie können dem Code vorangestellt oder in der Befehlszeile angegeben werden, z. B. wenn Sie Ghostscript wie folgt verwenden:
Wenn Sie auf einer Array-Syntax für die Eingabe bestehen, sind
aload pop
gleich zu Beginn zwei weitere Token ( ) erforderlich . In binären Token sind dies vier weitere Bytes.Ungolf und kommentiert:
quelle
Python 84
Erfordert die Eingabe in Klammern anstelle von Klammern.
Für ungefähr die gleiche Antwort, die besser gespielt wird, siehe Daniels Antwort .
quelle
PHP
150149148146142-> 140Verwendung mit PHP CLI.
Eingang:
1,2,3,4,5,5,6,7
Ausgabe:
(3,7)(4,6)(5,5)
Nicht Golf:
quelle
SED, 112 Zeichen
Wahrscheinlich etwas einfacher als die anderen Lösungen
quelle
Perl, 72 mit der
-p
Flaggequelle
-p
sollte gezählt werden, da das Äquivalent hinzufügen würdeLINE: while (<ARGV>){...}continue{die "-p destination: $!\n" unless print $_}
#!perl -p
Golfserver würde dies als 80 Byte gezählt, da dies den Shebang plus Newline erfordert .