Berapa lama nomor saya: Versi Terbatas

8

Temukan tantangan aslinya di sini

Tantangan

Diberikan bilangan bulat, Zdalam kisaran -2^31 < Z < 2^31, output jumlah digit dalam angka itu (di basis 10).

Aturan

Anda tidak boleh menggunakan fungsi string apa pun (dalam kasus overloading, Anda tidak boleh melewatkan string ke fungsi yang bertindak sebagai fungsi string dan integer). Anda tidak diizinkan menyimpan nomor tersebut sebagai string.

Semua fungsi matematika diizinkan.

Anda dapat mengambil input di basis apa pun, tetapi output harus panjang dari angka di basis 10.

Jangan hitung tanda minus untuk angka negatif. Angka tidak akan pernah menjadi desimal.

Nol secara efektif nol di depan, sehingga dapat memiliki nol atau satu digit.

Contohnya

Input > Output

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

Kemenangan

Kode terpendek dalam byte menang.

Peluruhan Beta
sumber
Saya menganggap tidak ada fungsi array juga?
Cyoce
@Cyoce Ya, tidak ada fungsi array
Beta Decay
Jadi jika suatu bahasa hanya menerima input sebagai string, itu tidak valid untuk tantangan ini, kan?
Engineer Toast
@ EngineerToast Ya, sangat banyak
Beta Decay
Saya menghapus tag sumber terbatas karena sementara ini adalah pembatasan itu bukan pembatasan sumber nyata karena itu tidak dapat ditelusuri komputer.
Ad Hoc Garf Hunter

Jawaban:

9

Mathematica, 13 byte

IntegerLength

Baik...

Martin Ender
sumber
Menurut codegolf.meta.stackexchange.com/a/3605/14732 ini membuat pertanyaan ini duplikat.
Ismael Miguel
@IsmaelMiguel Yah, ini adalah kasus yang sedikit lebih rumit, karena tantangannya adalah duplikat dalam beberapa bahasa secara efektif tetapi tidak sama sekali pada bahasa lain.
Martin Ender
Sebagian besar jawaban di sana dapat disalin ke sini.
Ismael Miguel
@IsmaelMiguel saya harus pergi dan menghitung, tapi saya percaya sebagian besar jawaban pada tantangan sebelumnya menggunakan pemrosesan string yang bukan merupakan pilihan di sini.
Martin Ender
Meh, saya kehilangan hitungan 3 kali. Tetapi tampaknya benar-benar sekitar 30-45% dari jawaban. Itu bisa disalin.
Ismael Miguel
7

Python 2 , 30 byte

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

Cobalah online!

Biarawati Bocor
sumber
@ Notts90 saya lakukan, karena direferensikan di dalam.
Leaky Nun
7

Japt , 5 3 byte

ì l

Cobalah online!

Luke
sumber
1
Saya mendorong perbaikan yang membuat atidak perlu - 5 menit sebelum tantangan diposting :-) Sayangnya, itu berarti itu hanya akan bekerja pada penerjemah online. ( uji online! )
ETHproduk
Luar biasa. Nah, ninja'ing pertanyaannya; )
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
sumber
kita menghitung "f ="? banyak bahasa lain di sini menyajikan definisi fungsi dengan sendirinya.
Sparr
5
@Sparr Ini adalah fungsi rekursif yang mereferensikan dirinya. Jadi dalam kasus khusus ini, ya, kami menghitung f=.
Arnauld
4

Jelly , 3 2 byte

1 byte disimpan berkat Leaky Nun

DL

Cobalah online!

Penjelasan

 L    Length of
D     Decimal expansion of input argument. Works for negative values too
Luis Mendo
sumber
DL?
Leaky Nun
Saya mencoba melakukan ini. Tetapi saya tidak dapat menemukan apa yang saya butuhkan di halaman kode :(
Christopher
"length" dari integer, menggunakan fungsi yang sama yang memberikan panjang string, benar-benar terasa seperti fungsi string ...
Sparr
1
Bukan panjang bilangan bulat, tetapi daftar digit-digitnya (diperoleh dengan D). Tantangannya mengatakan: dalam kasus overloading, Anda tidak boleh melewatkan string ke fungsi yang berfungsi sebagai fungsi string dan integer. Jawaban ini mengikuti aturan itu: Saya tidak mengoper string
Luis Mendo
4

Jawaban saya dari tantangan lain masih berfungsi:

Brachylog , 1 byte

l

Cobalah online!

The lbuiltin kelebihan beban, tetapi pada bilangan bulat, dibutuhkan jumlah digit dari bilangan bulat, mengabaikan tanda.


sumber
3

Chaincode , 5 byte

pqL_+

Catatan: Ini persis kode yang sama dengan yang dari tantangan lain

Penjelasan

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

SILOS , 41 byte

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

Cobalah online!

Pengembalian 1untuk 0.

Biarawati Bocor
sumber
Mengapa tidak ada cinta untuk SILOS, golfiernya lebih dari python untuk tantangan ini!
Rohan Jhunjhunwala
2

Lua , 40 byte

Port dari jawaban python saya

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

Cobalah online!

Felipe Nardi Batista
sumber
1

C #, 49 56 byte

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

Alice , 16 byte

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

Cobalah online!

Penjelasan

/O
\I@/...

Ini hanyalah kerangka kerja untuk input numerik → pemrosesan matematika → output numerik.

Sisa kode adalah algoritma nyata:

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
Leo
sumber
1

Python 2 , 48 byte

-3 Berkat ovs -1 berkat pizza

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

Cobalah online!

Felipe Nardi Batista
sumber
lambda x:1+log10(abs(x)+.1)//1untuk 48 byte
ovs
import mathdan math.log10menyimpan satu byte
pizzapants184
1

C, 27 byte

Coba Online

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

C (gcc), 22 byte

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

Menggunakan matematika, 29 byte

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

R , 40 byte

function(x)max(ceiling(log10(abs(x))),0)

Cobalah online!

JayCe
sumber
0

MATL , 5 byte

|OYAn

Cobalah online!

Penjelasan

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

Oktaf , 27 byte

@(x)fix(log10(abs(x+~x)))+1

Cobalah online!

Luis Mendo
sumber
0

PowerShell, 52 51 Bytes

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

Terima kasih kepada Felipe karena telah memperbaiki Masalah dengan Log10, dan memberikan penghematan 1byte.

Setiap System.Mathpanggilan sangat mahal di PowerShell.

Menggunakan metode untuk mendapatkan Log10 dari Nilai Abs input, dan mengumpulkannya.

colsw
sumber
Anda harus menggunakan Floor()+1. Ceil()gagal karena kekuatan 10
Felipe Nardi Batista
gunakan $m::Log10(...untuk menyimpan byte
Felipe Nardi Batista
0

QBIC , 25 byte

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

Ini membagi input dengan 10, dan melacak berapa kali kita bisa melakukan ini sampai N<1.

Penjelasan:

≈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
sumber
0

Bash , 50 byte

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

Cobalah online!

Tidak ada perintah string / array, hanya menghitung digit dengan pembagian integer.

marcosm
sumber
0

bc , 6 byte

length

Fungsi bawaan.

eush77
sumber
0

Sebenarnya , 8 byte

;0=+A╥Lu

Cobalah online!

Penjelasan:

;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

Program ini menghitung secara efektif floor(log10(x))+1. Untuk berurusan dengan log(0)tidak terdefinisi (sebenarnya mengembalikan (-inf+nanj)yang merupakan cara khusus untuk mengatakan itu tidak terdefinisi), input bertambah jika 0sebelum menghitung panjangnya. Dengan demikian, 0dianggap memiliki panjang 1.

Mego
sumber
0

Ruby, 27 byte

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

Sebagai tes:

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

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

Ini menghasilkan:

true
true
true
true
true
true
Eric Duminil
sumber