In der Neuen Moderne wird Charlie Chaplin, wenn er auf einen Computer stößt, im Sortierhof als Prüfer eingesetzt, um festzustellen, ob die Arbeiter die Gegenstände richtig sortieren. Bei den fraglichen Gegenständen handelt es sich um Murmelpakete. Pakete mit einer ungeraden Anzahl von Murmeln werden im roten Korb und Pakete mit einer geraden Anzahl von Murmeln im blauen Korb gestapelt.
Charlie Chaplin soll das Programm lochen , das überprüft, ob eine Anomalie im Sortiervorgang vorliegt. Mack Swain, sein direkter Chef, teilt einen Algorithmus, den er zum Codieren benötigt.
Algorithmus
L = List of Marble packets that's already sorted
L_ODD = List of packets with Odd Number of Marbles
L_EVEN = List of packets with Even Number of Marbles
Check_Digit = √(ΣL_ODD² + ΣL_EVEN²)
Seine Aufgabe ist es, die Check_Digit zu bestimmen und mit dem Wert abzugleichen, den sein Chef berechnet.
Charlie Chaplin konnte sich während seiner Mittagspause an Mack Swains Schublade schleichen und feststellen, dass seine Schublade eine einzige Karte mit Stempeln in den ersten 46 32 Spalten enthält (was bedeutet, dass Mack ein Programm mit nur 46 32 Zeichen schreiben konnte ).
Charlie Chaplin würde jetzt die Hilfe aller Code-Ninjas benötigen, um ein Programm mit möglichst wenigen Zeilen zu schreiben. Er kündigt auch einen Bonus von 50 Punkten an, wenn jemand ein Programm entwickeln kann, das kürzer ist als sein Chef.
Zusammenfassung
Wenn Sie eine Liste / ein Array / einen Vektor positiver Zahlen (ungerade und gerade) haben, müssen Sie eine Funktion schreiben, die array(int [])/vector<int>/list
die Wurzel der Summe der Quadrate der Summen ungerader und gerader Zahlen in der Liste akzeptiert und berechnet.
Die Größe des Programms ist die Größe des Hauptteils der Funktion, dh ohne die Größe der Funktionssignatur.
Beispiel
List = [20, 9, 4, 5, 5, 5, 15, 17, 20, 9]
Odd = [9, 5, 5, 5, 15, 17, 9]
Even = [20, 4, 20]
Check_Digit = √(ΣOdd² + ΣEven²) = 78.49203781276162
Beachten Sie , dass die tatsächliche Ausgabe abhängig von der Gleitkommapräzision der Implementierung variieren kann.
Ergebnis
Punktzahl wird berechnet als Punktzahl wird berechnet als Σ(Characters in your Program) - 46
. Σ(Characters in your Program) - 32
. Abgesehen von den regelmäßigen Abstimmungen der Community, würde die niedrigste negative Punktzahl einen zusätzlichen Bonus von 50 Punkten erhalten.
Bearbeiten
- Der Versatz, der zum Berechnen des Ergebnisses verwendet wurde, wurde von 46 auf 32 geändert. Beachten Sie, dass dies keine Auswirkung auf die Ranglisten- / Kopfgeldberechtigung hat oder eine Lösung ungültig macht.
Urteil
Nach einem grausamen Duell zwischen den Ninjas erhielt Herr Chaplin einige wundervolle Antworten. Leider versuchten nur wenige Antworten, die Regel unangemessen auszunutzen, und waren nicht sehr nützlich. Eigentlich wollte er ein faires Duell und Antworten, bei denen die Logik innerhalb der Funktionssignaturen kodiert wurde, würden schließlich bedeuten, dass die Funktionssignatur ein integraler Bestandteil der Lösung ist. Schließlich war Ninja FireFly der klare Gewinner und verlieh ihm den Bonus, den er verdient hat. Leaderboard (täglich aktualisiert)
╒══════╤═════════════════╤══════════════╤═════════╤════════╤═══════╕
├ Rank │ Ninja │ Dialect │ Punches │ Scores │ Votes ┤
╞══════╪═════════════════╪══════════════╪═════════╪════════╪═══════╡
│ 0 │ FireFly │ J │ 17 │ -15 │ 6 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 1 │ tmartin │ Kona │ 22 │ -10 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 2 │ Sven Hohenstein │ R │ 24 │ -8 │ 7 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 3 │ Ben Reich │ GolfScript │ 30 │ -2 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 4 │ mollmerx │ k │ 31 │ -1 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 5 │ David Carraher │ Mathematica │ 31 │ -1 │ 3 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 6 │ tmartin │ Q │ 34 │ 2 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 7 │ daniero │ dc │ 35 │ 3 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 8 │ psion5mx │ Python │ 38 │ 6 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 9 │ O-I │ Ruby │ 39 │ 7 │ 5 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 10 │ gggg │ Julia │ 40 │ 8 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 11 │ FakeRainBrigand │ LiveScript │ 50 │ 18 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 12 │ Sylwester │ Perl5 │ 50 │ 18 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 13 │ daniero │ Ruby │ 55 │ 23 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 14 │ vasuakeel │ Coffeescript │ 57 │ 25 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 15 │ dirkk │ XQuery │ 63 │ 31 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 16 │ crazedgremlin │ Haskell │ 64 │ 32 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 17 │ Uri Agassi │ Ruby │ 66 │ 34 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 18 │ Sumedh │ JAVA │ 67 │ 35 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 19 │ Danny │ Javascript │ 67 │ 35 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 20 │ deroby │ c# │ 69 │ 37 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 21 │ Adam Speight │ VB │ 70 │ 38 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 22 │ Andrakis │ Erlang │ 82 │ 50 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 23 │ Sp0T │ PHP │ 85 │ 53 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 24 │ brendanb │ Clojure │ 87 │ 55 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 25 │ Merin Nakarmi │ C# │ 174 │ 142 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 26 │ Boopathi │ JAVA │ 517 │ 485 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 27 │ Noyo │ ES6 │ ? │ ? │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 28 │ shiona │ Haskell │ ? │ ? │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 29 │ Vivek │ int │ ? │ ? │ 0 │
└──────┴─────────────────┴──────────────┴─────────┴────────┴───────┘
Antworten:
J,
1817 Zeichen - 32 = ⁻15(Als "Funktionskörper"; muss in Klammern oder an einen Namen gebunden sein.)
Erläuterung
Ich habe versucht, eine Explosionsdarstellung zu machen, wie Tobia es in APL-Antworten tut.
+/&.:*:
könnte durch|@j./
die Verwendung des komplexen Betrags-Tricks von OI ersetzt werden , um noch zwei weitere Zeichen zu speichern.Beispiel
quelle
ES6,
(48 - 32) = 16(1 - 32) = -31Originalfassung:
Die gesamte Funktionsdefinition umfasst 53 Zeichen, der Body nur 48.
Aktualisierte Version, die die Problemdefinition voll ausnutzt und so ziemlich alles aus dem Körper in die Signatur verschiebt:
Die neue Funktionsdefinition umfasst jetzt insgesamt 63 "Schläge", aber die Funktion KÖRPER ist jetzt nur EIN VERDAMMTES ZEICHEN LANG. Außerdem wird der globale Namespace nicht mehr beschädigt! : D
Verwendung:
quelle
R, (24 - 32) = –8
Der Funktionskörper besteht aus 24 Zeichen.
Verwendung:
quelle
sqrt(sum(by(x,x%%2,sum)^2))
Ich habe nur den sqrt nicht optimiert .... verdammt :-) +1 :-) PS: Es ist interessant, wieby
es auf den ersten Blick wegen des beschissenen Ausgabeformats aussieht, aber wenn man darüber läuftsum
, ist es behoben ;-)by
ein eindimensionales Array zurückgegeben. Man sollte die Funktion nicht nach dem Ergebnis derprint.by
Funktion beurteilen .by
gibt kein Array zurück (übrigens, was du mit "Array" meinst? Es gibt keine in R. Du hast wahrscheinlich einen Vektor gemeint), weder einen Vektor.by
Gibt das Objekt der Klasse zurückby
.?array
. Darüber hinausis.array(by(1,1,I))
kehrt zurückTRUE
.Ruby 2.1+ - (39 Zeichen insgesamt - 7 Nichtkörper - 32 Offset = 0)
Etwas andere Herangehensweise. Ich erstelle eine komplexe Zahl
a+b*i
so, dassa
undb
die Summe der geraden und ungeraden Zahlen inlist
ist. Dann nehme ich einfach den absoluten Wert.Meine vorherige Lösung, die 5 Zeichen länger ist, aber mit 1.9.3+ funktioniert:
Wenn Rails + Ruby 2.1+ erlaubt wäre, könnten wir
Array#sum
den Body auf nur 25 Zeichen reduzieren:quelle
Python 2.7: 45, nein: 40, nein: 38 - 32 = 6
Nichts sehr Neues, nur eine Kombination aus dem komplexen Zahlentrick, den ich in der letzten Pythagoras-Herausforderung gesehen habe, Lambda für Kompaktheit und Syntax- / Klammer-Minimierung:
Update - speicherte ein paar Zeichen. Vielen Dank an @DSM für den Trick, die komplexe Komponente auf 0/1 zu erhöhen.
Ok, das Lesen der Frage und das Erkennen der Zählregel 'body of the function' spart weitere 2 Zeichen:
iPython-Test:
quelle
abs
komplexe Zahlen erstellt wurdeAPL (27 - 46 = -19)
z.B:
quelle
Mathematica 31-32 = -1
GatherBy[#,OddQ]
Erzeugt die geraden und ungeraden Paketlisten.Das Innere ermittelt
Tr
die Summen, die beide quadriert und dann (vom ÄußerenTr
) aufsummiert werden .N
konvertiert von einer irrationalen Zahl (der Quadratwurzel einer ganzen Zahl) in eine dezimale Approximation.Beispiel
Ist dies
f[n_]:=
nicht der Fall, kann ein zusätzliches Zeichen gespeichert werden.Beispiel
quelle
Kona, 22 - 32 = -10
quelle
Perl5: (50 - 32 = 18)
quelle
say
anstelle vonprint
und<>
anstelle von@ARGV
(während Sie die Argumente auf der STDIN anstelle der Befehlszeile angeben)say
ause
? Das Umschalten von einem Argument-Array auf<>
würde ein zusätzliches erfordernsplit/ /,
.dc 3 (35 - 32)
Verwenden von Arrays, wie von @Tomas vorgeschlagen. Dies spart einige Zeichen, da ich die Parität jeder Zahl berechnen und als Index verwenden kann, anstatt die Parität mit zu ändern, um die richtigen Werte zu verzweigen und in die richtigen Register zu schreiben. Es stellt sich auch heraus, dass Arrays eine 0 ergeben, auch wenn das Array / der Index nicht verwendet wurde, sodass Sie nichts initialisieren müssen.
Angenommen, die Zahlen befinden sich bereits auf dem Stapel und das Ergebnis bleibt als einziger Wert übrig, wenn es fertig ist.
Prüfung:
dc 16 (48 - 32)
Erste Version mit den Registern o und e zum Speichern von ungeraden und geraden Zahlen.
quelle
sose
;-) Könnten Sie vielleicht ein kürzeres Ergebnis erzielen, wenn Sie dc array-Befehle verwenden ?Python, 9 (55 - 46)
Die Verwendung einer Lambda-Funktion spart einige Bytes in Zeilenumbrüchen, Tabulatoren und
return
.Beispiel:
quelle
Rubin (66 - 32 = 34)
Prüfung:
quelle
Math.hypot *a.partition(&:odd?).map{|x|eval x*?+}
rasiert ein paar Zeichen abRubin, 55 - 46 = 9
Prüfung:
quelle
h
:f=->a{h=[0,0];a.map{|v|h[v%2]+=v};e,o=h;(e*e+o*o)**0.5}
Q, 34 - 32 = 2
.
quelle
Julia, 40-46 = -6
Implementierung
Ausgabe
quelle
Kaffeeskript, (57 - 32 = 25)
Implementierung
quelle
+=
und0.5
zu.5
GolfScript 30
Ich glaube nicht, dass GolfScript in diesem Fall eine große Chance hat!
quelle
c #: 69-32 = 37
Vollständiger Code:
PS: Nur zum Spaß funktioniert das auch, leider ändert es nicht die Anzahl der benötigten Zeichen:
quelle
Prolog (73 - 32 = 41)
Hier zählen wir alles nach ': -' als Funktionskörper.
Funktion wie folgt aufrufen:
quelle
Matlab (44 - 46 = -2)
Funktionskörper ist 44 Zeichen:
Gesamtfunktion wie folgt:
Tests der Funktion:
quelle
Python 2.7 - 64-46 = 18
Dies könnte mit etwas
zip
Magie kürzer sein , aber fürs Erste:Zur Vervollständigung stellt sich heraus, dass Sie Zip-Magie ausführen können, diese kostet Sie jedoch mehr (um einige Zeichen). Daher gilt Folgendes, es sei denn, jemand kann eine der folgenden Verbesserungen vornehmen:
quelle
abs(sum(1j**(i%2)*i for i in x))
.!s%2
? Das ist zumindest eine inkrementelle Änderung, die Sie akzeptieren könnenC # 174
Lesbar
quelle
Clojure = 87 - 46 = 41
Kaum idiomatisch.
quelle
Haskell, 64C - 46 = 18
Nicht zu schwer zu lesen. Beispiellauf:
quelle
int e=0,o=0;for(int i :n){if(i%2==0)e+=i;else o+=i;}System.out.println(Math.sqrt(e*e+o*o));
Aktuelle Methode in Java-Code
quelle
PHP 85-32 = 53
$a=$b=0;foreach($x as $q){if(($q%2)==0)$a=$a+$q;else$b=$b+$q;}echo sqrt($a*$a+$b*$b);
Das ist das Beste, was ich als Neuling hervorgebracht habe. Ich bin mir sicher, dass es auch einige kürzere Versionen geben muss.
BEARBEITEN:
Eine reduzierte Version des Codes könnte sein:
Diese Version enthält nur 64 (21 weniger als die ursprüngliche Antwort) Zeichen.
Gesagt 64-32 = 32
quelle
foreach($l as$m)$m%2?$o+=$m:$e+=$m;echo sqrt($o*$o+$e*$e);
VB.net (81c - 11c = 70) - 32 = 38
Über die freie Verwendung des Begriffs Schreiben Sie eine Funktion
quelle
XQuery, (63 - 32 = 31)
Implementierung
Ausgabe
BaseX wurde als XQuery-Prozessor verwendet.
quelle
Erlang: 82C - 32 = 50
Erlang ist nicht so toll dafür. Die meisten Verknüpfungen bestehen aus mehr Zeichen (Tupel usw.).
Das einzig Wahre ist zu beachten:
{lists,sum}
ist ein Funktionsverweis auflists:sum
und kann aufgerufen werden--
( Liste subtrahiert ) wirdKann anrufen mit:
Ausgabe:
78.49203781276162
quelle
Haskell
57 - 32 = 25
Gerade Optimierung von Crazed Gremlins Antwort:
Optimierungen:
read$show
ist kürzer alsfromIntegral
- 3 Zeichens=sum\n
und zweis
hat eine Gesamtlänge von 8 Zeichen, zweisum
sind nur 6 Zeichen. - 2 ZeichenIch habe auch versucht, dem Operator mehr Dinge hinzuzufügen, aber es hat genauso lange gedauert:
quelle