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.

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.


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.

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


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

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.


5

05AB1E , 2 bajty

Äg

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

Ä  # Absolute value
 g # Length

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


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


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


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.


Jak o "$args".trim('-')|% Le*? :)
cokolwiek


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

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)

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

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

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


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.

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

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

+""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

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.


Liczę 62 bajty ..?
całkowicieludzki

1
@ totalniehuman zobaczyć moją edycję.
DJMcMayhem

49 bajtów:([{}]((((()()()()())){}{})){}{})({(<()>)}{}[]<>)
Nitrodon




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

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)

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[]

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

Które kalkulatory mają toString(?
kamoroso94

@ kamoroso94 TI-84 Plus CE
pizzapants184

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.