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.


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


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

Japt , 5 3 byte

ì l

Cobalah online!


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


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


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.


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






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


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


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





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.


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

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.




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.



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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.