Dies ist eine Frage zu einem Google-Interview. Hier finden Sie einen Youtube-Link.
Die Aufgabe:
Suchen Sie aus einer ungeordneten Liste nach 2 Ganzzahlen, die sich zu einer bestimmten Ganzzahl summieren.
- Suchen Sie bei einer ungeordneten Liste von Ganzzahlen nach 2 Ganzzahlen, die sich zu einem bestimmten Wert summieren, geben Sie diese 2 Ganzzahlen aus und geben Sie den Erfolg an (Exit 0). Sie müssen keine bestimmten Zahlen sein (dh die ersten 2 Ganzzahlen, die zur richtigen Zahl summieren). Jedes Paar, das den Wert summiert, funktioniert.
- Eine ganze Zahl ist positiv und größer als Null.
- Eine Liste von Ganzzahlen kann sich in jeder Datenstruktur befinden, einschließlich einer Datei mit Ganzzahlen - eine Ganzzahl pro Zeile.
- Wenn keine ganzen Zahlen gefunden werden können, geben Sie einen Fehler an (Ausgang 1).
- Es müssen zwei Ganzzahlen an verschiedenen Positionen in der Liste zurückgegeben werden. (dh Sie können nicht zweimal dieselbe Nummer von derselben Position zurückgeben)
(Hinweis: Im Video sind dies nicht genau die Anforderungen. Der 'Interviewer' hat seine Angaben mehrmals geändert.)
z.B.
sum2 8 <<EOF
1
7
4
6
5
3
8
2
EOF
Drucke 3
und 5
und Beenden Status ist 0. Beachten Sie, dass in diesem 1,7
und 2,6
würde auch Ergebnisse erlaubt sein.
sum2 8 <<EOF
1
2
3
4
Gibt den Exit-Status 1 zurück, da keine Kombination möglich ist. 4,4
ist nicht erlaubt, gemäß Regel 5.
code-golf
arithmetic
array-manipulation
Philcolbourn
quelle
quelle
Antworten:
Bash, 84 Bytes
Meine Implementierung von (ungefähr) Googles Engineer-Lösung unter Verwendung von Bash und eines Eingabestreams - nicht meine Lösung, das zählt also nicht.
Methode
während wir die Ganzzahl V aus dem Eingabestream lesen können, wenn sie kleiner als das Ziel $ 1 ist, dann, wenn sie bereits $ 1-V gesehen hat, $ 1-V und V ausgeben und 0 beenden (sonst), um den Kandidaten für die Eingabe $ 1-V, Exit 1, zu speichern
quelle
Brachylog , 9 Bytes
Probieren Sie es online!
Vorausgesetzt, ich habe die Herausforderung richtig verstanden ...
Erläuterung
quelle
Perl 6 , 59 Bytes
Probieren Sie es aus Versuchen
Sie es ohne mögliches Ergebnis
Erweitert:
quelle
JavaScript ES6,
58 70 6864 BytesGibt ein Zahlenpaar in Form eines Arrays zurück, wenn es gefunden wird.
undefined
Anderenfalls wird ein falscher Wert zurückgegeben.quelle
3, 5
aber diese Ausgaben1, 7
...f([2,2] 4)
?includes
Trick.JavaScript (ES6),
615756 BytesNimmt das Array von Ganzzahlen
a
und die erwartete Summes
in die aktuelle Syntax auf(a)(s)
. Gibt ein Paar übereinstimmender Ganzzahlen als Array zurück oderundefined
wenn kein solches Paar vorhanden ist.Formatiert und kommentiert
Prüfung
Code-Snippet anzeigen
quelle
Gelee , 14 Bytes
Probieren Sie es online!
Dies ist eine Funktion (kein vollständiges Programm), die als Standardausgabe ausgegeben wird. (Der TIO-Link verfügt über einen Wrapper, der eine Funktion ausführt und ihren Rückgabewert ignoriert.)
Dieses Programm könnte 4 Byte kürzer sein, wenn der Exit-Code nicht benötigt wird. Einen Exit-Code von 1 in Jelly zurückzugeben ist ziemlich schwierig. (Es ist möglich, dass es einen genaueren Weg gibt, den ich verpasst habe.)
Erläuterung
Wir können jede ganze Zahl in einem Paar gut halbieren, und das
o⁶H
wird nichts tun, wenn wir ein Ergebnis finden, außer einen nutzlosen Rückgabewert zurückzugeben, der ohnehin nicht relevant ist (dasṄ
dient als bequeme Einzelbyte-Methode, um die Rückgabe der Funktion zu bestimmen Wert früh, nach PPCG-Regeln). Wenn wir jedoch kein Ergebnis gefunden haben, versuchen wir letztendlich, ein Leerzeichen zu halbieren, eine Operation, die so bedeutungslos ist, dass der Jelly-Interpreter abstürzt. Glücklicherweise erzeugt dieser Absturz einen Exit-Code von 1.quelle
Perl 5 , 51 Bytes
46 Byte Code + für 5 Byte
-pli
Flags.Probieren Sie es online!
Die Idee ist, in der Eingabeliste zu iterieren: Wenn wir zuvor eine Zahl
x
($_
) gesehen habenn-x
($^I-$_
), haben wir gefunden, wonach wir gesucht haben, und$\
diese beiden Werte ("$_ $v"
) festgelegt. Am Ende, wenn$\
nicht gesetzt, dann wirexit 1
, sonst wird es implizit gedruckt.quelle
^I
?Röda ,
6056 BytesProbieren Sie es online!
Dieser Code löst einen Fehler aus, wenn keine Antwort vorliegt. Es werden alle möglichen Paare erzeugt, die die Summe bilden können
s
, dh.1, s-1
,2, s-2
,3, s-3
, ... Dann prüft sie , ob beide Zahlen im Array sinda
und wenn ja, sie an den Strom schiebt.pull
Liest einen Wert aus dem Stream und gibt ihn zurück. Wenn der Stream keine Werte enthält, wird ein Fehler ausgegeben.a-x
Gibt das Arraya
mit demx
entfernten zurück.quelle
Python 2, 60 Bytes
Diese kurzen, bis Regeln beim Verlassen mit Code 1 geklärt sind. Jetzt wird mit Fehler beendet, wenn nichts gefunden wird.
-5 Bytes dank @Peilonrayz
-4 Bytes dank @Rod
Probieren Sie es online aus
quelle
input()
4 Bytes zu reduziereneval(raw_input())
(denke ich).C ++ 133 Bytes (kompiliert mit clang 4 und gcc 5.3 -std = c ++ 14)
C 108 Bytes
quelle
#include <set>
und einige mehr für addieren müssenstd::set
. Sie können zwar auch einige Bytes speichern, wenn Sie die Klammern entfernenp.insert(v-i);
main
. Wir betrachten (sofern in der Challenge nicht anders angegeben) eine Funktion als eine gültige Einsendung. (Willkommen auf der Website übrigens!)end
, aber es kompiliert auf Gcc ohnestd::
(und wenn natürlich nicht gesetzt)Haskell , 34 Bytes
Probieren Sie es online!
Diese Funktion prüft für jedes Element der Liste, ob sich (Summenelement) im folgenden Teil der Liste befindet. Gibt das erste gefundene Paar zurück. Wenn die Funktion das Ende der Liste erreicht, wird ein Fehler "Nicht erschöpfende Muster" ausgegeben und mit Code 1 beendet.
quelle
[2,2]#4
.Power Shell,
10997 ByteHat einen 12-Byte-Deal abgeschlossen, den AdmBorkBork angeboten hat
Erläuterung
Die aktuellen Regeln suchen nach Exit-Code. Diese könnten entfernt werden und nur überprüfen, ob Nummern zurückgegeben werden und ob sie falsch sind.
Beispielnutzung
Wenn der obige Code als Funktion gespeichert wurde
s
quelle
$c
-($a.count-1)..1|%{$f=$_;--$_..0|%{if...
R, 49 Bytes
Dies findet alle 2-Kombinationen von
x
und gibt eine Matrix zurück. Dann summiert nach Spalten und findet alle Summen, die gleich sindy
(ohne den[,1]
Teil am Ende werden alle Kombinationen gedruckt, deren Summen gleich sindy
).quelle
Japt , 9 Bytes
Dank @ETHproductions viele Bytes gespart
Probieren Sie es online!
Erläuterung
Beispiel
quelle
Javascript,
114968684 Bytes1 Byte dank @Cyoce und weitere 8 Byte dank @ETHProductions gespeichert
Dies gibt ein Tupel mit der ersten Kombination von Listenelementen zurück, die die angegebene Eingabe ergeben, oder nichts für keine Übereinstimmung. Ich habe das
var
s in der Funktion entfernt; REPL.it stürzt ohne sie ab, aber die Chrome Dev Console erledigt dies in Ordnung ...Probieren Sie es online!
quelle
y=x+1
kümmert sich darum.a=>b=>...
, um ein Byte zu speichernfor(y=x;++y<b.length;){
. Außerdem können Sie alle Sätze von Klammern mit Ausnahme des äußersten entfernen und das Leerzeichen danach entfernenreturn
Clojure, 77 Bytes
Liefert das erste solche Paar oder
nil
.quelle
Haskell, 62 Bytes
Ich weiß immer noch nicht, was die Herausforderung erlaubt und was nicht. Ich gehe für eine Funktion, die ein Paar von Zahlen druckt und 0 zurückgibt, wenn es eine Lösung gibt, und nichts druckt und 1 zurückgibt, wenn es keine Lösung gibt. Da Drucken E / A ist, muss ich die Rückgabewerte in die E / A-Monade (über
return
) heben und die tatsächliche Art der Funktion istNum a => IO a
.Anwendungsbeispiel (mit Rückgabewert, der von der Replik ausgegeben wird):
Probieren Sie es online! .
Wenn das Auslösen von Ausnahmen zulässig ist,
fail
werden einige Bytes (insgesamt 51) gespeichert:quelle
Gelee , 9 Bytes
Jelly hat keine Möglichkeit, den Exit-Code auf beliebige Werte zu setzen. Daher wird ein TypeError für die Eingabe ohne gültige Lösung erstellt, wodurch der übergeordnete Interpreter mit Exit-Code 1 beendet wird .
Probieren Sie es online!
Wie es funktioniert
quelle
Nova , 101 Bytes
Eine schöne Sache am Codegolf ist, dass es mir hilft, Fehler in meiner Sprache zu finden. zB der Platzbedarf zwischen
return
und[y,x-y]
.Sobald ich Array.nova Push / Pop-Funktionen hinzufüge und die Rückgabe behebe, wären das 96 Bytes:
Verwendung:
Bearbeiten: Auch gibt es diesen Weg bei 73 Bytes (69 mit Pop) auch:
firstOrThrow löst eine Exception aus, die nicht abgefangen wird und somit das Programm letztendlich mit Exit-Code 1 beendet.;)
Dieser Weg scheint auch lesbarer zu sein.
quelle
Pyth, 12 Bytes
Erläuterung
quelle
PHP, 88 Bytes
Nimmt Eingaben von Befehlszeilenargumenten entgegen, summiere zuerst. Laufen Sie mit
-nr
.Zum Glück
die
/exit
Ausgänge mit ,0
wenn Sie ihm einen String als Parameter geben.Ich habe versucht, die Schleifen zu einer zusammenzuführen. Diesmal ist jedoch eine längere Initialisierung und ein Test erforderlich.
quelle
for($i=1;$a=$argv[$k=++$i];)for(;$b=$argv[++$k];)$a+$b!=$argv[1]?:die(!0);
und Sie sollten einen Blick auf diese codegolf.stackexchange.com/questions/120803/…Mathematica, 76 Bytes
Ziemlich einfach:
#~Subsets~{2}
erhält dann alle 2-Element-Teilmengen der ListeCases[...,x_/;Tr@x==#2]
wählt nur die aus, deren Summe die gewünschte Zahl ist. Wenn es keine davon gibt,If[l=={}, Message@f::e,First@l]
die Fehlermeldung gedrucktf::e : 1
zuvor definierte (da ich keine Ahnung habe, was "Exit-Status 1" für Mathematica bedeuten könnte). Andernfalls wird der erste Eintrag in der Liste der Paare zurückgegeben, die die korrekte Summe ergeben.Wenn wir einen Falsey-Wert zurückgeben dürfen, anstatt diese seltsame Exit-Status-Sache auszuführen, hat der folgende Code 58 Bytes:
quelle
Scala,
5541 BytesGibt eine Liste der beiden Zahlen zurück, wenn sie existieren, und löst andernfalls einen Fehler aus. Wird dieser Fehler nicht abgefangen, wird der Beendigungsstatus 1 angezeigt.
quelle
Ruby,
5348 BytesEingabe: a ist die Liste, s ist die erwartete Summe.
Wenn die 2 Zahlen gefunden wurden, drucken Sie sie aus und geben Sie 0 zurück, andernfalls 1, wie in der Spezifikation angegeben.
quelle
TI-Basic, 59 Bytes
Erläuterung:
Wenn das Programm nicht ordnungsgemäß beendet wurde, wird ein Fehler verursacht, wenn die Liste nicht genügend Elemente enthält, um fortzufahren.
quelle
CJam, 23 Bytes
Eingabe ist
sum numbers
. Beispielsweise:6 [3 2 3]
. Hinterlässt eine positive Zahl für wahr und eine leere Zeichenfolge oder eine 0 für falsch.Erläuterung:
quelle