Diese Herausforderung besteht darin, ein Programm oder ein Skript zu schreiben, das die Summe aller Ziffern innerhalb der ganzen Zahlen von 1 bis einschließlich einer bestimmten Zahl zählt.
Eingabe, eine positive ganze Zahl. Ausgabe, die Summe der Ziffern dieser Zahl und aller kleineren Zahlen.
Beispiele:
Input: 5
Integer Sequence: 1, 2, 3, 4, 5
Sum of Digits: 1 + 2 + 3 +4 + 5 = 15
Input: 12
Integer Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Sum of Digits: 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 1 + 0 + 1 + 1 + 1 + 2 = 51
Um klar zu sein, ist dies eine Summe der Ziffern zu zählen - nicht die ganzen Zahlen. Dies gilt auch für einstellige Eingaben. Eingaben, die größer als 10 sind, reagieren jedoch unterschiedlich. Dies wäre eine falsche Antwort:
Input: 12
Output: 78
Ein weiteres Beispiel, um den Unterschied zu zeigen:
Input: 10
Integer Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Sum of Integers (INCORRECT RESPONSE): 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55
Digit Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0
Sum of Digits (CORRECT RESPONSE): 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 1 + 0 = 46
Ein größerer Testfall (RICHTIGE ANTWORT):
Input: 1000000
Output: 27000001
Regeln & Richtlinien:
- Der übermittelte Code muss ein vollständiges Programm oder Skript sein - nicht nur eine Funktion. Wenn für den Code Einschlüsse, Importe usw. erforderlich sind, müssen diese im Buchungscode enthalten sein.
- Die Nummer muss vom Benutzer eingegeben werden - nicht fest codiert. Eingaben können als Befehlszeilenargument, Datei, Standardeingabe oder auf andere Weise empfangen werden, mit der Ihre Sprache Benutzereingaben verarbeiten kann.
- Der Code muss in der Lage sein, mindestens bis zu Eingaben ordnungsgemäß zu verarbeiten
(2^64)-1
. - Der Code sollte nur die Summe ausgeben.
- Eingereichte Programme und Skripte sollten benutzerfreundlich sein und keine Computerressourcen verschwenden (z. B .: Sie sollten keine wahnsinnig großen Arrays deklarieren, in denen jedes Zeichen Platz findet). Es gibt keinen strengen Bonus oder eine Strafe dafür, aber bitte seid gute Programmierer.
Wertung:
Der primäre Bewertungsmechanismus ist die Codelänge. Niedrigere Werte sind besser. Die folgenden Boni und Strafen gelten ebenfalls:
- -25 Bonus, wenn Ihr Code alle positiven Zahlen verarbeiten kann, zum Beispiel:
1234567891234567891234564789087414984894900000000
- -50 Bonus, wenn Ihr Code beispielsweise einfache Ausdrücke verarbeiten kann
55*96-12
. Um sich für diesen Bonus zu qualifizieren, sollte der Code+ - / *
Operatoren (Addition, Subtraktion, Division, Multiplikation) handhaben und die Reihenfolge der Operationen durchsetzen. Division ist eine reguläre Ganzzahldivision.- Das angegebene Beispiel (
55*96-12
) ergibt5268
. Ihr Code sollte für jede dieser Eingaben den gleichen Wert zurückgeben - die richtige Antwort lautet81393
.
- Das angegebene Beispiel (
- -10 Bonus, wenn sich Ihr Code für den -50 Bonus qualifiziert und mit dem
^
(Exponenten-) Operator umgehen kann . - -100 Bonus, wenn sich Ihr Code für den -50 Bonus qualifiziert und keine
eval
oder ähnliche Ausdrücke verwendet. - +300 Strafe, wenn Ihr Code auf Webressourcen angewiesen ist.
55*96-12
zurückkehren?Antworten:
Perl 6: 108 - (25 + 50 + 100) + 0 = -67 Punkte
Golfed-Lösung (Final Line basiert auf der großartigen Lösung von xfix ):
Lösung ohne Golf:
Der Evaluierungsschritt funktioniert durch Iterieren über jedes Symbol
*
,/
,+
,-
, zu finden , wenn das liegt zwischen zwei ganzen Zahlen, und Ersetzen , dass die Funktion des Symbol darstellt.Genauer gesagt: Es nimmt jedes Symbol (z. B.
+
) und die Infix-Funktion, die es darstellen soll (z. B.&[+]
die Abkürzung für&infix:<+>
und dieselbe Funktion, die Perl 6 beim Ausführen aufruft1 + 2
), und führt eine globale Ersetzung durch (s:g[…] = …
ähnlich wie Perl 5)s/…/…/ge
), der zwei durch das Symbol ((\d+) $sym (\d+)
) getrennte Ganzzahlen entspricht und durch die Ausgabe der entsprechenden Infix-Funktion ersetzt, die mit diesen Ganzzahlen (infix($0, $1)
) aufgerufen wird .Schließlich wird dieser ausgewertete Ausdruck eingespeist
say [+] (1..$expression)».comb
, was xfix in seiner Lösung sehr gut erklärt .Tut mir leid, dass ich so spät zur Party komme
BEARBEITEN: Unterstützung für Exponenten entfernt; es waren sowieso genau 10 Zeichen und die Assoziativität war nicht korrekt.
quelle
my $g
Vielleicht möchten Sie stattdessen etwas Vorangemeldetes verwenden (ich glaube, das$!
könnte funktionieren, habe es aber nicht getestet).my$g=get;for <* / + -> {$g~~s:g[(\d+)$^s(\d+){}]=infix:[$^s] |@()};say [+] (1..$g)».comb
Dies würde die Punktzahl auf 88 Zeichen oder -97 PunkteMathematica 30- (10 + 50) = -30
Verkürzt um 4 Zeichen dank ybeltukov.
Range@n
Liefert die Zahlen von 1 bisn
.Integerdigits@n
teilt jede dieser Zahlen in Ziffern auf.Total[n,2]
summiert die Ziffern. Die 2 soll das Summieren über verschiedene Ebenen hinweg ermöglichen, dh Listen von Listen.Testen
Ausdrücke
quelle
Tr@Flatten
kann reduziert werdenTotal[...,2]
:IntegerDigits@Range@#~Total~2&
.C:
150138 - (100 + 50) = -12Sehr beschämend, @Fors Antwort von hier zu stehlen, um die Ausdrucksbewertung durchzuführen: https://codegolf.stackexchange.com/a/11423/13877
Beispielnutzung:
Anmerkung: Die Ausdrucksimplementierung nimmt keine Operatorpriorität an und verbraucht die Werte so, wie sie empfangen werden. ex,
1+2*3 = 9
eher als das typische7
.quelle
sed,
411283 - 25 = 258Ich kann mich momentan nicht mehr darum kümmern, Golf zu spielen. :-) Nicht empfohlen für die Verwendung mit auch nur entfernt großen Ganzzahlen, aber technisch gesehen könnte es mit beliebig großen Ganzzahlen umgehen (wahrscheinlich geht Ihnen der Arbeitsspeicher jedoch ziemlich schnell aus, da ich die Zahl (mehr oder weniger) einkodieren muss unary).
Beispielgebrauch
(Eingabezeilen zum leichteren Lesen eingerückt.)
quelle
Python, 55- (50 + 25 + 10) = -30
Ineffizient und doch kürzer und auch in der Lage, Ausdrücke zu verarbeiten.
EDIT: Danke Wolframh und legoStormtroopr für die Tricks: D
Python, 149- (25 + 50 + 10) = 64
Meine erste Version
Eingang:
Ausgabe:
quelle
xrange
Lösung auf1234567891234567891234564789087414984894900000000
xrange
: Deval(raw_input())
durchinput()
. Diewhile
Schleife könntewhile t:s+=sum(map(int,
t sein));t-=1
.input()
anstelle von verwendeneval(raw_input())
, da diesinput
bereitseval
der Ausdruck ist! Dies bedeutet, dass Sie den Binus -10 für das Energiesymbol und den Bonus -100 für Nichtbenutzung erhalten könneneval
!!!eval
und ähnlich , so denke ich, die -100 würde nicht zählenPython - 108 Zeichen minus 85 Boni, 23 Striche, verarbeitet sehr sehr sehr große Eingaben
Die meisten dieser Lösungen scheinen alle Ints weniger als die Eingabe zu durchlaufen und alle ihre Ziffernsummen zu addieren. Das funktioniert, aber ich halte es für unelegant und würde die Frage stellen, ob sie wirklich für den 25-Punkte-Bonus in Frage kommen, da ich nicht glaube, dass sie in der Lage wären, die Eingaben
1234567891234567891234564789087414984894900000000
in unserem Leben zu verarbeiten. Tatsächlichn
brauchen diese Lösungen bei der Eingabe von ZiffernO(10^n)
Zeit. Ich habe mich stattdessen entschlossen, ein bisschen Mathe auf dieses Problem zu werfen.Die Menge aller
x
Ziffern ist isomorph zur Menge{0,1,2,3,4,5,6,7,8,9}^x
. Für eine feste(n,sig)
gibt esx
unterschiedliche Werte fürsig
,10^x-1
Punkte mit demsig
th Indexmenge zun
, und die Summe aller Ziffern0-9
ist 45. Dies alles durch gehandhabt wirdf
.g
ist etwas, mit dem wir wahrscheinlich alle vertraut sindmagic
Nimmt alle Ziffern der eingegebenen Nummer und durchläuft sie von der niedrigsten bis zur höchsten. Dies lässt sich am einfachsten mit einer Beispieleingabe verfolgen1,234,567
.Um mit dem Bereich umzugehen
1,234,567-1,234,560
, müssen wir alle Ziffern von1
bis7
addieren7
und die Summe der anderen Ziffern addieren , um mit allen Zahlen umzugehen, die größer als sind1,234,560
. Wir müssen uns jetzt um den Rest kümmern.Um mit dem Bereich umzugehen
1,234,560-1,234,500
, fügen wir das6
(val
) hinzu und senken die Obergrenze auf1,234,559
. Wenn wir den Rest des Abwurfs machen, sehen wir jede einstellige Zahl sechsmal (val*f(sig)
). Wir werden alle Zahlen von0
bis5
genau zu10
jeder Zeit sehen ((10**sig)*g(val-1)
). Wir werden alle anderen Ziffern in dieser Nummer genau 60 Mal sehen ((val*10**sig)*sum(digits[sig+1:])
). Wir haben uns jetzt mit allen Zahlen auseinandergesetzt, die strikt größer sind als1,234,500
. Die gleiche Logik gilt induktiv für alle Bedeutungen.Golfen dies, dank WolframH, reduziert diese Lösung auf
Und die Summe der Ziffernsummen aller ganzen Zahlen bis zu
1234567891234567891234564789087414984894900000000
ist265889343871444927857379407666265810009829069029376
Die größte Zahl, die ich bei der Golf-Version geschafft habe, ist 10 ^ 300, an diesem Punkt fangen die Schwimmer an zu überlaufen und die numerische Instabilität fängt an, Probleme zu verursachen. Mit einer schnellen Funktion zur Potenzierung von Quadraten und Multiplikationen würde dieses Problem verschwinden.
Und LaTeX-Unterstützung wäre wirklich nützlich ...
quelle
2.65889343871e+50
, das ist eine Gleitkommanäherung an die reale Lösung. Anscheinend haben Sieint(t)
anstelle dest
von Ihnen angegebenen Codes gedruckt . Das ist falsch; Die wirkliche Lösung ist265889343871444899381999757086453238874482500000214
. Vermeiden Sie einfach die Verwendung von Schwimmern, dh ersetzen Sie diese**(x-1)
durch die kürzeren**x/10
.d
(weil es zweimal verwendet wird). Wenn man die anderen eliminiert (und einige Tricks anwendet), kommt man zud=map(int,str(input()))\nprint sum(v*(10**s*((v-1)/2+sum(d[:~s]))-~s*9*10**s/2)for s,v in enumerate(d[::-1]))
(108 Zeichen). Läuft gut auf Eingaben jeder Größe (wieint("1"*1000)
).10**-1
ist0.1
, und von da an wird alles in Schwimmer verwandelt.1/10
ist0
(ganzzahlige Division), und alles kannint
s bleiben .TI-BASIC, 137 - (50 + 10 + 100) = -23
Die Eingabe verarbeitet Zahlen bis zu
1E100
und wertet sie automatisch aus. Kann mit Ausdrücken umgehen.Obwohl es ein wahnsinnig großes Array ist, verschwende ich keine Computerressourcen (dies wird von einem Taschenrechner ausgeführt ).
quelle
eval
sollte nicht eingenommen werden.Scala 66
quelle
C
77,74C
150,124-25 = 99Hier ist eine alternative Version, die technisch für den Bonus von 25 für "jede" positive Ganzzahl in Frage kommen sollte , aber sie ist unpraktisch langsam, da der Algorithmus in seiner Eingabe eine lineare Zeit aufweist. Trotzdem hat es Spaß gemacht zu schreiben. Subtrahiert manuell eine als ASCII-Zeichen eingelesene Zahl. Diese Version ist 150 Zeichen. (Jetzt mit schrecklichem, argumentierendem, schleifenförmigem Code!)
C,
229224 - (50 + 100) = 74Variation im Umgang mit Ausdrücken. Implementiert Operatorpräzedenz nach typischen Regeln:
/ * - +
. Beschränkt auf 97 Token = 48 Bedingungen.quelle
GolfScript 18 - 50 = -32
Erläuterung: Angenommen, die Eingabe ist "12":
Stack ist
[0,1,2,3,...,12]
.Stack ist
"01234...9101112"
.Stack ist
"0 1 2 ... 1 0 1 1 1 2"
.Stack ist
[0,1,2,...,9,1,0,1,1,1,2]
.Der Stapel ist wie gewünscht 51.
Die Eingabe kann ein beliebiger gültiger GolfScript-Ausdruck sein, der Exponenten enthalten kann. Beispielsweise:
Seit
2(5 + 5) - 8 = 12
. Ich denke, dies sollte sich für den Bonus qualifizieren, aber vielleicht sollte es nur in normaler Form sein, nicht in der umgekehrten polnischen Notation von GolfScript.quelle
^
auch??
^
, nicht?
oderpow
und usw.Rubin, 37 - 50 = -13
Doppelte Bewertung, den ganzen Weg über den Himmel! Wie bei den anderen Ruby-Lösungen sollte dies theoretisch mit beliebig großen Zahlen funktionieren können, aber die Ausführungszeit wäre ... fatal.
Ältere Version (49 - 50 Punkte)
Angenommen, der Bonus von 10 Zeichen setzt tatsächlich voraus, dass das Zeichen für die Potenzierung ein Caret ist. Der kürzeste Weg, den ich einschätzen könnte, ist:
Was mehr Charaktere kostet als der Bonus geben würde.
quelle
p"#{[*1..eval(gets)]}".chars.map(&:to_i).inject :+
&
fast nicht genug im Golf. Tatsächlich brauchen Sie auch keinen Abstand zwischeninject
und:+
.Perl 6 (28 - 75 + 0 = -47 Byte)
Es kann mit allen positiven Zahlen umgehen (große Zahlen werden jedoch eine lange Zeit in Anspruch nehmen, da derzeit Perl 6-Implementierungen langsam sind, Perl 6 jedoch große ganze Zahlen nativ unterstützt). Es verwendet
eval
, um einen einfachen Taschenrechner zu implementieren (fünf Zeichen Strafe für fünfzig Zeichen ist es wert). Es ist langsam, nur weil die aktuellen Implementierungen langsam sind, aber theoretisch sollte es schnell genug sein (wenn Perl 6-Implementierungen verbessert werden). Überraschenderweise gewinne ich auch mit der Mathematica (vorerst).»
In diesem Code wird er eigentlich nicht benötigt, aber ich habe ihn aus Performancegründen hier abgelegt (andernfalls würde das Programm den gesamten String zuweisen. Der Grund dafür ist, dass Perl 6 keine unendlichen Strings hat, aber unendliche Listen.Wie auch immer, Sie können sich fragen, wie dieser Code überhaupt funktioniert. Nun, ich werde es Teil für Teil weitergeben.
get.eval
Dies erhält eine Zeile (
get
Funktion) und wertet diese aus (eval
Methode).1..get.eval
Danach bereitet Perl 6 ein Bereichsobjekt von
1
bis zum ausgewerteten Wert vor. Dies ist eine Reichweite, daher wird nichts Großes zugewiesen.».comb
.comb
Methode teilt Zeichenfolge in Zeichen auf ( sofern nicht mit einem Argument aufgerufen ). Zum Beispiel'cat'.comb
kehrt zurück'c', 'a', 't'
.»
ordnet die Listenelemente zu, wird also.comb
für jedes Element ausgeführt - nicht nur für die Liste selbst (z. B.(4, 9)».sqrt
gibt2, 3
). Dies belegt auch nicht mehr als nötig, da Perl 6 unendlich viele Listen hat (wie zum Beispiel Haskell).»
Zeichen werden eigentlich nicht benötigt, da.comb
es direkt in der Liste verwendet werden kann, dies beinhaltet jedoch impliziten String-Zwang (und Perl 6 hat keine unendlichen Strings, so dass dies Speicher verschwenden würde). Beispiel:1, 2, 3
Liste nach Konvertierung in die Zeichenfolge gibt zurück1 2 3
. Für Perl 6 ist ein Leerzeichen eine sehr feine Zahl, die 0 bedeutet, sodass der Code auch bei einer solchen Konvertierung funktionieren würde. Es würde jedoch Computerressourcen missbrauchen.[+]
Dies ist ein Reduktionsoperator. Grundsätzlich können
[]
Sie in diesem Fall zwischen einen Operator eingeben+
. Die Liste nach reduzieren Bediener verringert wird , so[+] 1, 2, 3
ist1 + 2 + 3
, was ist6
. Perl 6 verwendet separate Operatoren für Zahlen und Zeichenfolgen, sodass dies nicht als Verkettung betrachtet wird.say
Zum Schluss wird
say
das Ergebnis ausgegeben. Immerhin wollen Sie das Endergebnis sehen, nicht wahr?quelle
[+] 1,2,3,4,5,6,7,8,9,10
ist1+2+3+4+5+6+7+8+9+10
, habe ich recht?>
kann beispielsweise verkettet werden,3 > 2 > 1
ist also wahr. Die gleiche Eigenschaft gilt Betreiber zu reduzieren, so ist[>] 3, 2, 1
immer noch wahr, wie es heißt3 > 2 > 1
-[>]
verwendet werden kann , um festzustellen , ob Zahlen in absteigender Reihenfolge sind.get.Int
anstelle von verwendeneval
? Benötigt es mathematische Ausdrücke?sort
ohne Argument der Vergleichsmethode).Perl 31 - Keine Boni
Beispielausgabe:
Perl 5 mit
-p
50 - 28 Bytes: -22Probieren Sie es online!
quelle
J, 22
Erläuterung
Die Auswertung erfolgt von rechts nach links.
quelle
+/,10#.inv>:i.
wäre kürzer. Aber es ist immer noch eine Funktion und kein vollständiges Programm wie OP gefragt.R 64 - (50 + 10) = 4
Wenn dies ausgeführt wird, wird der Benutzer zur Eingabe aufgefordert.
Alte Version (kann keine Ausdrücke verarbeiten): 46 Zeichen:
quelle
u<-function(x) utf8ToInt(x)
.u <- utf8ToInt
ohne zu habenfunction
. Dies kann beim Codegolf hilfreich sein, wenn die Funktion mehrmals verwendet wird.Rcheatcodegolf
Paket erstelle , ist es dann zulässig, die vordefinierten Funktionen in diesem Paket zu verwenden? :-)Charge - (181 - 50) - 131
Nur zum Spaß.
Ich werde es ein bisschen lesbarer machen:
Die alte Methode verwendet die for-Schleife, um die Ausgabe des Powershell-Befehls abzurufen, im Gegensatz zum Schreiben in und Lesen aus einer Datei:
Setzen Sie die Eingabe auf eine Variable -
v
-/a
, um arithmetische Ausdrücke zu akzeptieren.Leider war eine verzögerte Erweiterung notwendig.
Verwenden Sie eine for-Schleife, um von 1 bis zum eingegebenen Wert zu zählen -
v
.Um mit Zahlen größer als 9 umgehen zu können, musste ich Powershell verwenden, um die Länge der Zeichenfolge zu ermitteln, und dann eine andere for-Schleife verwenden, um die Zeichenfolge aufzuteilen und zur Summe hinzuzufügen -
s
.Sie können den Namen von
powershell.exe
inp.exe
C: \ WINDOWS \ System32 \ WindowsPowerShell \ v1.0 \ ändern und ihn dann mit nurp "&{'%%a'.length-1}
9 Byte speichern. Aber das stimmt nicht wirklich.Habe das zweite Rennen hinter mir gelassen, während ich meine Mittagspause eingelegt habe.
Ich kann es nicht wirklich mit Zahlen testen, die zu viel größer sind, weil es zu langsam ist. Es sollte jedoch für ziemlich große Zahlen funktionieren.
2147483647
ist die größte Zahl, die benötigt wird (maximal 32-Bit-Ganzzahl), bevor der folgende Fehler ausgegeben wird:Dies disqualifiziert mich natürlich von der Herausforderung.
quelle
v
und%1
direkt verwenden. 2. Sie können 1 innerhalb Ihres PowerShell-Skripts abziehen, anstatt die Länge, mit@set /a b=%%b-1
der Sie viel Geld sparen. Mit diesen Änderungen habe ich es von ursprünglich 240 auf 211 reduziert. :-)[decimal]
Typ ermöglicht Werte bis zu (2 ^ 96) -1.Dyalog APL , 9-160 * = -151
Probieren Sie es online!
⎕
ausgewerteten Input bekommenzB
"7+5"
gibt12
⍳
Indizes 1 ... n[1,2,3,4,5,6,7,8,9,10,12]
⍕¨
Formatieren Sie jede Zahl in eine Zeichenfolge["1","2","3","4","5","6","7","8","9","10","11","12"]
∊
eintreten (abflachen)"123456789101112"
⍎¨
führe jedes Zeichen aus (ergibt eine Liste von einstelligen Zahlen)[1,2,3,4,5,6,7,8,9,1,0,1,1,1,2]
+/
Summe51
* Wertung
-50 Bonus, da er sogar Ausdrücke als Eingabe akzeptiert. Der Ausdruck muss eine gültige APL sein, die nach OP zulässig ist .
-10 Bonus weil es auch die
^
(*
in APL) behandelt.-100 Bonus, da Ausdruckseingaben ohne explizite Verwendung von
eval
(dh⍎
in APL) verarbeitet werden.quelle
eval
" angibt, wenn Ihr Code für den -50 Bonus qualifiziert ist und keine oder ähnliche Ausdrücke verwendet. Da⍎¨
jedes Zeichen einzeln ausgeführt zu werden scheint, ist es ein bisschen dasselbe wie ein eval (außer, dass es die Zeichen ausführt eins nach dem anderen statt alle zur gleichen Zeit, wie es dereval
Fall ist).⍎¨
wird nur zum Konvertieren von Ziffern in Ganzzahlen verwendet, nicht zum Behandeln von Ausdrücken.⎕
irgendwie eine eingebaute Eingabe + Auswertung, oder erfolgt die Auswertung immer implizit, wenn Ausdrücke eingegeben werden?⎕
nimmt immer einen Ausdruck als Eingabe, wertet ihn aus und gibt sein Ergebnis zurück. Um eine Zeichenfolge einzugeben, müssen Sie sie in Anführungszeichen setzen. Die Tatsache, dass ein zugehöriges eingebautes (⍞
) die Eingabe als unformatierten Text zurückgibt, sollte keine Rolle spielen (zumal die Symbole darauf hinweisen, dass dies⎕
die primäre Eingabemethode und⍞
eine spezielle Variante ist), da das Erhalten des Bonus andernfalls die Implementierung einer Mathematik erfordern würde Evaluator - eine ganz andere Aufgabe als die Hauptaufgabe. Ich mag keine Boni, und die -100 ist einfach albern oder hatte APL im Sinn, aber imho, es scheint genau für den Bonus zu passen.⎕
es in der Tat die normale Art ist, Eingaben zu erhalten und Ausdrücke automatisch zu verarbeiten, sehe ich das auch als Teil des Bonus, also +1 von mir. Boni sind heutzutage sowieso albern, aber eine gute Möglichkeit, sie zu nutzen, um Ihre Punktzahl zu minimieren.C # (161)
Ziemlich
quelle
Python3 + Bash (78 - 185 = -107)
Wenn das Ergebnis des Ausdrucks keine Ganzzahl ist, wird es zuerst abgeschnitten. Wenn das Ergebnis des Ausdrucks negativ ist, ist das Ergebnis undefiniert.
Verwenden Sie es wie folgt:
1: es sei denn, Sie möchten Python von Bash als solches aufrufen, aber ich denke nicht, dass dies der Fall ist. Wenn Sie glauben, dass dies tatsächlich der Fall ist, beträgt die angepasste Punktzahl -7.
quelle
Java, 254
Behandelt Ausdrücke. Geben Sie dem Ziel den gewünschten Ausdruck. Griffe, bis die Länge lang ist. Wenn Sie bereinigen, indem Sie alle Leerzeichen in einer Zeile und keine Anweisung zum Drucken entfernen, werden 254 Zeichen verwendet (unter Berücksichtigung der Java-Programmierung mit langen, langen Wörtern).
PS: Dies ist ein vollständiges Programm, nicht nur Logik. Die angegebenen Wörter zählen für das Programm, nicht nur für die Logik.
quelle
Java (JDK8), 272
Meine erste Herausforderung, bei der ich bin, Vorschläge sind willkommen =)
Eingerückt:
quelle
CJam, 9-25 = -16
CJam ist einige Monate jünger als diese Herausforderung, daher ist dies nicht für das grüne Häkchen zulässig. Außerdem schlägt dies Perl nicht in erster Linie. ;) Der Ansatz hat mir aber sehr gut gefallen, deshalb wollte ich ihn trotzdem posten.
Teste es hier.
Die Idee ist, einen Bereich von 0 bis N zu erstellen. Dieser Bereich wird dann in eine Zeichenfolge konvertiert, die nur die ganzen Zahlen hintereinander verkettet. Für N = 12 würden wir bekommen
Dann wird jedes Zeichen mit in eine Ganzzahl umgewandelt
:~
(was ein Array von Ganzzahlen ergibt) und dann mit aufsummiert:+
. CJam kann mit beliebig großen ganzen Zahlen umgehen.quelle
Python 3 + Astor ,
10171007 Bytes - (25 + 50 + 100) = Ergebnis:84283410 Bytes durch Entfernen
ts
und Ändern gespartp
Bearbeiten: Ich kann die lächerlich lange Ganzzahl (1234567891234567891234564789087414984894900000000) [hängt meinen Computer] nicht testen, aber meines Wissens unterstützt Python 3 beliebig lange Ganzzahlen.
Diese Implementierung
Verwendetmissbraucht AST. Ich würde AST nicht als "eval or similar" missbrauchen.Zu faul, um ungolfed zu schreiben, deshalb erkläre ich dir die Klassen:
In der letzten Zeile werden diese Klassen nur in der entsprechenden Reihenfolge für die Eingabe ausgeführt, um die Reihenfolge der Vorgänge beizubehalten und unerwünschtes Verhalten zu verhindern.
Beispielverwendung ($ oder> bedeutet Benutzereingabe) und das eigentliche Programm nimmt übrigens nur eine Eingabe vor:
quelle
C # (108)
Ziemlich
quelle
int
s nicht; In C ist alles standardmäßigint
... Oh, es ist C #.Rubin -> 83-50 = 33
"Test" -Version:
Testergebnisse
quelle
C # (80)
Es ist mein weiterer Versuch.
Ziemlich
quelle
n--
und+
erforderlich? Ich glaube nicht, dass es in anderen Sprachen im C-Stil ist.2^64-1
passt nicht in 64 Bit.4.5
; 2) die durchschnittliche Summe von 20 Stellen ist90
(2^64
hat 20 Stellen); Der erwartete Wert wird also ungefähr sein90 * 2^64 ≈ 1.66*10^21
. Sie brauchen also71
höchstens ein bisschen72
.Ruby 69-50 = 19 (oder -4)
Dies kann auf jeden Fall zusammen gespielt werden, aber hier ist der
erstefünfte VersuchEs funktioniert auch für alle Zahlen, ist jedoch sehr langsam, da es langsamer als O (n) läuft, sodass ich die -25 nicht addieren würde. Wenn Langsamkeit in Ordnung ist, dann wäre es -4 obwohl
Rubin 133-50-25 = 58
Dies ist die schnellere Version, die in weniger als O (n) Zeit ausgeführt wird (und die tatsächliche Mathematik verwendet!), Sodass sie schnell Ergebnisse für große ganze Zahlen liefern kann. Dabei habe ich die -25 hinzugefügt:
quelle
Haskell, 74-25 = 49
main=getLine>>=print.sum.map(\c->read[c]).concatMap show.(\x->[0..x]).read
quelle
interact
und die Tatsache, dass>>=
für Listen ist das gleicheflip concatMap
, können Sie dies bis zu 63 Zeichen wiemain=interact$show.sum.map(\c->read[c]). \x->[0..read x]>>=show
\c->read[c]
istread.(:[])
ECMAScript 6, 86 - 50 = 36
quelle
for(i=eval(prompt(s=""));i;s+=i--)alert(s.replace(/\d/g,c=>Array(-~c).join()).length)
..join()
):for(i=eval(prompt(s=""));i;s+=i--)alert(s.replace(/\d/g,c=>Array(-~c)).length)
. 78 - 50 = 28 !R (72 Punkte)
Ausgabe:
quelle