Jak długi jest mój numer?

26

Wyzwanie

Podając liczbę całkowitą, Qw zakresie -(2^100) ≤ Q ≤ 2^100, wypisz liczbę cyfr w tej liczbie (w podstawie 10).

Zasady

Tak, możesz wziąć liczbę jako ciąg znaków i znaleźć jej długość.

Wszystkie funkcje matematyczne są dozwolone.

Możesz przyjmować dane wejściowe w dowolnej bazie, ale dane wyjściowe muszą mieć długość liczby w bazie 10.

Nie licz znaku minus dla liczb ujemnych. Liczba nigdy nie będzie miała miejsca po przecinku.

Zero może mieć jedną lub zero cyfr.

Załóżmy, że wejście zawsze będzie prawidłową liczbą całkowitą.

Przykłady

Input > Output

-45 > 2
12548026 > 8
33107638153846291829 > 20
-20000 > 5
0 > 1 or 0

Zwycięski

Najkrótszy kod w bajtach wygrywa.

Rozpad beta
źródło

Odpowiedzi:

10

Brachylog , 1 bajt

l

Wypróbuj online!

Inne wbudowane rozwiązanie, ale to ma najkrótszą nazwę (chyba że ktoś znajdzie język, który wykonuje to zadanie w zerowych bajtach). Powinno to działać zarówno w Brachylog 1, jak i Brachylog 2.

Jest to przesłanie funkcji (link TIO zawiera argument wiersza polecenia, który powoduje, że interpreter uruchamia pojedynczą funkcję, a nie cały program), częściowo dlatego, że w przeciwnym razie musielibyśmy wydawać bajty na wyjściu, częściowo dlatego, że składnia Brachylog dla wartości ujemnych liczby są nieco nietypowe, dlatego włączenie tego programu rozwiązuje wszelkie potencjalne argumenty dotyczące składni danych wejściowych.

Często niepokoi mnie to, że większość wbudowanych w Brachylog wartości traktuje liczby ujemne jak liczby dodatnie, ale ten fakt przydał się tutaj. Sądzę, że w każdym języku golfowym występują kompromisy.


źródło
Tu przestaję przewijać ... to oburzające!
Bogdan Alexandru
39

Taxi , 1118 bajtów

1 is waiting at Starchild Numerology.Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Chop Suey.Go to Chop Suey:n 1 r 1 l 4 r 1 l.Pickup a passenger going to Crime Lab.'-' is waiting at Writer's Depot.Go to Writer's Depot:n 1 l 3 l.Pickup a passenger going to Crime Lab.Go to Crime Lab:n 1 r 2 r 2 l.Switch to plan "n" if no one is waiting.-1 is waiting at Starchild Numerology.[n]0 is waiting at Starchild Numerology.Go to Starchild Numerology:s 1 r 1 l 1 l 2 l.Pickup a passenger going to Cyclone.Pickup a passenger going to Addition Alley.Go to Cyclone:e 1 l 2 r.[r]Pickup a passenger going to Cyclone.Pickup a passenger going to Addition Alley.Go to Zoom Zoom:n.Go to Addition Alley:w 1 l 1 r.Pickup a passenger going to Addition Alley.Go to Chop Suey:n 1 r 2 r.Switch to plan "f" if no one is waiting.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:n 1 l 3 l 1 l.Go to Cyclone:n 1 l.Switch to plan "r".[f]Go to Addition Alley:n 1 l 2 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:n 1 r 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

Wypróbuj online!

Nie golfowany:

1 is waiting at Starchild Numerology.
Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to Chop Suey.
Go to Chop Suey: north 1st right 1st left 4th right 1st left.
Pickup a passenger going to Crime Lab.
'-' is waiting at Writer's Depot.
Go to Writer's Depot: north 1st left 3rd left.
Pickup a passenger going to Crime Lab.
Go to Crime Lab: north 1st right 2nd right 2nd left.
Switch to plan "n" if no one is waiting.
-1 is waiting at Starchild Numerology.
[n]
0 is waiting at Starchild Numerology.
Go to Starchild Numerology: south 1st right 1st left 1st left 2nd left.
Pickup a passenger going to Cyclone.
Pickup a passenger going to Addition Alley.
Go to Cyclone: east 1st left 2nd right.
[r]
Pickup a passenger going to Cyclone.
Pickup a passenger going to Addition Alley.
Go to Zoom Zoom: north.
Go to Addition Alley: west 1st left 1st right.
Pickup a passenger going to Addition Alley.
Go to Chop Suey: north 1st right 2nd right.
Switch to plan "f" if no one is waiting.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park: north 1st left 3rd left 1st left.
Go to Cyclone: north 1st left.
Switch to plan "r".
[f]
Go to Addition Alley: north 1st left 2nd left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: north 1st right 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st left 1st right.

Wyjaśnienie:

Pickup the input and split it into individual characters
Pickup the value 1.
If the first character a hyphen, add -1. Otherwise, add 0.
Keep picking up characters and adding 1 until you're out.
Convert the running total to a string and print to stdout.
Inżynier Toast
źródło
8
Przez długi czas czułem się w tej wymianie, ale nigdy czegoś takiego nie widziałem
Cup of Java
7
Czy zabraknie gazu, jeśli liczba będzie wystarczająco długa?
Robert Fraser
5
To większe pieprzenie mózgów niż pieprzenie mózgów.
Omega
1
@RobertFraser Właśnie dlatego zatrzymujemy się Zoom Zoomw każdej pętli plan "r". Właśnie przetestowałem go do 100 000 cyfr i nigdy nie zabrakło mu gazu. Nie obliczyłem tego, ale przypuszczam, że kosztuje więcej niż wystarczającą opłatę, aby zapłacić za używany gaz, więc napełnia zbiornik w każdej pętli.
Inżynier Toast
1
@CupofJava OH MY GOSH, jak zapomniałem o Szekspirze .
Engineer Toast
18

Mathematica, 13 bajtów

IntegerLength

Jest wbudowany ... zwroty 0dla 0.

Martin Ender
źródło
2
Mathematica zwycięża: D
rozpad bety
1
nie ma w golfa kodu to nie :)
Greg Martin
8
There's a built-in: Kiedy nie ma?
TheLethalCoder
14

dc, 3

?Zp

Zauważ, że zwykle dcwymaga podania liczb ujemnych _zamiast zamiast zwykłych -. Jednak w tym przypadku można użyć dowolnego z nich. Jeśli -podano, dctraktuje to jako odejmowanie pustego stosu, rzuca dc: stack empty, a następnie kontynuuje z resztą liczby; Zatem wynik nie jest inny.

Wypróbuj online .

?    # input
 Z   # measure length
  p  # print
Cyfrowa trauma
źródło
Czy nie może to być po prostu Zprzesłanie funkcji? dcjest językiem konkatenatywnym z operatorami quote + dup + eval, dlatego może ponownie wykorzystywać dowolne ciągi kodu.
12

Siatkówka , 2 bajty

\d

Wypróbuj online!

Siatkówka tak naprawdę nie wie, jakie są liczby, więc dane wejściowe są traktowane jako ciąg znaków i po prostu liczymy cyfry.

Martin Ender
źródło
5

05AB1E , 2 bajty

Äg

Wypróbuj online! lub Wypróbuj wszystkie testy!

Ä  # Absolute value
 g # Length
Riley
źródło
Äco? Nie þ? Słusznie.
Magic Octopus Urn
@ carusocomputing Myślałem o Äpierwszym, ale þporadziłbym sobie z kropką dziesiętną, więc chyba trochę lepiej.
Riley
Po prostu fajnie, jak 2 osoby wymyśliły 2 różne 2-bajtowe rozwiązania w odległości 2 minut od siebie, nie sądzę jednak, że istnieje trzeci; próbuję myśleć o jednym.
Magic Octopus Urn
5

Alice , 16 bajtów

//; 'q<)e
o!@i -

Wypróbuj online!

Wyjaśnienie

Znalezienie na wpół przyzwoitego układu było dość trudne. Nadal nie jestem z tego powodu bardzo zadowolony z powodu przestrzeni, <i ;, ale to najlepsze, co mogłem na razie zrobić.

Długość łańcucha jest jednym z tych bardzo powszechnych wbudowanych, które nie istnieją w Alice, ponieważ jego wejście jest ciągiem, a wyjściem jest liczbą całkowitą (a wszystkie polecenia Alice są ściśle liczbami całkowitymi lub ciągami znaków). Możemy zmierzyć długość łańcucha zapisując go na taśmie w trybie porządkowym, a następnie znajdując jego koniec w trybie kardynalnym.

/      Reflect to SE. Switch to Ordinal. While in Ordinal mode, the IP will bounce
       diagonally up and down through the code.
!      Store an implicit empty string on the tape, does nothing.
;      Discard an implicit empty string, does nothing.
i      Read all input as a string.
'-     Push "-".
<      Set the horizontal component of the IP's direction to west, so we're bouncing
       back now.
-      Remove substring. This deletes the minus sign if it exists.
'i     Push "i".
;      Discard it again.
!      Store the input, minus a potential minus sign, on the tape.
/      Reflect to W. Switch to Cardinal. The IP immediately wraps to the
       last column.
e)     Search the tape to the right for a -1, which will be found at the end
       of the string we stored there.
<      Does nothing.
q      Push the tape head's position, which is equal to the string length.
'<sp>  Push " ".
;      Discard it again.
/      Reflect to NW. Switch to Ordinal. The IP immediately bounces off
       the top boundary to move SW instead.
o      Implicitly convert the string length to a string and print it.
       IP bounces off the bottom left corner, moves back NE.
/      Reflect to S. Switch to Cardinal.
!      Store an implicit 0 on the tape, irrelevant.
       The IP wraps back to the first line.
/      Reflect to NE. Switch to Ordinal. The IP immediately bounces off
       the top boundary to move SE instead.
@      Terminate the program.

Próbowałem również dbać o znak minus w trybie kardynalnym z H(wartością bezwzględną), ale dodatkowy przełącznik trybu zawsze był droższy w moich próbach.

Martin Ender
źródło
4

PHP, 23 bajty

<?=-~log10(abs($argn));

Wypróbuj online!

log podstawy 10 wartości bezwzględnej plus jeden rzut na int

dla zera jako wejście log10 zwraca, INFco jest interpretowane jako fałsz

Lepszym sposobem jest zastąpienie $argngo $argn?:1+3 bajtami

PHP, 27 bajtów

<?=strlen($argn)-($argn<0);

długość łańcucha minus wartość logiczna jest mniejsza niż zero

+2 bajty do porównania ciągów $argn<"0"

Wypróbuj online!

PHP, 32 bajty

<?=preg_match_all("#\d#",$argn);

Wypróbuj online!

Regex zlicza wszystkie cyfry

35 bajtów

<?=strlen($argn)-strspn($argn,"-");

Wypróbuj online!

długość łańcucha minus liczba -

strspn

Jörg Hülsermann
źródło
1
Pierwszy nie działa, na przykład 10, ponieważ ^ma niższy priorytet. Możesz to naprawić za pomocą -~.
user63956
Dlaczego nie po prostu <?=strlen(abs($argn));?
roberto06
@ user63956 Wersja z log10 nie może działać w przypadku wejścia zero, więc ją usuwam.
Jörg Hülsermann
1
@ JörgHülsermann Dlaczego nie tylko $argn?:1? Będzie to 26 bajtów z log10()i abs().
user63956
1
@ JörgHülsermann -~$xjest równoważny ((int)$x)+1. <?=-~log10(abs($argn?:1));wydaje się działać.
user63956
4

Fortran 95 (gfortran), 121 96 95 bajtów

program c
character b
call get_command_argument(1,b,length=i)
print*,i-index(b,'-')
end program

Objaśnienie:
Odejmuje indeks długości znaku „-” od długości argumentu.
Tablice zaczynają się od 1 w Fortran, a indeks () zwraca 0, jeśli symbol nie zostanie znaleziony.

Edycja: Przełączono na domyślną liczbę całkowitą „i”, również skonsolidowany moduł pobierania argumentów.

Edycja: -1 bajt dzięki @Tsathoggua

waffleston
źródło
1
Witamy w PPCG!
Martin Ender
3

PowerShell, 24 bajty

"$args"-replace'-'|% Le*

rzutuje „ciągłą” wartość argumentów wejściowych na ciąg znaków i otrzymuje jej właściwość „length”.

1 bajt krótszy niż "".Length

dopóki ktoś nie znajdzie lepszego sposobu na uzyskanie abs liczby w PS, jest to prawdopodobnie tak krótkie, jak to możliwe.

colsw
źródło
Jak o "$args".trim('-')|% Le*? :)
cokolwiek
3

05AB1E , 2 bajty

þg

Wypróbuj online!

   # Implicit input [a]...
þ  # Only the digits in [a]...
 g # length of [a]...
   # Implicit output.
Urna Magicznej Ośmiornicy
źródło
3

pieprzenie mózgu , 37 bajtów

-[+>+[+<]>+]>->,[-<->]<[>+>],[<+>,]<.

Dane wyjściowe są wartością bajtową.

Wypróbuj online!

Wyjaśnienie

-[+>+[+<]>+]>->  Constant for 45 (from esolangs wiki)
,                Read a byte of input
[-<->]           Subtract that byte from 45
<[>+>]           If the result is nonzero then increment a cell and move to the right
                 (0 means it was a minus; so not counted)
,[<+>,]          Read a byte and increment the cell to its left until EOF is reached
<.               Print the cell that was being incremented
Business Cat
źródło
Czy można dodać stopkę do łącza TIO, które wyświetla wynik jako liczbę?
Beta Decay
@BetaDecay Dodano
Business Cat
To wspaniale, dzięki: D
Beta Decay
3

Rubin, 15 11 + 1 = 16 12 bajtów

Używa -nflagi.

p~/$/-~/\d/

Wypróbuj online!

Wyjaśnienie

                  # -n flag gets one line of input implicitly
p                 # Print
 ~/$/             # Position of end of line (aka string length) in input
     -            # minus
      ~/\d/       # Position of first digit (1 if negative number, 0 otherwise)
Wartość tuszu
źródło
1
Co to za magia?
Chowlett
2
@Chowlett dodał wyjaśnienie.
Wartość tuszu
2

Galaretka , 2 bajty

DL

Wypróbuj online!

Robi to dosłownie o co pytano:

DL - Main link number n         e.g. -45
D  - convert to a decimal list       [-4,-5]
 L - get the length                  2
Jonathan Allan
źródło
To ciekawe wbudowane tam, czy Ddziała na dziesiętne? Czy -1.2wyjdzie [-1,-0.2]? Próbowałem sam, nie robi.
Magic Octopus Urn
1
Nie dość, konwersja baza tylko idzie w dół do jednostek tak, na przykład, 654.321Dprzyniesie [6,5,4.321](no faktycznie [6.0,5.0,4.321000000000026])
Jonathan Allan
[-6.0, -5.0, -4.321000000000026]tak naprawdę najwyraźniej.
Magic Octopus Urn
Ach - tak, właśnie edytowane - arytmetyka zmiennoprzecinkowa.
Jonathan Allan
2

CJam , 5 bajtów

q'--,

Na podstawie ciągu.

Wypróbuj online!

9 bajtów dla rozwiązania opartego wyłącznie na matematyce:

riz)AmLm]

Lub kolejne 5 z konwersją podstawową:

riAb,
Business Cat
źródło
Lub też 5: rizs,.
Martin Ender
2

Japt , 5 bajtów

a s l

Wypróbuj online!

Wyjaśnienie

 a s l
Ua s l
Ua     # take the absolute value of the input
   s   # and turn it into a string
     l # and return its length
Luke
źródło
2

JavaScript (ES6), 27 26 25 24 bajtów

Pobiera dane wejściowe jako ciąg.

s=>s.match(/\d/g).length
  • Zaoszczędź dwa bajty dzięki Arnauldowi.
Kudłaty
źródło
Twój tytuł mówi 23 bajtów, ale kod jest 24 ... Jednak jest to 23 bajtów: s=>`${s>0?s:-s}`.length!
Dom Hastings
Dzięki, @DomHastings. Powinieneś opublikować swoje jako osobną odpowiedź, ponieważ jest to inne podejście do mojego.
Shaggy
2

JavaScript (ES6), 23 bajty

s=>`${s>0?s:-s}`.length

Inne podejście do odpowiedzi Kudłaty .

Dom Hastings
źródło
3
s=>s.length-(s<0)oszczędza 6 bajtów
Johan Karlsson
2

Java, 30 24 bajtów

i->(""+i.abs()).length()

Zakłada, że ijest BigInteger. Ponadto typ jest kontekstualizowany, więc import nie jest wymagany, jak pokazano w kodzie testowym.

Test

// No imports
class Pcg120897 {
  public static void main(String[] args) {
    java.util.function.ToIntFunction<java.math.BigInteger> f =
        // No full class declaration past here
        i->(""+i.abs()).length()
        // No full class declaration before here
      ;
    System.out.println(f.applyAsInt(new java.math.BigInteger("-1267650600228229401496703205376"))); // -(2^100)
    System.out.println(f.applyAsInt(new java.math.BigInteger("1267650600228229401496703205376"))); // (2^100)
  }
}

Oszczędza

  • 30 -> 24 bajty: dzięki @cliffroot
Olivier Grégoire
źródło
+""zamiast .toString()?
Cliffroot
2
+1 za dostarczenie przykładowego kodu pokazującego, w jaki sposób jest on wywoływany, oraz za wyjaśnienie rodzaju iodpowiedzi. Myślę, że powinno to zrobić więcej odpowiedzi lambda.
Poke
1

Python 2 , 31 22 bajtów

-9 bajtów dzięki Rod.

lambda i:len(`abs(i)`)

Wypróbuj online!

całkowicie ludzki
źródło
1
len(`abs(s)`)z wprowadzoną liczbą jest krótsza
Rod
2
Szkoda, że ​​Python nie ma składu funkcji. To byłoby sprawiedliwe len∘repr∘abs.
Roberto Bonvallet
1

Brain-Flak , 63 bajty

([({})]((((()()()()())){}{})){}{})((){[()](<{}>)}{})([{}][]<>)

Wypróbuj online!

Jest to 62 bajty kodu i +1 bajt dla -aflagi.

Próbowałem dwóch innych podejść, ale niestety oba były dłuższe:

([]<({}[((((()()()()())){}{})){}{}]<>)((){[()](<{}>)}{})>)({}[{}])

([]<>)<>({}<>)((((([][]())){}{})){}{}[{}])((){[()](<{}>)}{})([{}]{})

To powinna być bardzo krótka odpowiedź. W rzeczywistości, gdybyśmy nie musieli obsługiwać liczb ujemnych, moglibyśmy po prostu:

([]<>)

Ale najpierw musimy porównać pierwsze wejście z 45 (ASCII -), co stanowi większość bajtów tej odpowiedzi.

Rozwiązanie arytmetyczne może być krótsze.

DJMcMayhem
źródło
Liczę 62 bajty ..?
całkowicieludzki
1
@ totalniehuman zobaczyć moją edycję.
DJMcMayhem
49 bajtów:([{}]((((()()()()())){}{})){}{})({(<()>)}{}[]<>)
Nitrodon
1

Ruby, 20 bajtów

->a{a.abs.to_s.size}
marmeladze
źródło
FYI: aby to nazwać, należy:->a{a.abs.to_s.size}[-95]
Filip Bartuzi
lub po prostu klasyczny sposób -->a{a.abs.to_s.size}.call(-92)
marmeladze
2
nie golfowy sposób: D
Filip Bartuzi
1

R, 18 bajtów

nchar(abs(scan()))
Sven Hohenstein
źródło
1

Alice , 10 bajtów (niekonkurujące)

 /d/
O@IHc

Wypróbuj online!

Jest to niekonkurencyjne rozwiązanie, ponieważ w momencie opublikowania tego wyzwania polecenie cbyło włożone do oficjalnego (i tylko: D) tłumacza. W międzyczasie Martin Ender naprawił to, więc teraz działa.

Wyjaśnienie

Wskaźnik instrukcji przechodzi przez dwa mirrory ( /) wiele razy, więc może być trochę trudny do naśladowania. Spróbuję wyjaśnić to tak jasno, jak to możliwe, używając kardynalnych wskazówek (np. N jest w górę, SW jest w lewo ...). Zadzwonię /1skrajne lewe lusterko i /2na prawo.

Command    Direction    Comment
               E        Execution starts from the upper-left corner going right
   /1        E → SE     Passing through the mirror changes direction and switches
                        to ordinal mode (string operations)
   I        SE → NE     Push the input string to the stack, then bounce against
                        the bottom of the code
   /2       NE → S      Back to cardinal mode (numeric operations)
   H           S        Pop n, push abs(n). Execution wraps from bottom to top
   /2        S → SE     Ordinal mode again
   c        SE → NW     Pop s, push each char of s separatedly. Bounce against
                        the bottom right corner
   /2       NW → W      Cardinal mode
   d           W        Push the depth of the stack (which is now equal to 
                        the number of characters in abs(input))
   /1     W → NW → SW   Pass through the mirror, then bounce agains the top
   O        SW → NE     Output the result, then bounce on the bottom left corner
   /1       NE → S      Last mirror, I promise
   @           S        Terminate execution
Lew
źródło
1

Marka GNU , 78 bajtów

Tryb rozkazujący:

$(eval T=$1)$(foreach D,$(shell seq 9),$(eval T=$(subst $D,? ,$T)))$(words $T)

Styl funkcjonalny, 113 bajtów:

$(eval 2?=$(shell seq 9))$(if $2,$(call $0,$(subst $(word 1,$2),? ,$1),$(wordlist 2,$(words $2),$2)),$(words $1))

Pure Make, 83 bajty:

$(eval T=$1)$(foreach D,0 1 2 3 4 5 6 7 8 9,$(eval T=$(subst $D,? ,$T)))$(words $T)
eush77
źródło
1

C ++, 80 76 bajtów

#include<string>
int main(int,char**c){printf("%d",strlen(c[1])-(*c[1]<46));}

Wyświetla długość argumentu, minus 1, jeśli pierwszy znak jest minusem, ponieważ boolgwarantuje konwersję na 1if truelub 0iffalse

  • 4 bajty dzięki @Squidy za wskazanie, że mogę użyć <46zamiast =='-', i aby uszanować tablicę zamiast[]
Tas
źródło
Możesz ogolić 4 bajty, zastępując c[1][0]=='-'je, *c[1]<46ponieważ możemy założyć, że wejście zawsze będzie prawidłową liczbą całkowitą. (Chyba że dozwolone są prefiksy inne niż „-” ...)
Squidy
@Squidy o wow ładne znalezisko! Przez wieki walczyłem z mózgiem, próbując to skrócić, a nawet nie wpadłem na to! Dziękujemy za sugestię, a zwłaszcza za zarejestrowanie się w PCCG, aby dać mi znać!
Tas
1

TI-Basic (TI-84 Plus CE, OS 5.2+), 6 bajtów

length(toString(abs(Ans

TI-Basic to tokenizowany język; length(i toString(każdy ma dwa bajty.

Ansjest używany jako domyślny wkład; ostatnia (tylko) wartość wiersza jest domyślnie zwracana.

Całkiem proste, przyjmuje wartość bezwzględną, aby pozbyć się znaku minus, konwertuje na ciąg znaków, zwraca długość ciągu.

6-bajtowe podejście matematyczne, które nie działa dla 0:

1+log(abs(Ans
pizzapanty184
źródło
Które kalkulatory mają toString(?
kamoroso94
@ kamoroso94 TI-84 Plus CE
pizzapants184