Wie viel muss ich schreiben?


35

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 . Die niedrigste Anzahl von Bytes gewinnt!

Antworten:




11

Röda , 23 Bytes

f x{[#([seq(0,x)]&"")]}

Probieren Sie es online!

Erklärt:

f x{[#([seq(0,x)]&"")]}
f x{                  } /* Defines function f with parameter x. */
        seq(0,x)        /* Creates a stream of numbers from 0 to x. */
       [        ]       /* Creates an array. */
                 &""    /* Joins with "". */
     #(             )   /* Calculates the length of the resulting string. */
    [                ]  /* Returns the value. */


7

Bash + OS X (BSD) -Dienstprogramme, 24 bis 22 Byte

Vielen Dank an @seshoumara für das Speichern von 2 Bytes.

seq 0 $1|fold -1|wc -l

Testläufe unter Mac OS X:

$ for n in 8 101 102 -10 -1 0 1; do printf %6d $n; ./digitcount $n; done
     8       9
   101     196
   102     199
   -10      22
    -1       3
     0       1
     1       2

Hier ist eine GNU-Version:

Bash + Coreutils, 40 38 Bytes

Wieder 2 Bytes dank @seshoumara gespeichert.

(seq $1 0;seq 0 $1)|uniq|fold -1|wc -l

Probieren Sie es online!


@tuskiomi Ich habe coreutils geschrieben, als ich BSD-Dienstprogramme meinte - ich habe es unter Mac OS X getestet, wo es auch bei negativen Eingaben funktioniert (seq da ist nicht dasselbe wie GNU seq).
Mitchell Spector

@DigitalTrauma Schöne GNU-Lösung. Mach weiter und poste es selbst, wenn du möchtest. Ich denke, es ist zu anders, um als eine Variante von mir zu gelten.
Mitchell Spector


Wie wäre es mit fold -1|wc -l, um das Zählen zu tun? Es ist kürzer.
Seshoumara

6

Python 2, 83 , 78 64 Bytes

kürzeste Version:

lambda x:sum(map(len,map(str,(range(0,x+cmp(x,.5),cmp(x,.5))))))

Diese Version hat dank @numbermaniac 5 Bytes gespart:

x=input()
print len(''.join(map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))

Probieren Sie es online!

Dieses habe ich mir danach selbst ausgedacht (gleiche Anzahl von Bytes):

x=input()
print sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))

Probieren Sie es online!


Sie können mit map78 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.
numbermaniac

1
@numbermaniac kann ich so etwas ähnliches machen?
Micsthepick

1
@numbermaniac hier ist ein Äquivalent:print sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))
Micsthepick

lambda x:sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))für 71 Bytes
Felipe Nardi Batista

6

Java 7, 74 Bytes (rekursiv - einschließlich des zweiten Standardparameters)

int c(int r,int n){r+=(n+"").length();return n>0?c(r,n-1):n<0?c(r,n+1):r;}

Erklärung (1):

int c(int r, int n){     // Recursive method with two integer parameters and integer return-type
                         // Parameter `r` is the previous result of this recursive method (starting at 0)
  r += (n+"").length();  //  Append the result with the current number's width
  return n > 0 ?         //  If the input is positive
     c(r, n-1)           //   Continue recursive method with n-1
    : n < 0 ?            //  Else if the input is negative
     c(r, n+1)           //   Continue recursive method with n+1
    ?                    //  Else (input is zero)
     r;                  //   Return the result
}                        // End of method

Java 7, 81 79 Bytes (Schleife - einzelner Parameter)

Wenn ein zweiter Standardparameter 0für diesen rekursiven Ansatz aus irgendeinem Grund nicht zulässig ist, kann stattdessen eine for-Schleife wie die folgende verwendet werden:

int d(int n){String r="x";for(int i=n;i!=0;i+=n<0?1:-1)r+=i;return r.length();}

Erklärung (2)

int d(int n){                 // Method with integer parameter and integer return-type
  String r = "x";             //  Initial String (with length 1 so we won't have to +1 in the end)
  for(int i=n; i != 0;        //  Loop as long as the current number isn't 0
      i += n < 0 ? 1 : 1)     //   After every iteration of the loop: go to next number
    r += i;                   //   Append String with current number
                              //  End of loop (implicit / single-line body)
  return r.length();          //  Return the length of the String
}                             // End of method

Testcode:

Probieren Sie es hier aus.

class M{
  static int c(int r,int n){r+=(n+"").length();return n>0?c(r,n-1):n<0?c(r,n+1):r;}

  static int d(int n){String r="x";for(int i=n;i!=0;i+=n<0?1:-1)r+=i;return r.length();}

  public static void main(String[] a){
    System.out.println(c(0, 8) + "\t" + d(8));
    System.out.println(c(0, 101) + "\t" + d(101));
    System.out.println(c(0, 102) + "\t" + d(102));
    System.out.println(c(0, -10) + "\t" + d(-10));
  }
}

Ausgabe:

9   9
196 196
199 199
22  22

1
Ich mag diese Lösung, :)
tuskiomi

4

RProgN 2 , 5 Bytes

n0R.L

Explination

n0R   # A Stack of all numbers between 0 and the input converted to a number.
   .L # The length of the stringification of this.

Einfache Lösung, wirkt wie ein Zauber.

Probieren Sie es online!


4

Brachylog , 5 Bytes

⟦ṡᵐcl

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


Mir ist aufgefallen, dass TIO einen Streit hat Z. was ist damit? Sollte es in der Zählung sein?
Steenbergh

3
@steenbergh: Leos Einreichung ist eine Funktion, kein vollständiges Programm. Wenn der ZBrachylog-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.

4

PHP, 59-60 Bytes

Outgolfed 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)

<?=preg_match_all("/\-|\d/",implode(",",range(0,$argv[1])));

Beispiel ausführen: php -f 112504.php 8


Dies funktioniert nicht für einen negativen Eingang, siehe hier
roberto06

Sie könnten 3 Bytes einsparen, indem Sie joinanstelle implodeeines Alias ​​verwenden.
Mario

Es besteht keine Notwendigkeit, das Minus-1-Byte zu umgehen. Auf der anderen Seite können Sie Ihren regulären Ausdruck auf[--9]
Jörg Hülsermann

4

Haskell , 39 38 Bytes

f 0=1
f n=length$show=<<[0..n]++[n..0]

Probieren Sie es online! Bearbeiten: 1 Byte dank @xnor gespeichert!

Erläuterung:

In Haskell für Zahlen aund b [a..b]ist der Bereich von abis bin 1-Schritten oder 1-Schritten, je nachdem, ob bgrößer ist a. Also für eine positive nder ersten Liste in [0..n]++[n..0]ist [0,1,2,...,n]und das zweite ist leer. Bei negativ nergibt sich der zweite Bereich [0,-1,-2,...,n]und der erste ist leer. Wenn jedoch n=0beide Bereiche die Liste ergeben [0], [0,0]würde die Verkettung zu einem falschen Ergebnis von führen 2. Deshalb 0wird es als Sonderfall behandelt.

Der =<<-Operator in einer Liste ist derselbe wie concatMap, also wird jede Zahl durch in eine Zeichenfolge umgewandelt showund alle diese Zeichenfolgen werden in einer langen Zeichenfolge verkettet, von der die lengthschließlich zurückgegeben wird.


Vor xnors Tipp habe ich [0,signum n..n]statt [0..n]++[n..0]. signum nist -1für negative Zahlen, 0für Null und 1für positive Zahlen und ein Bereich des Formulars erstellt [a,b..c]die Liste der Zahlen von abis cmit Inkrement b. Dadurch wird [0,signum n..n]der Bereich [0,1,2,...,n]für Positiv nund [0,-1,-2,...,n]für Negativ gebildet n. Denn n=0es würde die unendliche Liste bilden, [0,0,0,...]so dass wir auch 0einen Sonderfall behandeln müssen.


Ich denke [0..n]++[n..0]sollte für tun [0,signum n..n].
xnor

4

PHP, 41 35 Bytes

6 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:

<?=strlen(join(range(0,$argv[1])));

Diese Funktion:

  • Erstellt ein Array von 0bis $argv[1](auch als Eingabe bezeichnet)
  • Implodiert es mit einem leeren Zeichen (dh transformiert es in einen String)
  • Gibt die Länge der Zeichenfolge wieder

Probieren Sie es hier aus!


Dies ist eine schönere Lösung für mich, idk, warum ich dachte, ich müsste das tun preg_match():(
ʰᵈˑ

Naja, ich hätte nicht daran gedacht, range()wenn es nicht deine Lösung gegeben hätte, ich denke wir sind gerade;)
roberto06

1
Sie können 3 Bytes sparen, indem Sie join()anstelle von verwenden implode(). Es ist ein Alias ​​für die gleiche Sache. php.net/manual/en/function.join.php
user59178

1
Und 3 weitere durch Weglassen des Parameters "Kleber".
user59178

Ich wusste, dass es einen Alias ​​für gibt implode, aber ich wusste nicht, dass ich den gue-Parameter weglassen kann. Vielen Dank !
roberto06


4

R, 26 20 Bytes

sum(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)

  • Summe

Nicht sicher, ob es irgendwelche Tricks gibt, um die Funktionsdefinition zu reduzieren? Dank Giuseppe konnten 6 Bytes gespart werden, indem stattdessen stdin verwendet wurde.


Sie könnten sum(nchar(0:scan()))stattdessen tun und stattdessen nvon stdin lesen .
Giuseppe

4

Mathematica, 48 47 46 Bytes

-1 Byte danke an Martin Ender !

StringLength[""<>ToString/@Range[0,#,Sign@#]]&

Anonyme Funktion, die die Zahl als Argument verwendet.

Kürzere Lösung von Greg Martin , 39 Bytes

1-#~Min~0+Tr@IntegerLength@Range@Abs@#&

1
Sie können Sign@#für verwenden #/Abs@#.
Martin Ender

1
Sie können ein paar Bytes mit einem etwas anderen Ansatz sparen: 1-#~Min~0+Tr@IntegerLength@Range@Abs@#&. Der Anfangsbuchstabe 1berücksichtigt die Ziffer 0, während -#~Min~0alle negativen Vorzeichen berücksichtigt werden, wenn die Eingabe negativ ist.
Greg Martin

3

Batch, 110 Bytes

@set/a"n=%1,t=n>>31,n*=t|1,t=1-t*n,i=0
@for /l %%i in (0,1,9)do @set/a"t+=(i-n)*(i-n>>31),i=i*10+9
@echo %t%

Berechnet sum(min(0,abs(n)+1-10^k),k=0..9)+(n<0?1-n:1). (Ich muss nur 9wegen der Einschränkungen der Ganzzahl-Arithmetik von Batch nach oben gehen .)


3

Python 2 , 68 Bytes

def f(i,j=1):
 if i==0:print j
 else:j+=len(`i`);f((i-1,i+1)[i<0],j)

Probieren Sie es online!

Länger als, aber anders als andere Python-Lösungen. Definiert eine rekursive Funktion mit dem Namen egf(10)


3

MATL , 11 Bytes

0hSZ}&:VXzn

Probieren Sie es online!

0h           % Implicitly input n. Append a 0: gives array [n 0]
  S          % Sort
   Z}        % Split array: pushes 0, n or n, 0 according to the previous sorting
     &:      % Binary range: from 0 to n or from n to 0
       V     % Convert to string. Inserts spaces between numbers
        Xz   % Remove spaces
          n  % Length of string. Implicit display

3

Power Shell , 23 Byte

-join(0.."$args")|% Le*

Probieren Sie es online! (wird bei TIO für sehr große (absolute) Eingänge gesperrt)

Verwendet den ..Bereichsoperator, um einen Bereich von 0bis zur Eingabe zu erstellen $args(Umwandlung aus dem Eingabearray als Zeichenfolge). Das ist -joinzusammen in einer Zeichenfolge (zB 01234) und dann wird die LeLänge davon genommen. Das bleibt in der Pipeline und die Ausgabe ist implizit.


Die genaue Lösung hatte ich im Kopf, als ich diese Frage las 😝
Briantist

3

Perl 6 , 18 Bytes

{chars [~] 0...$_}

Versuch es

Erweitert:

{  # bare block lambda with implicit parameter 「$_」

  chars        # how many characters (digits + '-')
    [~]        # reduce using string concatenation operator &infix:<~>
      0 ... $_ # deductive sequence from 0 to the input
}

3

QBIC , 25 Bytes

:[0,a,sgn(a)|A=A+!b$]?_lA

Erläuterung:

:[0,a     Read 'a' from the cmd line, start a FOR loop from 0 to 'a'
,sgn(a)|  with incrementer set to -1 for negative ranges and 1 for positive ones
A=A+!b$   Add a string cast of each iteration (var 'b') to A$
]         NEXT
?_lA      Print the length of A$

3

JavaScript, 50 Bytes

Zusammenarbeit mit @ETHproductions

n=>{for(t="";n;n<0?n++:n--)t+=n;alert(++t.length)}


3

Retina , 28 Bytes

\d+
$*
1
$`1¶
1+
$.&
^-?
0
.

Probieren Sie es online!

Erläuterung

\d+
$*

Wandle die Zahl in eine unäre Zahl um, ohne das Zeichen zu verändern.

1
$`1¶

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.

1+
$.&

Konvertieren Sie jede Folge von Einsen in die entsprechende Dezimalzahl.

^-?
0

Setzen Sie ein 0am Anfang und ersetzen Sie das Extra- wenn es da ist.

.

Zählen Sie die Anzahl der Zeichen (ohne Zeilenvorschub).


3

Emacs, 20 Bytes

C-x ( C-x C-k TAB C-x ) M-{input} C-x e C-x h M-=

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

C-x (

Beginnen Sie mit der Definition eines Tastaturmakros.

C-x C-k TAB

Erstellen Sie einen neuen Makrozähler. Schreibt 0in den Puffer; Der Wert des Zählers ist jetzt 1.

C-x )

Tastaturmakrodefinition beenden.

M-{input} C-x e

Geben Sie nach dem Drücken von META Ihre Eingabenummer ein. Das C-x eführt dann das Makro so oft aus.

C-x h

Setzen Sie die Markierung auf den Anfang des Puffers (der den gesamten so erzeugten Text auswählt).

M-=

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.

Beispielausführung mit Eingabe von 100


Ja, ich bin mir ziemlich sicher, dass ein Tastendruck ein Byte ist.
NoOneIsHere

@NoOneIsHere Ich hatte zwei Gedanken dazu: 1) Kann Strg + Zeichen als einzelnes Byte dargestellt werden? Und 2) Ich sehe hier eine Menge Antworten, die Unicode-Zeichen als ein Byte zählen, aber das sind sie nicht. Ich dachte, vielleicht hat CodeGolf eine eigene Definition von "Byte"? Vielen Dank.
Cheryllium

Ich weiß es wirklich nicht. Sie können aber auch nach Meta fragen .
NoOneIsHere

3

Lua, 52 Bytes

t=0;for i=0,io.read()do t=t+#tostring(i)end;print(t)

Durchläuft eine for-Schleife von der 0-Eingabe, konvertiert die Ganzzahl iin eine Zeichenfolge und fügt die Länge der Zeichenfolge tvor dem Drucken hinzut



2

C #, 77 73 Bytes

-4 Bytes dank @Kevin Cruijssen

Lambda-Funktion:

(r)=>{var l="";for(int i=0,s=r<0?-1:1;i!=r+s;i+=s)l+=i;return l.Length;};

Ungolfed und mit Testfällen:

class P
{
    delegate int numbers(int e);
    static void Main()
    {
        numbers n = (r) =>
        {
            var l = ""; 
            for (int i = 0, s = r < 0 ? -1 : 1; i != r + s; i += s)
                l += i; 
            return l.Length;
        };
        System.Console.WriteLine(n(8));
        System.Console.WriteLine(n(101));
        System.Console.WriteLine(n(102));
        System.Console.WriteLine(n(-10));
        System.Console.ReadKey();
    }
}

Sie können das whileto ändern for, 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 )
Kevin Cruijssen

@ Kevin Cruijssen Sie haben Recht, danke.
Mr Scapegrace

Sie können wahrscheinlich einen int-Zähler verwenden und die Länge innerhalb der Schleife addieren, um einige Bytes zu sparen. Wenn Sie zu einem kompilieren, Func<int, int>können Sie die Funktionen aufrufen r=>..., um 2 Bytes zu sparen (kann dies wahrscheinlich trotzdem tun).
TheLethalCoder

2

JavaScript, 44 Bytes

f=(n,i=1)=>n<0?f(-n)-n:n<i?1:n+1-i+f(n,i*10)
<input type=number oninput=o.textContent=f(+this.value)><pre id=o>


2

REXX, 56 Bytes

arg n
l=0
do i=0 to n by sign(n)
  l=l+length(i)
  end
say l
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.