Die Staats- und Regierungschefs der Welt haben sich getroffen und schließlich zugegeben, dass der beste (und einzige) Weg, um die Probleme der Weltwirtschaft zu lösen, darin besteht, Bilanz darüber zu ziehen, wie viel sie sich gegenseitig schulden, und sich gegenseitig nur mit riesigen Schecks auszuzahlen. Sie haben Sie eingestellt (ironischerweise mit der niedrigsten möglichen Vertragsrate), um die besten Mittel dafür zu finden.
Nach langen Überlegungen und der Bitte, ein einfaches Beispiel zu zeichnen, haben sie die folgende Spezifikation entwickelt.
Jedes Land ist durch seinen ISO 3166-1 Alpha-2- Code vertreten: US
für die USA, AU
für Australien, JP
für Japan, CN
für China und so weiter ...
- Ein Hauptbuch besteht aus einer Reihe von Ländereinträgen und den Beträgen, die für jedes Land geschuldet werden.
- Der Eintrag jedes Landes beginnt mit der Domain-ID eines Doppelpunkts und der Höhe des Überschusses / Defizits (in Milliarden Euro), gefolgt von einem Semikolon und einer durch Kommas getrennten Liste der Länder und der Höhe (in Milliarden Euro) Euro) schulden sie.
- Wenn ein Land keinem anderen Land etwas schuldet, wird nach diesem Semikolon-Trennzeichen keine Erwähnung dieses Landes eingegeben.
- Defizite werden als negative Zahlen angegeben, Überschüsse als positive Zahlen.
- Werte können auch Floats sein.
- Das Ledger muss aus STDIN entnommen werden. Das Ende des Ledgers wird durch einen Zeilenumbruch in einer leeren Zeile angezeigt. Die Abrechnung muss an STDOUT erfolgen.
Ein Beispiel für ein Hauptbuch:
Input:
AU:8;US:10,CN:15,JP:3
US:14;AU:12,CN:27,JP:14
CN:12;AU:8,US:17,JP:4
JP:10;AU:6,US:7,CN:10
Das System berechnet dann, wie viel jedes Land schuldet und schuldet, und bestimmt seinen Überschuss / Defizit, zum Beispiel für AU:
AU = 8 (aktueller Überschuss) -10 (nach US) -15 (nach CN) -3 (nach JP) +12 (nach US) +8 (nach CN) +6 (nach JP) = 6
Wenn alle Berechnungen abgeschlossen sind, muss eine Liste angezeigt werden:
Output:
AU:6
US:-5
CN:35
JP:8
Ihre Aufgabe ist es, dieses System zu erstellen, das in der Lage ist, eine beliebige Anzahl von Buchungen für eine beliebige Anzahl von Ländern vorzunehmen und zu bestimmen, wie viel Defizit / Überschuss jedes Land aufweist, wenn alles ausgezahlt wird.
Der ultimative Test besteht darin, dass Sie Ihren Code verwenden, um die Schulden zwischen den folgenden Ländern im folgenden Testfall zu begleichen. Diese Zahlen stammen von BBC News ab Juni 2011. ( http://www.bbc.com/news/business-15748696 )
Für die Zwecke der Übung habe ich ihr jeweiliges BIP als aktuellen Überschuss verwendet ... Bitte beachten Sie, dass dies ausschließlich eine Übung der Code-Qualitätssicherung ist ... Es wird hier in dieser Frage keine Rede von einer globalen wirtschaftlichen Lösung sein ... Wenn Sie über Wirtschaft sprechen möchten, gibt es in SE sicher eine andere Subdomain, die sich darum kümmert ...
US:10800;FR:440.2,ES:170.5,JP:835.2,DE:414.5,UK:834.5
FR:1800;IT:37.6,JP:79.8,DE:123.5,UK:227,US:202.1
ES:700;PT:19.7,IT:22.3,JP:20,DE:131.7,UK:74.9,US:49.6,FR:112
PT:200;IT:2.9,DE:26.6,UK:18.9,US:3.9,FR:19.1,ES:65.7
IT:1200;JP:32.8,DE:120,UK:54.7,US:34.8,FR:309,ES:29.5
IE:200;JP:15.4,DE:82,UK:104.5,US:39.8,FR:23.8
GR:200;DE:15.9,UK:9.4,US:6.2,FR:41.4,PT:7.5,IT:2.8
JP:4100;DE:42.5,UK:101.8,US:244.8,FR:107.7
DE:2400;UK:141.1,US:174.4,FR:205.8,IT:202.7,JP:108.3
UK:1700;US:578.6,FR:209.9,ES:316.6,IE:113.5,JP:122.7,DE:379.3
Jetzt sei der wirtschaftliche Retter der Welt!
Regeln:
- Kürzester Code gewinnt ... das ist doch Code-Golf ...
- Bitte geben Sie Ihre Ausgabe des Haupttestfalls mit Ihrer Code-Antwort an ...
JP:4100
?Antworten:
K, 66
.
quelle
Perl,
139137134119112Hier ist ein weiteres Stück Code ... Ich werde es später dokumentieren.
Golf Code
Mit Wörterbuch (112):
Ohne Wörterbuch (137):
Ausgabe
Sehen Sie es in Aktion!
http://ideone.com/4iwyEP
quelle
Python,
211185183Ausgabe mit Haupttestfall:
(Teste es hier: http://ideone.com/CjWG7v )
quelle
C -
257253 wenn kein CR am ZeilenendeHängt von sizeof (short) ab == 2.
Keine Überprüfung auf Pufferüberlauf.
Ausgabe:
Weniger golfen:
quelle
PHP -
338280Sollte mit jeder Version von PHP 5 funktionieren.
Golf gespielt :
Nicht golfen :
Ausgabe :
quelle
preg_match_all()
und dann nur einmal geloopt hättest ?Perl (184 Zeichen)
Code
Ausgabe
quelle
Perl -
116114112Ausgabe:
Ungolfed:
quelle
C ++ - 1254
Mir ist klar, dass der Code sehr lang ist, aber ich habe den Spaß sehr genossen. Dies ist mein erstes Mal, dass ich Code Golf spiele, und ich bin neu in C ++, daher sind Vorschläge zur Verbesserung meines Codes sehr willkommen.
Endgültige Challenge-Ergebnisse
Ungolfed Code
quelle
cout << "Output:\n";
... Das ist eine 20-Byte-Ersparnis ...AWK -
138120Und die Ergebnisse
Ungolfed
(Teste es hier: http://ideone.com/pxqc07 )
quelle
Rubin - 225
Versuchen Sie es zuerst mit einer Herausforderung wie dieser, sicher könnte es viel besser sein ...
Und die Ergebnisse
quelle
JS,
254,240,245Nun, ich weiß, es ist ziemlich lang, aber dies ist mein zweiter Code Golf.
Vorschläge sind willkommen!
Übrigens: Interessantes Javascript behält die Reihenfolge der Elemente in Hashmaps bei. Selbst wenn p ein Array von Wörterbüchern enthält, kann ich jedes Wörterbuch als Array durchlaufen und bin mir sicher, dass das erste Element eines Diktats das zuerst eingefügte ist. (der Name des Landes, auf das sich die aktuelle Zeile bezieht)
Ungolfed:
Hinweis: Die Eingabe ist eine
prompt()
Zeile. Wenn Sie jedoch einen mehrzeiligen Text (wie die vorgeschlagene Eingabe) in einprompt()
Fenster kopieren / einfügen,JS
lesen Sie alles.Ausgabe:
quelle
z='replace';r={};p=eval(('[{'+prompt()+'}]')[z](/\n/g,'},{')[z](/;/g,','));for(i in p){l=p[i];c=0;for(k in l){if(!c){c=k;r[c]=0;}else{r[c]-=l[k];}};for(j in p){w=p[j][c];if(w!=null)r[c]+=w}};alert(JSON.stringify(r)[z](/"|{|}/g,'')[z](/,/g,'\n'))
:?(w!=null)
als(!w)
!w
es keine gute Idee war, dies zu überprüfen,w!=null
und das Skript funktionierte nicht mehr: p. Jetzt werde ich es mit den Ergebnissen aktualisierenz="replace";r={};p=eval(("[{"+prompt()+"}]")[z](/\n/g,"},{")[z](/;/g,","));for(i in p){l=p[i];c=0;for(k in l)c?r[c]-=l[k]:(c=k,r[c]=0);for(j in p)w=p[j][c],null!=w&&(r[c]+=w)}alert(JSON.stringify(r)[z](/"|{|}/g,"")[z](/,/g,"\n"))
für 229 Bytes ... Was ich hier gemacht habe, ist dieif(!c)
Sequenz auf einen einzigen ternären Operator reduziert , und ich habe es auch in die übergeordnetefor
Schleife aufgenommen ... Ich habe auch etwas Ähnliches mit der anderenfor
Schleife gemacht ...JavaScript (ES6)
175,166,161,156,153147Golf gespielt
Ungolfed
Ausgabe
quelle
R[b] ? R[b] += +v : R[b] = +v
durchR[b]=R[b]||0+ +v
i=0;i++%2==0?b=v
fürb=isNaN(+v)?v:
isNaN(+v)
->!+v
Groovy 315
Ungolfed:
quelle
PHP, 333
Ungolfed-Version:
quelle