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!

tuskiomi
quelle

Antworten:

23

05AB1E , 3 Bytes

Code:

ÝJg

Verwendet die CP-1252- Codierung. Probieren Sie es online!

Erläuterung:

Ý     # Range [0 .. input]
 J    # Join into one string
  g   # Get the length of the string
Adnan
quelle
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. */
fergusq
quelle
10

Python 2 , 41 Bytes

f=lambda n:len(`n`)+(n and f(n+cmp(0,n)))

Probieren Sie es online!

Dennis
quelle
+1: Diese intelligent gemachte rekursive Lösung ist mit Python
micsthepick am
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!

Mitchell Spector
quelle
@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
Ok, hier sind Sie :)
Digital Trauma
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!

micsthepick
quelle
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
Kevin Cruijssen
quelle
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!

Ein Taco
quelle
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

Löwe
quelle
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

ʰᵈˑ
quelle
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.

Laikoni
quelle
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!

roberto06
quelle
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

Ruby , 20 26 29 Bytes

->x{[*x..-1,0,*1..x]*''=~/$/}

Probieren Sie es online!

GB
quelle
Warum die Zunahme?
Brian Minton
Die erste Version funktionierte nicht für negative Zahlen, die zweite Version hatte ein Problem mit Null als Eingabe.
GB
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.

user2390246
quelle
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@#&
numbermaniac
quelle
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 .)

Neil
quelle
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)

ElPedro
quelle
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
Luis Mendo
quelle
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.

AdmBorkBork
quelle
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
}
Brad Gilbert b2gills
quelle
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$
steenbergh
quelle
3

JavaScript, 50 Bytes

Zusammenarbeit mit @ETHproductions

n=>{for(t="";n;n<0?n++:n--)t+=n;alert(++t.length)}
Oliver
quelle
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).

Löwe
quelle
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

Cheryllium
quelle
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

Josh
quelle
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();
    }
}
Herr Scapegrace
quelle
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>

Neil
quelle
2

REXX, 56 Bytes

arg n
l=0
do i=0 to n by sign(n)
  l=l+length(i)
  end
say l
idrougge
quelle