Wie lang ist meine Nummer: Restricted Version

8

Finden Sie die ursprüngliche Herausforderung hier

Herausforderung

Geben Sie bei einer gegebenen Ganzzahl Zim Bereich -2^31 < Z < 2^31die Anzahl der Ziffern in dieser Zahl aus (in Basis 10).

Regeln

Sie dürfen keine Zeichenfolgenfunktionen verwenden (im Falle einer Überladung dürfen Sie keine Zeichenfolge an Funktionen übergeben, die sowohl als Zeichenfolgen- als auch als Ganzzahlfunktionen fungieren). Sie dürfen die Nummer nicht als Zeichenfolge speichern.

Alle mathematischen Funktionen sind erlaubt.

Sie können Eingaben in einer beliebigen Basis vornehmen, die Ausgabe muss jedoch der Länge der Zahl in Basis 10 entsprechen.

Zählen Sie das Minuszeichen nicht für negative Zahlen. Die Zahl wird niemals eine Dezimalzahl sein.

Null ist effektiv eine führende Null, daher kann sie eine Null oder eine Ziffer haben.

Beispiele

Input > Output

-45 > 2
1254 > 4
107638538 > 9
-20000 > 5
0 > 0 or 1
-18 > 2

Gewinnen

Der kürzeste Code in Bytes gewinnt.

Beta-Zerfall
quelle
Ich nehme auch keine Array-Funktionen an?
Cyoce
@Cyoce Ja, keine Array-Funktionen
Beta Decay
Wenn eine Sprache nur Eingaben als Zeichenfolge akzeptiert, ist sie für diese Herausforderung ungültig, oder?
Ingenieur Toast
@EngineerToast Ja, sehr
Beta Decay
Ich entferne das eingeschränkte Quell-Tag, da dies zwar eine Einschränkung ist, aber keine echte Quellenbeschränkung, da es nicht vom Computer verfolgt werden kann.
Ad-hoc-Garf-Jäger

Antworten:

9

Mathematica, 13 Bytes

IntegerLength

Gut...

Martin Ender
quelle
Laut codegolf.meta.stackexchange.com/a/3605/14732 ist diese Frage ein Duplikat.
Ismael Miguel
@IsmaelMiguel Nun, dies ist ein etwas schwierigerer Fall, da die Herausforderung in einigen Sprachen tatsächlich ein Duplikat ist, in anderen jedoch überhaupt nicht.
Martin Ender
Die meisten Antworten dort können einfach hierher kopiert werden.
Ismael Miguel
@IsmaelMiguel Ich müsste gehen und zählen, aber ich glaube, dass die meisten Antworten auf die vorherige Herausforderung die Zeichenfolgenverarbeitung verwendeten, was hier keine Option ist.
Martin Ender
Meh, ich habe die Zählung dreimal verloren. Aber scheint tatsächlich etwa 30-45% der Antworten zu sein. Diese können einfach kopiert werden.
Ismael Miguel
7

Python 2 , 30 Bytes

f=lambda x:x and-~f(abs(x)/10)

Probieren Sie es online aus!

Undichte Nonne
quelle
@ Notts90 mache ich, weil es innen referenziert wird.
Undichte Nonne
7

Japt , 5 3 Bytes

ì l

Probieren Sie es online aus!

Luke
quelle
1
Ich habe einen Fix gepusht, der das aUnnötige macht - 5 Minuten bevor die Herausforderung veröffentlicht wurde :-) Leider bedeutet das, dass es nur auf dem Online-Interpreter funktioniert. ( Online testen! )
ETHproductions
Genial. Gut gemacht, Ninja'ing die Frage; )
Luke
6

JavaScript (ES6), 19 Byte

f=n=>n&&f(n/10|0)+1

console.log(f(-45))       // 2
console.log(f(1254))      // 4
console.log(f(107638538)) // 9
console.log(f(-20000))    // 5
console.log(f(0))         // 0
console.log(f(-18))       // 2

Arnauld
quelle
zählen wir "f ="? Viele der anderen Sprachen hier präsentieren die Funktionsdefinition für sich.
Sparr
5
@Sparr Dies ist eine rekursive Funktion, die auf sich selbst verweist. In diesem speziellen Fall zählen wir also f=.
Arnauld
4

Gelee , 3 2 Bytes

1 Byte dank Leaky Nun gespeichert

DL

Probieren Sie es online aus!

Erläuterung

 L    Length of
D     Decimal expansion of input argument. Works for negative values too
Luis Mendo
quelle
DL?
Undichte Nonne
Ich habe versucht, das zu tun. Aber ich konnte auf der Codepage nicht finden, was ich brauchte :(
Christopher
"Länge" einer ganzen Zahl, die dieselbe Funktion verwendet, die die Länge eines Strings angibt, fühlt sich wirklich wie eine String-Funktion an ...
Sparr
1
Nicht die Länge einer ganzen Zahl, sondern eine Liste ihrer Ziffern (erhalten mit D). Die Herausforderung lautet: Im Falle einer Überladung dürfen Sie keine Zeichenfolge an Funktionen übergeben, die sowohl als Zeichenfolgen- als auch als Ganzzahlfunktionen fungieren. Diese Antwort folgt dieser Regel: Ich übergebe keine Zeichenfolge
Luis Mendo
3

Kettencode , 5 Bytes

pqL_+

Hinweis: Dies ist genau der gleiche Code wie bei der anderen Herausforderung

Erläuterung

pqL_+ print(
    +   succ(
   _      floor(
  L        log_10(
pq           abs(
               input())))))
Roman Gräf
quelle
2

SILOS , 41 Bytes

readIO
i|
lblb
i/10
a+1
if i b
printInt a

Probieren Sie es online aus!

Rückgabe 1für 0.

Undichte Nonne
quelle
Warum gibt es keine Liebe zu SILOS, das für diese Herausforderung Golfspieler ist als Python!
Rohan Jhunjhunwala
2

Lua , 40 Bytes

Port von meiner Python-Antwort

print(math.log10(math.abs(10*...)+1)//1)

Probieren Sie es online aus!

Felipe Nardi Batista
quelle
1

C #, 49 56 Bytes

namespace System.Math{n=>n==0?1:Floor(Log10(Abs(n))+1);}
TheLethalCoder
quelle
1

Alice , 16 Bytes

/O
\I@/Hwa:].$Kq

Probieren Sie es online aus!

Erläuterung

/O
\I@/...

Dies ist einfach ein Rahmen für die numerische Eingabe → mathematische Verarbeitung → numerische Ausgabe.

Der Rest des Codes ist der eigentliche Algorithmus:

Hwa:].$Kq
H            Compute absolute value
 w   .$K     While the result is not zero do:
  a:           divide the number by 10
    ]          move the tape head one cell forward
        q    Get the position of the tape head
Löwe
quelle
1

Python 2 , 48 Bytes

-3 dank ovs -1 dank pizzapants

lambda x:math.log10(abs(10*x)+1)//1
import math

Probieren Sie es online aus!

Felipe Nardi Batista
quelle
lambda x:1+log10(abs(x)+.1)//1für 48 Bytes
ovs
import mathund math.log10spart ein Byte
pizzapants184
1

C, 27 Bytes

Versuchen Sie es online

f(n){return n?1+f(n/10):0;}

C (gcc), 22 Bytes

f(n){n=n?1+f(n/10):0;}

Mit Mathe 29 Bytes

f(n){return 1+log10(abs(n));}
Khaled.K
quelle
0

MATL , 5 Bytes

|OYAn

Probieren Sie es online aus!

Erläuterung

|     % Implicitly input a number. Absolute value
OYA   % Convert to array of decimal digits
n     % Length. Implicitly display
Luis Mendo
quelle
0

PowerShell, 52 51 Bytes

$m=[math];$m::Floor($m::Log10($m::Abs($args[0])))+1

Vielen Dank an Felipe für die Behebung des Problems mit Log10 und die Bereitstellung eines 1-Byte-Speichers.

Alle System.MathAnrufe sind in PowerShell extrem teuer.

Verwendet die Methode, um das Log10 des Abs-Werts der Eingabe abzurufen und aufzurunden.

colsw
quelle
du solltest verwenden Floor()+1. Ceil()scheitert für Potenzen von 10
Felipe Nardi Batista
Verwenden Sie $m::Log10(..., um ein Byte zu speichern
Felipe Nardi Batista
0

QBIC , 25 Bytes

≈abs(:)>=1|b=b+1┘a=a/z}?b

Dies teilt die Eingabe durch 10 und verfolgt, wie oft wir dies bis N<1 tun können .

Erläuterung:

≈abs(:)>=1| : gets cmd line input, 
            ≈ starts a while loop,
            abs() is literal QBasic code and is for cases with negative n
            | is the terminator to the WHILE-condition
b=b+1       Keep track of the # of divisions        
┘           Syntactic line break
a=a/z       Divide a by 10 (z==10 in QBIC)
}           End WHILE-loop body
?b          PRINT b
steenbergh
quelle
0

Bash , 50 Bytes

a=$1;until [ $a -eq 0 ];{ let i++ a=a/10;};echo $i

Probieren Sie es online aus!

Kein String / Array-Befehl, nur Ziffern nach ganzzahliger Division zählen.

Markosmos
quelle
0

bc , 6 Bytes

length

Eingebaute Funktion.

eush77
quelle
0

Eigentlich 8 Bytes

;0=+A╥Lu

Probieren Sie es online aus!

Erläuterung:

;0=+A╥Lu
;0=       is input equal to 0?
   +      add 1 if input is 0, else add 0
    A     absolute value
     ╥L   log base 10, floor
       u  increment

Dieses Programm berechnet effektiv floor(log10(x))+1. Um log(0)nicht definiert zu sein (tatsächlich wird zurückgegeben, (-inf+nanj)was eine besondere Art zu sagen ist, dass es nicht definiert ist), wird die Eingabe inkrementiert, wenn dies 0vor der Berechnung der Länge erfolgt. Somit 0wird eine Länge von angenommen 1.

Mego
quelle
0

Ruby, 27 Bytes

f=->x{x==0?0:1+f[x.abs/10]}

Als Test:

tests = [[-45 , 2],
         [1254 , 4],
         [107638538 , 9],
         [-20000 , 5],
         [0 , 0 ],
         [-18 , 2]]

tests.each do |i, o|
  p f.call(i) == o
end

Es gibt aus:

true
true
true
true
true
true
Eric Duminil
quelle