Ile muszę napisać?

35

Pisanie liczb należy do Hello Worldów programowania, często liczby 1-10.

Chcę wypisać wiele liczb! Wiele, wiele liczb. Ale ile liczb muszę napisać?

Zadanie

Biorąc pod uwagę liczbę całkowitą, podaj liczbę jako wynik, która dałaby mi liczbę cyfr, które byłyby w ciągu zawierającym wszystkie liczby całkowite z zakresu od 0 do wartości wejściowej włącznie. Identyfikator negacji („-”) liczy się jako pojedynczy znak.

Przykład I / O

Wejście: 8
Wypisane: 0,1,2,3,4,5,6,7,8
Wyjście: 9

Wejście: 101
wypisane: 0,1,2,3 ...., 99 100,101
Wyjście: 196

Wejście: 102
wypisane: 0,1,2,3 ...., 100,101,102
wyjście: 199

Wejście -10
Zapisane: 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10
Wyjście: 22

To jest . Najmniejsza liczba bajtów wygrywa!

tuskiomi
źródło

Odpowiedzi:

23

05AB1E , 3 bajty

Kod:

ÝJg

Wykorzystuje kodowanie CP-1252 . Wypróbuj online!

Wyjaśnienie:

Ý     # Range [0 .. input]
 J    # Join into one string
  g   # Get the length of the string
Adnan
źródło
13

Python 2 , 55 46 bajtów

lambda n:len(`range(abs(n)+1)`)+2*~n+3*n*(n<0)

Wypróbuj online!

Zdrowieć.

Jonathan Allan
źródło
11

Röda , 23 bajty

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

Wypróbuj online!

Wyjaśnił:

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
źródło
10

Python 2 , 41 bajtów

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

Wypróbuj online!

Dennis
źródło
+1: Naprawdę nie można pokonać tego inteligentnie wykonanego rekurencyjnego rozwiązania za pomocą Pythona
micsthepick
7

Narzędzia Bash + OS X (BSD), 24 22 bajty

Dzięki @seshoumara za zapisanie 2 bajtów.

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

Test działa w systemie 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

Oto wersja GNU:

Bash + coreutils, 40 38 bajtów

Znów 2 bajty zapisane dzięki @seshoumara.

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

Wypróbuj online!

Mitchell Spector
źródło
@tuskiomi Napisałem coreutils, gdy miałem na myśli narzędzia BSD - przetestowałem je w Mac OS X, gdzie działa również na negatywne dane wejściowe (seq nie jest taki sam jak GNU seq).
Mitchell Spector
@DigitalTrauma Ładne rozwiązanie GNU. Śmiało i opublikuj to sam, jeśli chcesz; Myślę, że jest zbyt różny, aby liczyć się z moim wariantem.
Mitchell Spector
Ok, oto jesteś :)
Cyfrowa trauma
A może skorzystasz fold -1|wc -lz liczenia? Jest krótszy
seshoumara,
6

Python 2, 83 , 78 64 bajtów

najkrótsza wersja:

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

w tej wersji zapisano 5 bajtów dzięki @numbermaniac:

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

Wypróbuj online!

ten sam potem wymyśliłem (ta sama ilość bajtów):

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

Wypróbuj online!

Micsthepick
źródło
Można użyć mapw drugiej linii do 78 bajtów: print len(''.join(map(str,(range(x+1)if x>0 else range(0,x-1,-1))))). Państwo może zaoszczędzić jeszcze więcej przez co lambda.
numbermaniac
1
@numbermaniac czy mogę zrobić coś podobnego w ten sposób?
micsthepick,
1
@numbermaniac tutaj jest odpowiednikiem: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)))))dla 71 bajtów
Felipe Nardi Batista
6

Java 7, 74 bajty (rekurencyjne - w tym drugi parametr domyślny)

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

Objaśnienie (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 bajtów (pętla - pojedynczy parametr)

Jeśli z jakiegoś powodu posiadanie domyślnego drugiego parametru jak w 0przypadku tego podejścia rekurencyjnego jest niedozwolone, zamiast tego można użyć pętli for:

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

Wyjaśnienie (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

Kod testowy:

Wypróbuj tutaj.

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));
  }
}

Wydajność:

9   9
196 196
199 199
22  22
Kevin Cruijssen
źródło
1
Podoba mi się to rozwiązanie :)
tuskiomi
4

RProgN 2 , 5 bajtów

n0R.L

Wyjaśnienie

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

Proste rozwiązanie, działa jak urok.

Wypróbuj online!

ATaco
źródło
4

Brachylog , 5 bajtów

⟦ṡᵐcl

Wypróbuj online!

Buduje zakres [0, wejście], konwertuje każdą liczbę na ciąg, łączy w pojedynczy ciąg i zwraca długość wyniku

Lew
źródło
Zauważyłem, że TIO ma argument Z; o co chodzi? Czy powinno to być na liście?
steenbergh
3
@steenbergh: Zgłoszenie Leo jest funkcją, a nie pełnym programem. Podając argumentZ interpreterowi Brachylog każe mu dodać odpowiednie opakowanie, aby umożliwić testowanie funkcji. (Jeśli uruchomiłeś go jako pełny program, nie wygenerowałby żadnych danych wyjściowych.) Zezwalamy tutaj na przesyłanie programów lub funkcji, więc nie powinno się to wliczać do liczby bajtów, ponieważ tak naprawdę nie jest to część przesyłania.
4

PHP, 59 60 bajtów

Outgolfed by Roberto06 - https://codegolf.stackexchange.com/a/112536/38505

Dzięki roberto06 za zauważenie, że poprzednia wersja nie działała dla liczb ujemnych.

Po prostu buduje tablicę liczb, umieszcza ją w ciągu, a następnie liczy cyfry (i znak minus)

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

Uruchom przykład: php -f 112504.php 8

ʰᵈˑ
źródło
To nie działa na negatywne dane wejściowe, patrz tutaj
roberto06
Możesz zapisać 3 bajty, używając joinzamiast, implodeponieważ jest to alias.
Mario,
nie ma potrzeby ucieczki od bajtu minus -1. Z drugiej strony możesz zmienić wyrażenie regularne na[--9]
Jörg Hülsermann
4

Haskell , 39 38 bajtów

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

Wypróbuj online! Edycja: zapisano 1 bajt dzięki @xnor!

Wyjaśnienie:

W Haskell dla liczb ai b [a..b]jest to zakres od ado b1-przyrostowych lub 1-decrementacyjnych, w zależności od tego, czy bjest większy a. Tak więc dla pozytywu npierwsza lista [0..n]++[n..0]jest, [0,1,2,...,n]a druga jest pusta. W przypadku wartości ujemnej ndrugi zakres daje, [0,-1,-2,...,n]a pierwszy jest pusty. Jednak jeśli n=0oba zakresy dają listę [0], więc konkatenacja [0,0]doprowadziłaby do fałszywego wyniku 2. Dlatego0 jest traktowany jako specjalny przypadek.

=<<-Operator na liście, jest taka sama jak concatMap, aby każdy numer jest przekształcany przez ciąg show, a wszystkie te pasy są łączone w jednym pasmem, które lengthw końcu zwrócone.


Przed wskazówką xnora użyłem [0,signum n..n]zamiast [0..n]++[n..0]. signum njest -1dla liczb ujemnych, 0dla zerowych i 1dodatnich, a zakres formy [a,b..c]buduje listę liczb od ado cz przyrostem b. W ten sposób [0,signum n..n]buduje zakres [0,1,2,...,n]dla pozytywnych ni [0,-1,-2,...,n]negatywnych n. Ponieważ n=0stworzyłoby to nieskończoną listę, [0,0,0,...]więc musimy traktować ją również 0jako specjalny przypadek.

Laikoni
źródło
Myślę, że [0..n]++[n..0]powinienem zrobić [0,signum n..n].
xnor
4

PHP, 41 35 bajtów

Zaoszczędzono 6 bajtów dzięki user59178

Ponieważ odpowiedź ʰᵈ była błędna w przypadku negatywnego wkładu, wziąłem na siebie zadanie zbudowania nowego rozwiązania:

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

Ta funkcja:

  • Buduje tablicę od 0do $argv[1](aka wejście)
  • Imploduje go pustym znakiem (tzn. Przekształca go w ciąg znaków)
  • Podkreśla długość łańcucha

Wypróbuj tutaj!

roberto06
źródło
To jest lepsze rozwiązanie dla mojego, idk, dlaczego myślałem, że muszę to zrobić preg_match():(
ʰᵈˑ
Cóż, nie pomyślałbym, range()gdyby nie twoje rozwiązanie, myślę, że jesteśmy
równi
1
możesz zapisać 3 bajty, używając join()zamiast implode(). to pseudonim tego samego. php.net/manual/en/function.join.php
user59178
1
I jeszcze 3, pomijając parametr „klej”.
user59178,
Wiedziałem, że istnieje alias implode, ale nie wiedziałem, że mogę pominąć parametr gue. Dzięki !
roberto06
4

Rubin , 20 26 29 bajtów

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

Wypróbuj online!

GB
źródło
Dlaczego wzrost?
Brian Minton
Pierwsza wersja nie działała dla liczb ujemnych, druga wersja miała problem z zerowym jako wejściem.
GB
4

R, 26 20 bajtów

sum(nchar(0:scan()))

Bardzo podstawowe podejście:

  • Zrób wektor 0: x

  • Policz znaki w każdej wartości (zostaną automatycznie przymocowane do łańcucha)

  • Suma

Nie jesteś pewien, czy istnieją jakieś sztuczki, aby ograniczyć definicję funkcji? 6 bajtów zaoszczędzonych dzięki Giuseppe, pobierając dane wejściowe ze standardowego wejścia.

użytkownik2390246
źródło
sum(nchar(0:scan()))zamiast tego możesz zrobić i czytać nze standardowego wejścia.
Giuseppe
4

Mathematica, 48 47 46 bajtów

-1 bajt dzięki Martin Ender !

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

Funkcja anonimowa, przyjmując liczbę za argument.

Krótsze rozwiązanie Grega Martina , 39 bajtów

1-#~Min~0+Tr@IntegerLength@Range@Abs@#&
NumberManiac
źródło
1
Możesz użyć Sign@#do #/Abs@#.
Martin Ender,
1
Można zaoszczędzić kilka bajtów z nieco innego podejścia: 1-#~Min~0+Tr@IntegerLength@Range@Abs@#&. Początkowe 1rachunki dla cyfry 0, zaś -#~Min~0rachunki dla wszystkich znaków ujemnych, jeśli dane wejściowe są ujemne.
Greg Martin
3

Partia, 110 bajtów

@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%

Oblicza sum(min(0,abs(n)+1-10^k),k=0..9)+(n<0?1-n:1). (Muszę iść tylko z 9powodu ograniczeń arytmetyki liczb całkowitych Batcha.)

Neil
źródło
3

Python 2 , 68 bajtów

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

Wypróbuj online!

Dłuższy niż, ale różni się od innych rozwiązań Python. Definiuje funkcję rekurencyjną nazywaną npf(10)

ElPedro
źródło
3

MATL , 11 bajtów

0hSZ}&:VXzn

Wypróbuj 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
źródło
3

PowerShell , 23 bajty

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

Wypróbuj online! (spowoduje wyłączenie TIO dla bardzo dużych (absolutnych) danych wejściowych)

Używa ..operatora zakresu do konstruowania zakresu od 0do danych wejściowych $args(rzutowanych jako ciąg do konwersji z tablicy wejściowej). Jest on edytowany -joinrazem w ciąg (np. 01234), A następnie Lejest pobierany ngth. Pozostaje to w potoku, a dane wyjściowe są niejawne.

AdmBorkBork
źródło
Dokładne rozwiązanie miałem w głowie, gdy przeczytałem to pytanie question
briantist
3

Perl 6 , 18 bajtów

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

Spróbuj

Rozszerzony:

{  # 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
źródło
3

QBIC , 25 bajtów

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

Wyjaśnienie:

:[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
źródło
3

JavaScript, 50 bajtów

Współpracował z @ETHproductions

n=>{for(t="";n;n<0?n++:n--)t+=n;alert(++t.length)}
Oliver
źródło
3

Siatkówka , 28 bajtów

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

Wypróbuj online!

Wyjaśnienie

\d+
$*

Konwertuj liczbę na unarową, nie zmieniając znaku.

1
$`1¶

Każda 1 jest zastępowana przez wszystko do siebie plus nowy wiersz. Dzięki temu otrzymujemy zakres od 1 do n, jeśli n było dodatnie, od -1 do n z dodatkowym -na początku, jeśli było ujemne. Wszystkie liczby są jednoznaczne i oddzielone znakami nowej linii.

1+
$.&

Konwertuj każdą sekwencję jedynek na odpowiednią liczbę dziesiętną.

^-?
0

Postaw 0na początku, zastępując dodatkowy, -jeśli on tam jest.

.

Policz liczbę znaków (nie nowej linii).

Lew
źródło
3

Emacs, 20 bajtów

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

Samo polecenie to 20 naciśnięć klawiszy, ale potrzebuję wyjaśnienia, jak należy je liczyć jako bajty. Uznałem, że liczenie każdego naciśnięcia klawisza jako 1 bajtu byłoby najbardziej sprawiedliwe. Powyższe polecenie zostało napisane konwencjonalnie, aby ułatwić czytanie.

Wyjaśnienie

C-x (

Rozpocznij definiowanie makra klawiatury.

C-x C-k TAB

Utwórz nowy licznik makr. Zapisuje 0w buforze; wartość licznika wynosi teraz 1.

C-x )

Zakończ definicję makra klawiatury.

M-{input} C-x e

Po uderzeniu w META wpisz swój numer wejściowy. C-x eNastępnie uruchamia makro, które wiele razy.

C-x h

Ustaw znacznik na początek bufora (który zaznacza cały wygenerowany w ten sposób tekst).

M-=

Uruchom liczbę znaków w wybranym regionie. Liczba znaków zostanie wydrukowana w minibuforze.

Przykład

Przepraszamy za okropny kolor podświetlenia. Jest to przykład użycia tego polecenia z wejściem 100. Wyjście znajduje się w minibuforze na dole ekranu.

Przykładowe wykonanie z wejściem 100

cherylium
źródło
Tak, jestem prawie pewien, że jedno naciśnięcie klawisza to jeden bajt.
NoOneIsHere
@NoOneIsHere Istnieją dwie przemyślenia na ten temat: 1) Czy znak Ctrl + może być reprezentowany jako pojedynczy bajt? I 2) Widzę tutaj wiele odpowiedzi liczących znaki Unicode jako jeden bajt, ale nie są, więc pomyślałem, że może CodeGolf ma własną definicję „bajtu”? Dzięki.
cheryllium
Naprawdę nie wiem. Ale możesz zapytać na Meta .
NoOneIsHere
3

Lua, 52 bajty

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

Iteruje przez pętlę for od wejścia 0, konwertuje liczbę całkowitą ina ciąg i dodaje długość ciągu tprzed wydrukowaniemt

Josh
źródło
2

C #, 77 73 bajtów

-4 bajty dzięki @Kevin Cruijssen

Funkcja Lambda:

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

Bez golfa iz przypadkami testowymi:

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();
    }
}
Pan Scapegrace
źródło
Możesz zmienić na, whileaby forzaoszczędzić kilka bajtów: (r)=>{var l="";for(int i=0,s=r<0?-1:1;i!=r+s;i+=s)l+=i;return l.Length;};( 73 bajty )
Kevin Cruijssen,
@Kevin Cruijssen Masz rację, dzięki.
Pan Scapegrace
Prawdopodobnie możesz użyć licznika int i dodać długość wewnątrz pętli, aby zapisać niektóre bajty. Jeśli kompilujesz do a Func<int, int>, możesz wywołać funkcje takie jak r=>...zapisanie 2 bajtów (prawdopodobnie i tak można to zrobić).
TheLethalCoder,
2

JavaScript, 44 bajty

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
źródło
2

REXX, 56 bajtów

arg n
l=0
do i=0 to n by sign(n)
  l=l+length(i)
  end
say l
idrougge
źródło