Das Ausschreiben von Zahlen gehört zu den Hello-Programmierwelten, häufig sind es die Zahlen 1-10.
Ich möchte viele Zahlen aufschreiben! Viele, viele Zahlen. Aber wie viele Zahlen muss ich schreiben?
Aufgabe
Geben Sie bei einer Ganzzahleingabe eine Zahl als Ausgabe an, die die Anzahl der Stellen angibt, die sich in einer Zeichenfolge befinden, die alle Ganzzahleingaben im Bereich von 0 bis einschließlich Eingabe enthält. Die Negationskennung ("-") zählt als ein einzelnes Zeichen.
Beispiel I / Os
Input: 8
Ausgeschrieben: 0,1,2,3,4,5,6,7,8
Output: 9
Eingabe: 101
ausgeschrieben: 0,1,2,3 ...., 99,100,101
Ausgabe: 196
Eingabe: 102
ausgeschrieben: 0,1,2,3 ...., 100,101,102
ausgegeben: 199
Eingabe -10
Ausgeschrieben: 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10
Ausgabe: 22
Dies ist ein Code-Golf . Die niedrigste Anzahl von Bytes gewinnt!
Bash + OS X (BSD) -Dienstprogramme,
24 bis22 ByteVielen Dank an @seshoumara für das Speichern von 2 Bytes.
Testläufe unter Mac OS X:
Hier ist eine GNU-Version:
Bash + Coreutils,
4038 BytesWieder 2 Bytes dank @seshoumara gespeichert.
Probieren Sie es online!
quelle
fold -1|wc -l
, um das Zählen zu tun? Es ist kürzer.Python 2,
83,7864 Byteskürzeste Version:
Diese Version hat dank @numbermaniac 5 Bytes gespart:
Probieren Sie es online!
Dieses habe ich mir danach selbst ausgedacht (gleiche Anzahl von Bytes):
Probieren Sie es online!
quelle
map
78 Bytes in der zweiten Zeile:print len(''.join(map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))
. Sie können sogar noch mehr sparen, indem Sie einen Lambda daraus machen.print sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))
lambda x:sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))
für 71 BytesJava 7, 74 Bytes (rekursiv - einschließlich des zweiten Standardparameters)
Erklärung (1):
Java 7,
8179 Bytes (Schleife - einzelner Parameter)Wenn ein zweiter Standardparameter
0
für diesen rekursiven Ansatz aus irgendeinem Grund nicht zulässig ist, kann stattdessen eine for-Schleife wie die folgende verwendet werden:Erklärung (2)
Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
RProgN 2 , 5 Bytes
Explination
Einfache Lösung, wirkt wie ein Zauber.
Probieren Sie es online!
quelle
Brachylog , 5 Bytes
Probieren Sie es online!
Erstellt den Bereich [0, Eingabe], konvertiert jede Zahl in eine Zeichenfolge, verknüpft sie zu einer einzelnen Zeichenfolge und gibt die Länge des Ergebnisses zurück
quelle
Z
. was ist damit? Sollte es in der Zählung sein?Z
Brachylog-Interpreter das Argument erhält, wird er aufgefordert, einen geeigneten Wrapper hinzuzufügen, um die Funktion testbar zu machen. (Wenn Sie es als vollständiges Programm ausführen, wird keine Ausgabe erzeugt.) Wir erlauben hier Programm- oder Funktionsübermittlungen, sodass dies nicht gegen die Anzahl der Bytes angerechnet werden sollte, da es eigentlich nicht Teil der Übermittlung ist.PHP,
59-60BytesOutgolfed von Roberto06 - https://codegolf.stackexchange.com/a/112536/38505
Dank roberto06 für das Bemerken, dass die vorherige Version für negative Zahlen nicht funktionierte.
Erstellt einfach ein Array der Zahlen, setzt es in eine Zeichenfolge und zählt dann die Ziffern (und das Minuszeichen)
Beispiel ausführen:
php -f 112504.php 8
quelle
join
anstelleimplode
eines Alias verwenden.[--9]
Haskell ,
3938 BytesProbieren Sie es online! Bearbeiten: 1 Byte dank @xnor gespeichert!
Erläuterung:
In Haskell für Zahlen
a
undb
[a..b]
ist der Bereich vona
bisb
in 1-Schritten oder 1-Schritten, je nachdem, obb
größer ista
. Also für eine positiven
der ersten Liste in[0..n]++[n..0]
ist[0,1,2,...,n]
und das zweite ist leer. Bei negativn
ergibt sich der zweite Bereich[0,-1,-2,...,n]
und der erste ist leer. Wenn jedochn=0
beide Bereiche die Liste ergeben[0]
,[0,0]
würde die Verkettung zu einem falschen Ergebnis von führen2
. Deshalb0
wird es als Sonderfall behandelt.Der
=<<
-Operator in einer Liste ist derselbe wieconcatMap
, also wird jede Zahl durch in eine Zeichenfolge umgewandeltshow
und alle diese Zeichenfolgen werden in einer langen Zeichenfolge verkettet, von der dielength
schließlich zurückgegeben wird.Vor xnors Tipp habe ich
[0,signum n..n]
statt[0..n]++[n..0]
.signum n
ist-1
für negative Zahlen,0
für Null und1
für positive Zahlen und ein Bereich des Formulars erstellt[a,b..c]
die Liste der Zahlen vona
bisc
mit Inkrementb
. Dadurch wird[0,signum n..n]
der Bereich[0,1,2,...,n]
für Positivn
und[0,-1,-2,...,n]
für Negativ gebildetn
. Dennn=0
es würde die unendliche Liste bilden,[0,0,0,...]
so dass wir auch0
einen Sonderfall behandeln müssen.quelle
[0..n]++[n..0]
sollte für tun[0,signum n..n]
.PHP,
4135 Bytes6 Bytes dank user59178 gespart
Da die Antwort von ʰᵈ für eine negative Eingabe falsch war, habe ich es auf mich genommen, eine neue Lösung zu erstellen:
Diese Funktion:
0
bis$argv[1]
(auch als Eingabe bezeichnet)Probieren Sie es hier aus!
quelle
preg_match()
:(range()
wenn es nicht deine Lösung gegeben hätte, ich denke wir sind gerade;)join()
anstelle von verwendenimplode()
. Es ist ein Alias für die gleiche Sache. php.net/manual/en/function.join.phpimplode
, aber ich wusste nicht, dass ich den gue-Parameter weglassen kann. Vielen Dank !Ruby ,
20 2629 BytesProbieren Sie es online!
quelle
R,
2620 Bytessum(nchar(0:scan()))
Sehr grundlegender Ansatz:
Machen Sie einen Vektor 0: x
Zähle die Zeichen in jedem Wert (wird automatisch zu einer Zeichenkette gezählt)
Nicht sicher, ob es irgendwelche Tricks gibt, um die Funktionsdefinition zu reduzieren?Dank Giuseppe konnten 6 Bytes gespart werden, indem stattdessen stdin verwendet wurde.quelle
sum(nchar(0:scan()))
stattdessen tun und stattdessenn
von stdin lesen .Mathematica,
484746 Bytes-1 Byte danke an Martin Ender !
Anonyme Funktion, die die Zahl als Argument verwendet.
Kürzere Lösung von Greg Martin , 39 Bytes
quelle
Sign@#
für verwenden#/Abs@#
.1-#~Min~0+Tr@IntegerLength@Range@Abs@#&
. Der Anfangsbuchstabe1
berücksichtigt die Ziffer 0, während-#~Min~0
alle negativen Vorzeichen berücksichtigt werden, wenn die Eingabe negativ ist.Batch, 110 Bytes
Berechnet
sum(min(0,abs(n)+1-10^k),k=0..9)+(n<0?1-n:1)
. (Ich muss nur9
wegen der Einschränkungen der Ganzzahl-Arithmetik von Batch nach oben gehen .)quelle
Python 2 , 68 Bytes
Probieren Sie es online!
Länger als, aber anders als andere Python-Lösungen. Definiert eine rekursive Funktion mit dem Namen eg
f(10)
quelle
MATL , 11 Bytes
Probieren Sie es online!
quelle
Power Shell , 23 Byte
Probieren Sie es online! (wird bei TIO für sehr große (absolute) Eingänge gesperrt)
Verwendet den
..
Bereichsoperator, um einen Bereich von0
bis zur Eingabe zu erstellen$args
(Umwandlung aus dem Eingabearray als Zeichenfolge). Das ist-join
zusammen in einer Zeichenfolge (zB01234
) und dann wird dieLe
Länge davon genommen. Das bleibt in der Pipeline und die Ausgabe ist implizit.quelle
Perl 6 , 18 Bytes
Versuch es
Erweitert:
quelle
QBIC , 25 Bytes
Erläuterung:
quelle
JavaScript, 50 Bytes
Zusammenarbeit mit @ETHproductions
quelle
Bash + GNU Coreutils, 28
Probieren Sie es online aus .
quelle
Retina , 28 Bytes
Probieren Sie es online!
Erläuterung
Wandle die Zahl in eine unäre Zahl um, ohne das Zeichen zu verändern.
Jede 1 wird durch alles bis auf sich selbst und eine neue Zeile ersetzt. Damit erhalten wir einen Bereich von 1 bis n, wenn n positiv war, von -1 bis n mit einem zusätzlichen
-
Wert am Anfang, wenn es negativ war. Alle Zahlen sind unär und durch Zeilenumbrüche getrennt.Konvertieren Sie jede Folge von Einsen in die entsprechende Dezimalzahl.
Setzen Sie ein
0
am Anfang und ersetzen Sie das Extra-
wenn es da ist.Zählen Sie die Anzahl der Zeichen (ohne Zeilenvorschub).
quelle
Emacs, 20 Bytes
Der Befehl selbst besteht aus 20 Tastenanschlägen, aber ich muss klarstellen, wie dies als Byte gezählt werden soll. Ich war der Meinung, dass es am fairsten wäre, jeden Tastendruck als 1 Byte zu zählen. Der obige Befehl ist herkömmlich geschrieben, um das Lesen zu erleichtern.
Erläuterung
Beginnen Sie mit der Definition eines Tastaturmakros.
Erstellen Sie einen neuen Makrozähler. Schreibt
0
in den Puffer; Der Wert des Zählers ist jetzt 1.Tastaturmakrodefinition beenden.
Geben Sie nach dem Drücken von META Ihre Eingabenummer ein. Das
C-x e
führt dann das Makro so oft aus.Setzen Sie die Markierung auf den Anfang des Puffers (der den gesamten so erzeugten Text auswählt).
Führen Sie die Zeichenanzahl für die ausgewählte Region aus. Die Anzahl der Zeichen wird im Minipuffer gedruckt.
Beispiel
Entschuldigung für die schreckliche Hervorhebungsfarbe. Dies ist ein Beispiel für die Verwendung dieses Befehls mit der Eingabe 100. Die Ausgabe befindet sich im Minipuffer am unteren Bildschirmrand.
quelle
Lua, 52 Bytes
Durchläuft eine for-Schleife von der 0-Eingabe, konvertiert die Ganzzahl
i
in eine Zeichenfolge und fügt die Länge der Zeichenfolget
vor dem Drucken hinzut
quelle
Perl 5 , 32 Bytes
31 Byte Code +
-p
Flag.Probieren Sie es online!
quelle
C #,
7773 Bytes-4 Bytes dank @Kevin Cruijssen
Lambda-Funktion:
Ungolfed und mit Testfällen:
quelle
while
to ändernfor
, um ein paar Bytes zu speichern:(r)=>{var l="";for(int i=0,s=r<0?-1:1;i!=r+s;i+=s)l+=i;return l.Length;};
( 73 Bytes )Func<int, int>
können Sie die Funktionen aufrufenr=>...
, um 2 Bytes zu sparen (kann dies wahrscheinlich trotzdem tun).JavaScript, 44 Bytes
quelle
REXX, 56 Bytes
quelle