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 golf golfowy . Najmniejsza liczba bajtów wygrywa!
Narzędzia Bash + OS X (BSD),
2422 bajtyDzięki @seshoumara za zapisanie 2 bajtów.
Test działa w systemie Mac OS X:
Oto wersja GNU:
Bash + coreutils,
4038 bajtówZnów 2 bajty zapisane dzięki @seshoumara.
Wypróbuj online!
źródło
fold -1|wc -l
z liczenia? Jest krótszyPython 2,
83,7864 bajtównajkrótsza wersja:
w tej wersji zapisano 5 bajtów dzięki @numbermaniac:
Wypróbuj online!
ten sam potem wymyśliłem (ta sama ilość bajtów):
Wypróbuj online!
źródło
map
w 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.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)))))
dla 71 bajtówJava 7, 74 bajty (rekurencyjne - w tym drugi parametr domyślny)
Objaśnienie (1):
Java 7,
8179 bajtów (pętla - pojedynczy parametr)Jeśli z jakiegoś powodu posiadanie domyślnego drugiego parametru jak w
0
przypadku tego podejścia rekurencyjnego jest niedozwolone, zamiast tego można użyć pętli for:Wyjaśnienie (2)
Kod testowy:
Wypróbuj tutaj.
Wydajność:
źródło
RProgN 2 , 5 bajtów
Wyjaśnienie
Proste rozwiązanie, działa jak urok.
Wypróbuj online!
źródło
Brachylog , 5 bajtów
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
źródło
Z
; o co chodzi? Czy powinno to być na liście?Z
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.PHP,
5960 bajtówOutgolfed 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)
Uruchom przykład:
php -f 112504.php 8
źródło
join
zamiast,implode
ponieważ jest to alias.[--9]
Haskell ,
3938 bajtówWypróbuj online! Edycja: zapisano 1 bajt dzięki @xnor!
Wyjaśnienie:
W Haskell dla liczb
a
ib
[a..b]
jest to zakres oda
dob
1-przyrostowych lub 1-decrementacyjnych, w zależności od tego, czyb
jest większya
. Tak więc dla pozytywun
pierwsza lista[0..n]++[n..0]
jest,[0,1,2,...,n]
a druga jest pusta. W przypadku wartości ujemnejn
drugi zakres daje,[0,-1,-2,...,n]
a pierwszy jest pusty. Jednak jeślin=0
oba zakresy dają listę[0]
, więc konkatenacja[0,0]
doprowadziłaby do fałszywego wyniku2
. Dlatego0
jest traktowany jako specjalny przypadek.=<<
-Operator na liście, jest taka sama jakconcatMap
, aby każdy numer jest przekształcany przez ciągshow
, a wszystkie te pasy są łączone w jednym pasmem, którelength
w końcu zwrócone.Przed wskazówką xnora użyłem
[0,signum n..n]
zamiast[0..n]++[n..0]
.signum n
jest-1
dla liczb ujemnych,0
dla zerowych i1
dodatnich, a zakres formy[a,b..c]
buduje listę liczb oda
doc
z przyrostemb
. W ten sposób[0,signum n..n]
buduje zakres[0,1,2,...,n]
dla pozytywnychn
i[0,-1,-2,...,n]
negatywnychn
. Ponieważn=0
stworzyłoby to nieskończoną listę,[0,0,0,...]
więc musimy traktować ją również0
jako specjalny przypadek.źródło
[0..n]++[n..0]
powinienem zrobić[0,signum n..n]
.PHP,
4135 bajtówZaoszczę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:
Ta funkcja:
0
do$argv[1]
(aka wejście)Wypróbuj tutaj!
źródło
preg_match()
:(range()
gdyby nie twoje rozwiązanie, myślę, że jesteśmyjoin()
zamiastimplode()
. to pseudonim tego samego. php.net/manual/en/function.join.phpimplode
, ale nie wiedziałem, że mogę pominąć parametr gue. Dzięki !Rubin ,
20 2629 bajtówWypróbuj online!
źródło
R,
2620 bajtówsum(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)
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.źródło
sum(nchar(0:scan()))
zamiast tego możesz zrobić i czytaćn
ze standardowego wejścia.Mathematica,
484746 bajtów-1 bajt dzięki Martin Ender !
Funkcja anonimowa, przyjmując liczbę za argument.
Krótsze rozwiązanie Grega Martina , 39 bajtów
źródło
Sign@#
do#/Abs@#
.1-#~Min~0+Tr@IntegerLength@Range@Abs@#&
. Początkowe1
rachunki dla cyfry 0, zaś-#~Min~0
rachunki dla wszystkich znaków ujemnych, jeśli dane wejściowe są ujemne.Partia, 110 bajtów
Oblicza
sum(min(0,abs(n)+1-10^k),k=0..9)+(n<0?1-n:1)
. (Muszę iść tylko z9
powodu ograniczeń arytmetyki liczb całkowitych Batcha.)źródło
Python 2 , 68 bajtów
Wypróbuj online!
Dłuższy niż, ale różni się od innych rozwiązań Python. Definiuje funkcję rekurencyjną nazywaną np
f(10)
źródło
MATL , 11 bajtów
Wypróbuj online!
źródło
PowerShell , 23 bajty
Wypróbuj online! (spowoduje wyłączenie TIO dla bardzo dużych (absolutnych) danych wejściowych)
Używa
..
operatora zakresu do konstruowania zakresu od0
do danych wejściowych$args
(rzutowanych jako ciąg do konwersji z tablicy wejściowej). Jest on edytowany-join
razem w ciąg (np.01234
), A następnieLe
jest pobierany ngth. Pozostaje to w potoku, a dane wyjściowe są niejawne.źródło
Perl 6 , 18 bajtów
Spróbuj
Rozszerzony:
źródło
QBIC , 25 bajtów
Wyjaśnienie:
źródło
JavaScript, 50 bajtów
Współpracował z @ETHproductions
źródło
Bash + GNU coreutils, 28
Wypróbuj online .
źródło
Siatkówka , 28 bajtów
Wypróbuj online!
Wyjaśnienie
Konwertuj liczbę na unarową, nie zmieniając znaku.
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.Konwertuj każdą sekwencję jedynek na odpowiednią liczbę dziesiętną.
Postaw
0
na początku, zastępując dodatkowy,-
jeśli on tam jest.Policz liczbę znaków (nie nowej linii).
źródło
Emacs, 20 bajtów
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
Rozpocznij definiowanie makra klawiatury.
Utwórz nowy licznik makr. Zapisuje
0
w buforze; wartość licznika wynosi teraz 1.Zakończ definicję makra klawiatury.
Po uderzeniu w META wpisz swój numer wejściowy.
C-x e
Następnie uruchamia makro, które wiele razy.Ustaw znacznik na początek bufora (który zaznacza cały wygenerowany w ten sposób tekst).
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.
źródło
Lua, 52 bajty
Iteruje przez pętlę for od wejścia 0, konwertuje liczbę całkowitą
i
na ciąg i dodaje długość ciągut
przed wydrukowaniemt
źródło
Perl 5 , 32 bajty
31 bajtów kodu +
-p
flaga.Wypróbuj online!
źródło
C #,
7773 bajtów-4 bajty dzięki @Kevin Cruijssen
Funkcja Lambda:
Bez golfa iz przypadkami testowymi:
źródło
while
abyfor
zaoszczę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 )Func<int, int>
, możesz wywołać funkcje takie jakr=>...
zapisanie 2 bajtów (prawdopodobnie i tak można to zrobić).JavaScript, 44 bajty
źródło
REXX, 56 bajtów
źródło