Wie lang ist meine nummer

26

Herausforderung

Geben Sie bei einer bestimmten Ganzzahl Qim Bereich -(2^100) ≤ Q ≤ 2^100die Anzahl der Stellen in dieser Zahl (in Basis 10) aus.

Regeln

Ja, Sie können die Zahl als Zeichenfolge verwenden und ihre Länge ermitteln.

Alle mathematischen Funktionen sind erlaubt.

Sie können Eingaben in jede Basis nehmen, aber die Ausgabe muss die Länge der Zahl in Basis 10 sein.

Zählen Sie das Minuszeichen nicht für negative Zahlen. Die Zahl wird niemals einen Dezimalpunkt haben.

Null kann entweder eine oder null Ziffern haben.

Angenommen, die Eingabe ist immer eine gültige Ganzzahl.

Beispiele

Input > Output

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

Gewinnen

Kürzester Code in Bytes gewinnt.

Beta-Zerfall
quelle

Antworten:

10

Brachylog , 1 Byte

l

Probieren Sie es online!

Eine andere integrierte Lösung, aber diese hat den kürzesten Namen (es sei denn, jemand findet eine Sprache, die diese Aufgabe in null Byte erledigt). Dies sollte sowohl in Brachylog 1 als auch in Brachylog 2 funktionieren.

Dies ist eine Funktionsübergabe (der TIO-Link enthält ein Befehlszeilenargument, das den Interpreter dazu veranlasst, eine einzelne Funktion anstatt eines ganzen Programms auszuführen), zum Teil, weil wir sonst Bytes für die Ausgabe ausgeben müssten, zum Teil, weil Brachylogs Syntax für Negativ numbers ist etwas ungewöhnlich, und wenn Sie dieses Programm zu einer Funktion machen, werden mögliche Argumente zur Eingabesyntax aufgelöst.

Es hat mich oft gestört, dass die meisten von Brachylogs eingebauten Funktionen negative Zahlen wie positive behandeln, aber diese Tatsache hat sich hier als nützlich erwiesen. Ich denke, es gibt Kompromisse, die mit jeder Golfsprache verbunden sind.


quelle
Hier höre ich auf zu scrollen ... das ist unverschämt!
Bogdan Alexandru
39

Taxi , 1118 Bytes

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.

Probieren Sie es 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.

Erläuterung:

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.
Ingenieur Toast
quelle
8
Ich war lange Zeit ein Lauerer in diesem Austausch, habe aber noch nie so etwas gesehen
Cup of Java
7
Wird das Benzin ausgehen, wenn die Anzahl lang genug ist?
Robert Fraser
5
Dies ist ein größerer Brainfuck als Brainfuck.
Omega
1
@RobertFraser Deshalb machen wir halt Zoom Zoomin jeder Schleife von plan "r". Ich habe es gerade auf 100.000 Stellen getestet und es ging nie das Benzin aus. Ich habe es nicht berechnet, aber ich nehme an, es kostet mehr als genug, um für das Benzin zu bezahlen, das es verbraucht, sodass es den Tank in jeder Schleife auffüllt.
Ingenieur Toast
1
@CupofJava Oh mein Gott , wie habe ich etwa vergessen Shakespeare .
Ingenieur Toast
18

Mathematica, 13 Bytes

IntegerLength

Es gibt eine eingebaute ... Rückkehr 0für 0.

Martin Ender
quelle
2
Mathematica setzt sich durch: D
Beta Decay
1
nicht im Code Golf tut es nicht :)
Greg Martin
8
There's a built-in: Wann ist nicht da?
TheLethalCoder
14

dc, 3

?Zp

Beachten Sie, dass normalerweise dcnegative Zahlen _anstelle der üblichen Zahlen angegeben werden müssen -. In diesem Fall kann jedoch beides verwendet werden. Wenn -angegeben, wird dcdies als Subtraktion auf einem leeren Stapel behandelt, geworfen dc: stack emptyund dann mit dem Rest der Zahl fortgefahren. Das Ergebnis ist also nicht anders.

Probieren Sie es online aus .

?    # input
 Z   # measure length
  p  # print
Digitales Trauma
quelle
Könnte dies nicht nur Zeine Funktionsübermittlung sein? dcDa es sich um eine verkettete Sprache mit den Operatoren quote + dup + eval handelt, kann sie beliebige Code-Zeichenfolgen wiederverwenden.
12

Retina , 2 Bytes

\d

Probieren Sie es online!

Retina weiß nicht wirklich, was Zahlen sind, daher wird die Eingabe als Zeichenfolge behandelt und wir zählen einfach die Ziffern.

Martin Ender
quelle
5

05AB1E , 2 Bytes

Äg

Probieren Sie es online! oder Probieren Sie alle Tests aus!

Ä  # Absolute value
 g # Length
Riley
quelle
Ähuh? Nicht þ? Meinetwegen.
Magic Octopus Urn
@carusocomputing Ich habe Äzuerst darüber nachgedacht , þwürde aber mit einem Dezimalpunkt umgehen, also ist es wohl ein bisschen besser.
Riley
Einfach cool, wie 2 Leute innerhalb von 2 Minuten auf 2 verschiedene 2-Byte-Lösungen gekommen sind, ich glaube aber nicht, dass es eine dritte gibt. versuche an einen zu denken.
Magic Octopus Urn
5

Alice , 16 Bytes

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

Probieren Sie es online!

Erläuterung

Ein halbwegs anständiges Layout dafür zu finden, war ziemlich schwierig. Ich bin immer noch nicht sehr zufrieden damit, wegen der Räume, der <und der ;, aber das ist das Beste, was ich im Moment tun kann.

Die Zeichenfolgenlänge ist eine der sehr gebräuchlichen Funktionen, die in Alice nicht vorhanden sind, da es sich bei der Eingabe um eine Zeichenfolge und bei der Ausgabe um eine Ganzzahl handelt (und alle Alice-Befehle sind ausschließlich Ganzzahlen für Ganzzahlen oder Zeichenfolgen für Zeichenfolgen). Wir können die Länge einer Zeichenkette messen, indem wir sie im Ordinal-Modus auf das Band schreiben und dann im Cardinal-Modus ihr Ende finden.

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

Ich habe auch versucht, das Minuszeichen im Kardinalmodus mit H(Absolutwert) zu korrigieren, aber der zusätzliche Modusschalter war bei meinen Versuchen immer teurer.

Martin Ender
quelle
4

PHP, 23 Bytes

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

Probieren Sie es online!

log zur Basis 10 des Absolutwerts plus eine Umwandlung in int

für null als eingang gibt log10 zurück, INFwas als falsch interpretiert wird

Der bessere Weg ist zu ersetzen $argnmit $argn?:13 Bytes

PHP, 27 Bytes

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

Stringlänge minus Boolescher Wert ist kleiner als Null

+2 Bytes für den Stringvergleich $argn<"0"

Probieren Sie es online!

PHP, 32 Bytes

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

Probieren Sie es online!

Regex zählt alle Ziffern

35 Bytes

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

Probieren Sie es online!

Stringlänge minus Anzahl -

strspn

Jörg Hülsermann
quelle
1
Der erste funktioniert zum Beispiel nicht 10, weil er ^eine niedrigere Priorität hat. Sie können es mit beheben -~.
user63956
Warum nicht einfach <?=strlen(abs($argn));?
Roberto06
@ user63956 Die Version mit log10 kann bei Eingabe von Null nicht funktionieren, daher lösche ich sie.
Jörg Hülsermann
1
@ JörgHülsermann Warum nicht einfach $argn?:1? Es wären 26 Bytes mit log10()und abs().
user63956
1
@ JörgHülsermann -~$xentspricht ((int)$x)+1. <?=-~log10(abs($argn?:1));scheint zu funktionieren.
user63956
4

Fortran 95 (Fortran), 121 96 95 Bytes

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

Erläuterung:
Subtrahiert den Index des Zeichens '-' von der Länge des Arguments.
Arrays beginnen in Fortran bei 1, und index () gibt 0 zurück, wenn das Symbol nicht gefunden wird.

Bearbeiten: Auf implizite Ganzzahl "i" umgestellt, auch konsolidierter Argument-Getter.

Edit: -1 Byte dank @Tsathoggua

Waffelstein
quelle
1
Willkommen bei PPCG!
Martin Ender
3

PowerShell, 24 Byte

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

wandelt den "absoluten" Wert der Eingabeargs in einen String um und erhält die Eigenschaft "length".

1 Byte kürzer als "".Length

Bis jemand einen besseren Weg findet, um die Bauchmuskeln einer Zahl in PS zu erhalten, ist dies wahrscheinlich so kurz, wie es nur geht.

colsw
quelle
Wie wäre es "$args".trim('-')|% Le*? :)
was auch immer
3

Brainfuck , 37 Bytes

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

Die Ausgabe erfolgt byteweise.

Probieren Sie es online!

Erläuterung

-[+>+[+<]>+]>->  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
Geschäfts-Katze
quelle
Ist es möglich, der TIO-Verknüpfung eine Fußzeile hinzuzufügen, die das Ergebnis als Zahl ausgibt?
Betazerfall
@BetaDecay Hinzugefügt
Business Cat
Das ist
Beta Decay
3

Ruby, 15 11 + 1 = 16 12 Bytes

Verwendet die -nFlagge.

p~/$/-~/\d/

Probieren Sie es online!

Erläuterung

                  # -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)
Wert Tinte
quelle
1
Welche Magie ist das?
Chowlett
2
@Chowlett hat eine Erklärung hinzugefügt.
Value Ink
2

Gelee , 2 Bytes

DL

Probieren Sie es online!

Dies macht buchstäblich, was gefragt wurde:

DL - Main link number n         e.g. -45
D  - convert to a decimal list       [-4,-5]
 L - get the length                  2
Jonathan Allan
quelle
Das ist ein interessantes eingebautes, Darbeitet an Dezimalstellen? Würde -1.2ausgeben [-1,-0.2]? Versuchte es selbst, tut es nicht.
Magic Octopus Urn
1
Nicht ganz, die Basis Umwandlung geht nur auf die Einheiten nach unten , so zum Beispiel 654.321Dergeben würde [6,5,4.321](auch tatsächlich [6.0,5.0,4.321000000000026])
Jonathan Allan
[-6.0, -5.0, -4.321000000000026]eigentlich anscheinend.
Magic Octopus Urn
Ah - ja, gerade bearbeitet - Gleitkomma-Arithmetik.
Jonathan Allan
2

CJam , 5 Bytes

q'--,

String basiert.

Probieren Sie es online!

9 Bytes für eine rein mathematische Lösung:

riz)AmLm]

Oder weitere 5 mit Basisumwandlung:

riAb,
Geschäfts-Katze
quelle
Oder auch 5: rizs,.
Martin Ender
2

Japt , 5 Bytes

a s l

Probieren Sie es online!

Erläuterung

 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
quelle
2

JavaScript (ES6), 27 26 25 24 Byte

Übernimmt die Eingabe als Zeichenfolge.

s=>s.match(/\d/g).length
  • Zwei Bytes dank Arnauld gespart.
Zottelig
quelle
Ihr Titel sagt 23 Bytes, aber Ihr Code ist 24 ... Dies ist jedoch 23 Bytes s=>`${s>0?s:-s}`.length:!
Dom Hastings
Vielen Dank, @ DomHastings. Sie sollten Ihre als separate Antwort posten, da dies eine andere Herangehensweise an meine ist.
Shaggy
2

JavaScript (ES6), 23 Byte

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

Andere Herangehensweise an Shaggys Antwort .

Dom Hastings
quelle
3
s=>s.length-(s<0)speichert 6 Bytes
Johan Karlsson
2

Java, 30 24 Bytes

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

Angenommen, iist ein BigInteger. Außerdem ist der Typ kontextualisiert, sodass keine Importe erforderlich sind, wie im Testcode angegeben.

Prüfung

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

Speichert

  • 30 -> 24 Bytes: danke an @cliffroot
Olivier Grégoire
quelle
+""statt .toString()?
Cliffroot
2
+1 für die Bereitstellung von Beispielcode, der zeigt, wie dieser aufgerufen wird, und zur Verdeutlichung des Typs iin Ihrer Antwort. Ich denke, mehr Lambda-Antworten sollten dies tun.
Poke
1

Python 2 , 31 22 Bytes

-9 Bytes dank Rod.

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

Probieren Sie es online!

total menschlich
quelle
1
len(`abs(s)`)mit der Zahl als Eingabe ist kürzer
Rod
2
Schade, dass Python keine Funktionskomposition hat. Es wäre gerecht len∘repr∘abs.
Roberto Bonvallet
1

Brain-Flak , 63 Bytes

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

Probieren Sie es online!

Dies sind 62 Byte Code und +1 Byte für das -aFlag.

Ich habe zwei andere Ansätze ausprobiert, aber leider waren beide länger:

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

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

Dies sollte eine sehr kurze Antwort sein. In der Tat, wenn wir keine negativen Zahlen unterstützen müssten, könnten wir einfach tun:

([]<>)

Aber wir müssen zuerst die erste Eingabe mit 45 (ASCII -) vergleichen, was den größten Teil der Byteanzahl dieser Antwort darstellt.

Eine arithmetische Lösung könnte kürzer sein.

DJMcMayhem
quelle
Ich zähle 62 Bytes ..?
Totalhuman
1
@totallyhuman siehe meine Bearbeitung.
DJMcMayhem
49 Bytes:([{}]((((()()()()())){}{})){}{})({(<()>)}{}[]<>)
Nitrodon
1

Ruby, 20 Bytes

->a{a.abs.to_s.size}
Marmelade
quelle
Zu ->a{a.abs.to_s.size}[-95]
Ihrer Information
oder einfach nur klassisch -->a{a.abs.to_s.size}.call(-92)
marmeladze
2
kein Golfspiel: D
Filip Bartuzi
1

R, 18 Bytes

nchar(abs(scan()))
Sven Hohenstein
quelle
1

Alice , 10 Bytes (nicht konkurrierend)

 /d/
O@IHc

Probieren Sie es online!

Dies ist eine nicht konkurrierende Lösung, da zum Zeitpunkt der Veröffentlichung dieser Herausforderung der Befehl ausgegeben wurde c Veröffentlichung im offiziellen (und einzigen: D) Interpreter fehlerhaft war. Martin Ender hat es inzwischen behoben, so dass dies nun funktioniert.

Erläuterung

Der Anweisungszeiger durchläuft die beiden Spiegel ( /) mehrmals, daher ist es möglicherweise etwas schwierig, ihm zu folgen. Ich werde versuchen, es so klar wie möglich zu erklären, indem ich die Himmelsrichtungen benutze (zB N ist oben, SW ist unten links ...). Ich werde /1den ganz linken und /2den ganz rechten Spiegel nennen .

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
Löwe
quelle
1

GNU Make , 78 Bytes

Imperativer Stil:

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

Funktionsstil, 113 Bytes:

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

Pure Make, 83 Bytes:

$(eval T=$1)$(foreach D,0 1 2 3 4 5 6 7 8 9,$(eval T=$(subst $D,? ,$T)))$(words $T)
eush77
quelle
1

C ++, 80 76 Bytes

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

Gibt die Länge des Arguments aus, minus 1, wenn das erste Zeichen ein Minus ist, da booldie Konvertierung in 1if trueoder 0if garantiert wirdfalse

  • 4 Bytes Dank an @Squidy für den Hinweis, dass ich <46anstelle von verwenden kann =='-', und das Array anstelle von zu respektieren[]
Tas
quelle
Sie könnten 4 Bytes abrasieren durch Ersetzen c[1][0]=='-'mit , *c[1]<46da wir den Eingang annehmen kann , wird immer eine gültige ganze Zahl sein. (Es sei denn, andere Präfixe als '-' sind zulässig ...)
Squidy
@Squidy oh wow schöner Fund! Ich habe mir ewig den Kopf zerbrochen, um das zu verkürzen, und habe mir das nie ausgedacht! Vielen Dank für den Vorschlag und vor allem für die Anmeldung bei PCCG, um mich zu informieren!
Bis
1

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

length(toString(abs(Ans

TI-Basic ist eine Token-Sprache. length(undtoString( sind jeweils zwei Bytes.

Answird als implizite Eingabe verwendet; Der Wert der letzten (einzigen) Zeile wird implizit zurückgegeben.

Ziemlich einfach: Nimmt den absoluten Wert, um ein Minuszeichen zu entfernen, konvertiert in einen String und gibt die Länge des Strings zurück.

Ein mathematischer 6-Byte-Ansatz, der für 0 nicht funktioniert:

1+log(abs(Ans
Pizzapants184
quelle
Welche Taschenrechner haben toString(?
Kamoroso94
@ Kamoroso94 TI-84 Plus CE
Pizzapants184