Số của tôi là bao lâu: Phiên bản giới hạn


8

Tìm thử thách ban đầu tại đây

Thử thách

Cho một số nguyên, Ztrong phạm vi -2^31 < Z < 2^31, xuất số chữ số trong số đó (trong cơ sở 10).

Quy tắc

Bạn không được sử dụng bất kỳ hàm chuỗi nào (trong trường hợp quá tải, bạn không được truyền chuỗi vào các hàm đóng vai trò là cả hàm chuỗi và số nguyên). Bạn không được phép lưu trữ số dưới dạng chuỗi.

Tất cả các chức năng toán học được cho phép.

Bạn có thể lấy đầu vào trong bất kỳ cơ sở nào, nhưng đầu ra phải là độ dài của số trong cơ sở 10.

Không đếm dấu trừ cho số âm. Số sẽ không bao giờ là số thập phân.

Số 0 thực sự là một số 0 đứng đầu, vì vậy nó có thể có 0 hoặc một chữ số.

Ví dụ

Input > Output

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

Chiến thắng

Mã ngắn nhất trong byte thắng.


Tôi giả sử không có chức năng mảng?
Cyoce

@Cyoce Có, không có chức năng mảng
Beta Decay

Vì vậy, nếu một ngôn ngữ chỉ chấp nhận đầu vào dưới dạng một chuỗi, thì nó không hợp lệ cho thử thách này, phải không?
Kỹ sư Toast

@EngineerToast Vâng, rất nhiều
Beta Decay

Tôi đang xóa thẻ nguồn bị hạn chế bởi vì mặc dù đây là một hạn chế nhưng nó không phải là một hạn chế nguồn thực sự ở chỗ nó không phải là máy tính có thể điều khiển được.
Ad Hoc Garf Hunter

Câu trả lời:


9

Toán học, 13 byte

IntegerLength

Tốt...


Theo codegolf.meta.stackexchange.com/a/3605/14732 điều này làm cho câu hỏi này trở thành một bản sao.
Ismael Miguel

@IsmaelMiguel Vâng, đây là một trường hợp phức tạp hơn một chút, bởi vì thách thức thực sự là một bản sao trong một số ngôn ngữ nhưng hoàn toàn không phải trên các ngôn ngữ khác.
Martin Ender

Hầu hết các câu trả lời có thể được sao chép ở đây.
Ismael Miguel

@IsmaelMiguel Tôi phải đi và đếm, nhưng tôi tin rằng phần lớn các câu trả lời về thử thách trước đó đã sử dụng xử lý chuỗi không phải là một tùy chọn ở đây.
Martin Ender

Meh, tôi đã mất số đếm 3 lần. Nhưng dường như thực sự có khoảng 30-45% câu trả lời. Những người có thể được sao chép qua.
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


chúng ta có đếm "f =" không? rất nhiều ngôn ngữ khác ở đây trình bày định nghĩa hàm của chính nó.
Sparr

5
@Sparr Đây là một hàm đệ quy tham chiếu chính nó. Vì vậy, trong trường hợp đặc biệt này, vâng, chúng tôi tính f=.
Arnauld

4

Thạch , 3 2 byte

Lưu 1 byte nhờ Leaky Nun

DL

Hãy thử trực tuyến!

Giải trình

 L    Length of
D     Decimal expansion of input argument. Works for negative values too


Tôi đã cố gắng để làm điều này. Nhưng tôi không thể tìm thấy những gì tôi cần trên trang mã :(
Christopher

"Độ dài" của một số nguyên, sử dụng cùng một hàm cho độ dài của chuỗi, thực sự có cảm giác giống như hàm chuỗi ...
Sparr

1
Không phải chiều dài của một số nguyên, mà là một danh sách các chữ số của nó (thu được bằng D). Thử thách cho biết: trong trường hợp quá tải, bạn không được truyền chuỗi vào các hàm đóng vai trò là cả hàm chuỗi và số nguyên Câu trả lời này tuân theo quy tắc đó: Tôi không truyền chuỗi
Luis Mendo


3

Mã chuỗi , 5 byte

pqL_+

Lưu ý: Đây chính xác là mã giống như từ thử thách khác

Giải trình

pqL_+ print(
    +   succ(
   _      floor(
  L        log_10(
pq           abs(
               input())))))






1

Alice , 16 byte

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

Hãy thử trực tuyến!

Giải trình

/O
\I@/...

Đây chỉ đơn giản là một khung cho đầu vào số → xử lý toán học → đầu ra số.

Phần còn lại của mã là thuật toán thực sự:

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

Thử trực tuyến

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

C (gcc), 22 byte

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

Sử dụng toán học, 29 byte

f(n){return 1+log10(abs(n));}







0

PowerShell, 52 51 byte

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

Cảm ơn Felipe vì cả hai đã khắc phục Sự cố với Log10 và cung cấp tiết kiệm 1byte.

Bất kỳ System.Mathcuộc gọi nào đều cực kỳ đắt đỏ trong PowerShell.

Sử dụng phương pháp lấy Log10 của Giá trị abs của đầu vào và làm tròn số đó lên.


bạn nên sử dụng Floor()+1. Ceil()thất bại vì quyền hạn của 10
Felipe Nardi Batista

sử dụng $m::Log10(...để lưu một byte
Felipe Nardi Batista

0

QBIC , 25 byte

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

Điều này chia đầu vào cho 10 và theo dõi số lần chúng ta có thể làm điều này cho đến khi N<1.

Giải trình:

≈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

Trên thực tế , 8 byte

;0=+A╥Lu

Hãy thử trực tuyến!

Giải trình:

;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

Chương trình này tính toán hiệu quả floor(log10(x))+1. Để đối phó với log(0)việc không được xác định (thực ra nó trả về (-inf+nanj)đó là một cách đặc biệt để nói rằng nó không được xác định), đầu vào được tăng lên nếu 0trước khi tính toán độ dài. Vì vậy, 0được coi là có chiều dài 1.



0

Ruby, 27 byte

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

Như một bài kiểm tra:

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

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

Nó xuất ra:

true
true
true
true
true
true

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.