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.


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


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



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


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


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






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









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.


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




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.



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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.