Quanto dura il mio numero?


26

Sfida

Dato un numero intero, Qnell'intervallo -(2^100) ≤ Q ≤ 2^100, genera il numero di cifre in quel numero (in base 10).

Regole

Sì, puoi prendere il numero come stringa e trovarne la lunghezza.

Sono ammesse tutte le funzioni matematiche.

È possibile accettare input in qualsiasi base, ma l'output deve essere la lunghezza del numero in base 10.

Non contare il segno meno per i numeri negativi. Il numero non avrà mai un punto decimale.

Zero può contenere una o zero cifre.

Supponiamo che l'input sia sempre un numero intero valido.

Esempi

Input > Output

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

vincente

Vince il codice più breve in byte.

Risposte:


10

Brachylog , 1 byte

l

Provalo online!

Un'altra soluzione integrata, ma questa ha il nome più breve (a meno che qualcuno non trovi una lingua che svolge questa attività in zero byte). Questo dovrebbe funzionare sia in Brachylog 1 che in Brachylog 2.

Questo è un invio di funzione (il collegamento TIO contiene un argomento della riga di comando che fa sì che l'interprete esegua una singola funzione anziché un intero programma), in parte perché altrimenti dovremmo spendere byte in output, in parte perché la sintassi di Brachylog per negativo i numeri sono alquanto insoliti e rendere questo programma una funzione risolve qualsiasi potenziale argomento sulla sintassi di input.

Mi dà spesso fastidio che la maggior parte dei builtin di Brachylog tratti i numeri negativi come quelli positivi, ma questo fatto è tornato utile qui. Immagino che ci siano compromessi in ogni linguaggio del golf.


Qui è dove smetto di scorrere ... questo è scandaloso!
Bogdan Alexandru,

39

Taxi , 1118 byte

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.

Provalo online!

Ungolfed:

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.

Spiegazione:

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
Sono stato in agguato in questo scambio per molto tempo, ma non ho mai visto qualcosa di simile
Cup of Java

7
Questo a corto di gas se il numero è abbastanza lungo?
Robert Fraser,

5
Questo è un Brainfuck più grande di Brainfuck.
Omega,

1
@RobertFraser Ecco perché ci fermiamo Zoom Zoomin ogni ciclo di plan "r". L'ho appena testato fino a 100.000 cifre e non ha mai esaurito il gas. Non l'ho calcolato, ma suppongo che ci voglia più di una tariffa sufficiente per pagare il gas che sta usando in modo da riempire il serbatoio ad ogni giro.
Ingegnere Toast,

1
@CupofJava OH MY GOSH come ho dimenticato Shakespeare .
Ingegnere Toast,


14

dc, 3

?Zp

Si noti che normalmente è dcnecessario fornire numeri negativi _anziché quelli più comuni -. Tuttavia, in questo caso, può essere utilizzato uno dei due. Se -viene fornito, dcconsidera questo come una sottrazione su una pila vuota, lancia dc: stack emptye quindi continua con il resto del numero; Quindi il risultato non è diverso.

Provalo online .

?    # input
 Z   # measure length
  p  # print

Non potrebbe essere solo Zuna presentazione di funzioni? dcè un linguaggio concatenativo con operatori quote + dup + eval, quindi può riutilizzare stringhe di codice arbitrarie.

12

Retina , 2 byte

\d

Provalo online!

Retina non sa davvero quali siano i numeri, quindi l'input viene trattato come una stringa e contiamo semplicemente i caratteri delle cifre.



5

Alice , 16 byte

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

Provalo online!

Spiegazione

Trovare un layout decente per questo è stato piuttosto complicato. Non ne sono ancora molto contento per via degli spazi, dei <e dei ;, ma questo è il meglio che potrei fare per ora.

La lunghezza della stringa è uno di quei built-in molto comuni che non esistono in Alice, perché il suo input è una stringa e il suo output è un numero intero (e tutti i comandi di Alice sono numeri interi interi o stringhe di stringhe). Possiamo misurare la lunghezza di una stringa scrivendola sul nastro in modalità Ordinale e poi trovandone la fine in modalità Cardinale.

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

Ho anche provato a occuparmi del segno meno in modalità Cardinale con H(valore assoluto), ma il cambio di modalità aggiuntivo è sempre risultato più costoso nei miei tentativi.


4

PHP, 23 byte

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

Provalo online!

log della base 10 del valore assoluto più un cast su int

per zero come input log10 restituisce INFche viene interpretato come falso

Il modo migliore è sostituire $argncon $argn?:1+3 byte

PHP, 27 byte

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

la lunghezza della stringa meno il valore booleano è inferiore a zero

+2 byte per il confronto delle stringhe $argn<"0"

Provalo online!

PHP, 32 byte

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

Provalo online!

Regex conta tutte le cifre

35 byte

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

Provalo online!

lunghezza della stringa meno conteggio -

strspn


1
Il primo non funziona, ad esempio 10, perché ^ha una priorità inferiore. Puoi risolverlo con -~.
user63956,

Perché non semplicemente <?=strlen(abs($argn));?
roberto06,

@ user63956 La versione con log10 non può funzionare in caso di input zero, quindi la elimino.
Jörg Hülsermann,

1
@ JörgHülsermann Perché non solo $argn?:1? Sarebbe 26 byte con log10()e abs().
user63956,

1
@ JörgHülsermann -~$xè equivalente a ((int)$x)+1. <?=-~log10(abs($argn?:1));sembra funzionare.
user63956,

4

Fortran 95 (gfortran), 121 96 95 byte

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

Spiegazione:
sottrae l'indice del segno '-' dalla lunghezza dell'argomento.
Le matrici iniziano da 1 in Fortran e index () restituisce 0 se il simbolo non viene trovato.

Modifica: passato all'intero implicito "i", anche argomento getter consolidato.

Modifica: -1 byte grazie a @Tsathoggua


1
Benvenuti in PPCG!
Martin Ender,

3

PowerShell, 24 byte

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

lancia il valore "assoluto" dell'input args su una stringa e ne ottiene la proprietà 'length'.

1 byte più corto di "".Length

finché qualcuno non trova un modo migliore per ottenere gli addominali di un numero in PS, questo è probabilmente il più breve possibile.


Che ne dici "$args".trim('-')|% Le*? :)
qualunque sia


3

Brainfuck , 37 byte

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

L'output è in base al valore byte.

Provalo online!

Spiegazione

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

È possibile aggiungere un piè di pagina al collegamento TIO che genera il risultato come numero?
Decadimento beta

@BetaDecay Aggiunto
Business Cat

Fantastico, grazie: D
Beta Decay

3

Rubino, 15 11 + 1 = 16 12 byte

Usa la -nbandiera.

p~/$/-~/\d/

Provalo online!

Spiegazione

                  # -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
Che magia è questa?
Chowlett,

2
@Chowlett ha aggiunto una spiegazione.
Value Ink

2

Gelatina , 2 byte

DL

Provalo online!

Questo fa letteralmente quello che è stato chiesto:

DL - Main link number n         e.g. -45
D  - convert to a decimal list       [-4,-5]
 L - get the length                  2

È un built-in interessante lì, Dfunziona con i decimali? Sarebbe -1.2uscita [-1,-0.2]? Ho provato io stesso, non lo fa.
Magic Octopus Urn

1
Non del tutto, la conversione di base scende solo alle unità, quindi, per esempio, 654.321Dcederebbe [6,5,4.321](bene in realtà [6.0,5.0,4.321000000000026])
Jonathan Allan,

[-6.0, -5.0, -4.321000000000026], in realtà, apparentemente.
Magic Octopus Urn

Ah - sì, appena modificato - aritmetica in virgola mobile.
Jonathan Allan,


2

Japt , 5 byte

a s l

Provalo online!

Spiegazione

 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 byte

Accetta l'input come stringa.

s=>s.match(/\d/g).length
  • Salvato due byte grazie ad Arnauld.

Il tuo titolo dice 23 byte, ma il tuo codice è 24 ... Tuttavia, questo è 23 byte s=>`${s>0?s:-s}`.length:!
Dom Hastings,

Grazie, @DomHastings. Dovresti pubblicare la tua come risposta separata in quanto è un approccio diverso al mio.
Shaggy,


2

Giava, 30 24 byte

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

Presuppone iè a BigInteger. Inoltre, il tipo è contestualizzato, quindi non sono necessarie importazioni, come mostrato nel codice di prova.

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

Salva

  • 30 -> 24 byte: grazie a @cliffroot

+""invece di .toString()?
cliffroot,

2
+1 per fornire il codice di esempio che mostra come viene invocato e per chiarire il tipo di inella tua risposta. Penso che più risposte lambda dovrebbero fare questo.
Colpisce


1

Brain-Flak , 63 byte

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

Provalo online!

Si tratta di 62 byte di codice e +1 byte per il -a flag.

Ho provato altri due approcci, ma sfortunatamente entrambi erano più lunghi:

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

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

Questa dovrebbe essere una risposta molto breve. In effetti, se non dovessimo supportare numeri negativi, potremmo semplicemente fare:

([]<>)

Ma dobbiamo confrontare il primo input con 45 (ASCII - ), che è la maggior parte del conteggio dei byte di questa risposta.

Una soluzione aritmetica potrebbe essere più breve.


Conto 62 byte ..?
totalmente umano

1
@totallyhuman vedi la mia modifica.
DJMcMayhem

49 byte:([{}]((((()()()()())){}{})){}{})({(<()>)}{}[]<>)
Nitrodon




1

Alice , 10 byte (non concorrenti)

 /d/
O@IHc

Provalo online!

Questa è una soluzione non competitiva, perché al momento questa sfida è stata pubblicata il comando c era infastidito nell'interprete ufficiale (e solo: D). Nel frattempo Martin Ender lo ha riparato, quindi ora funziona.

Spiegazione

Il puntatore dell'istruzione passa attraverso i due mirror ( /) più volte, quindi potrebbe essere difficile seguirlo. Proverò a spiegarlo il più chiaramente possibile, usando le direzioni cardinali (es. N è in alto, SW è in basso a sinistra ...). Chiamo /1lo specchio più a sinistra, e /2quella più a destra.

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

GNU Make , 78 byte

Stile imperativo:

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

Stile funzionale, 113 byte:

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

Pure Make, 83 byte:

$(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 byte

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

Stampa la lunghezza dell'argomento, meno 1 se il primo carattere è meno perché boolgarantisce la conversione in 1if trueo 0iffalse

  • 4 byte grazie a @Squidy per la segnalazione che posso usare al <46posto di =='-', e per deferire l'array invece di[]

È possibile radere 4 byte sostituendoli c[1][0]=='-'con *c[1]<46poiché possiamo supporre che l'input sarà sempre un numero intero valido. (A meno che non siano consentiti prefissi diversi da '-' ...)
Squidy,

@Squidy oh wow bella scoperta! Ho distrutto il mio cervello per anni cercando di accorciarlo e non ne ho mai pensato! Grazie per il suggerimento e soprattutto per esserti iscritto a PCCG per farmelo sapere!
Tas,

1

TI-Basic (TI-84 Plus CE, OS 5.2+), 6 byte

length(toString(abs(Ans

TI-Basic è un linguaggio tokenizzato; length(e toString(sono due byte ciascuno.

Ansè usato come input implicito; viene restituito implicitamente il valore dell'ultima (unica) riga.

Abbastanza semplice, prende il valore assoluto per sbarazzarsi di un segno meno, converte in stringa, restituisce la lunghezza della stringa.

Un approccio matematico a 6 byte che non funziona per 0:

1+log(abs(Ans

Quali calcolatori hanno toString(?
kamoroso94

@ kamoroso94 TI-84 Plus CE
pizzapants184

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.