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!

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


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. */


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!


@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


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!


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

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!


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


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


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.


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!


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

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.


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@#&

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


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)


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

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.


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
}

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$

3

JavaScript, 50 bajtów

Współpracował z @ETHproductions

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


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


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


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



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

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>


2

REXX, 56 bajtów

arg n
l=0
do i=0 to n by sign(n)
  l=l+length(i)
  end
say l
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.