Số của tôi dài bao nhiêu?


26

Thử thách

Cho một số nguyên, Qtrong phạm vi -(2^100) ≤ Q ≤ 2^100, xuất số chữ số trong số đó (trong cơ sở 10).

Quy tắc

Có, bạn có thể lấy số làm chuỗi và tìm độ dài của 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 tính dấu trừ cho số âm. Số sẽ không bao giờ có dấu thập phân.

Số không có thể có một hoặc không có chữ số.

Giả sử đầu vào sẽ luôn là một số nguyên hợp lệ.

Ví dụ

Input > Output

-45 > 2
12548026 > 8
33107638153846291829 > 20
-20000 > 5
0 > 1 or 0

Chiến thắng

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

Câu trả lời:


10

Brachylog , 1 byte

l

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

Một giải pháp dựng sẵn khác, nhưng giải pháp này có tên ngắn nhất (trừ khi ai đó tìm thấy một ngôn ngữ thực hiện nhiệm vụ này bằng byte không). Điều này sẽ hoạt động trong cả Brachylog 1 và Brachylog 2.

Đây là một chức năng đệ trình (liên kết TIO chứa đối số dòng lệnh khiến trình thông dịch chạy một chức năng riêng lẻ thay vì toàn bộ chương trình), một phần vì nếu không, chúng tôi sẽ phải sử dụng byte cho đầu ra, một phần vì cú pháp của Brachylog cho phủ định các con số hơi bất thường và làm cho chương trình này trở thành một hàm giải quyết bất kỳ đối số tiềm năng nào về cú pháp đầu vào.

Điều này thường làm phiền tôi rằng hầu hết các nội dung của Brachylog đều coi các số âm như số dương, nhưng thực tế cuối cùng lại có ích ở đây. Tôi đoán có những sự đánh đổi liên quan đến mọi ngôn ngữ chơi gôn.


Đây là nơi tôi ngừng cuộn ... điều này thật quá đáng!
Bogdan Alexandru

39

Taxi , 1118 byte

1 is waiting at Starchild Numerology.Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Chop Suey.Go to Chop Suey:n 1 r 1 l 4 r 1 l.Pickup a passenger going to Crime Lab.'-' is waiting at Writer's Depot.Go to Writer's Depot:n 1 l 3 l.Pickup a passenger going to Crime Lab.Go to Crime Lab:n 1 r 2 r 2 l.Switch to plan "n" if no one is waiting.-1 is waiting at Starchild Numerology.[n]0 is waiting at Starchild Numerology.Go to Starchild Numerology:s 1 r 1 l 1 l 2 l.Pickup a passenger going to Cyclone.Pickup a passenger going to Addition Alley.Go to Cyclone:e 1 l 2 r.[r]Pickup a passenger going to Cyclone.Pickup a passenger going to Addition Alley.Go to Zoom Zoom:n.Go to Addition Alley:w 1 l 1 r.Pickup a passenger going to Addition Alley.Go to Chop Suey:n 1 r 2 r.Switch to plan "f" if no one is waiting.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:n 1 l 3 l 1 l.Go to Cyclone:n 1 l.Switch to plan "r".[f]Go to Addition Alley:n 1 l 2 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:n 1 r 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

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

Ung dung:

1 is waiting at Starchild Numerology.
Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to Chop Suey.
Go to Chop Suey: north 1st right 1st left 4th right 1st left.
Pickup a passenger going to Crime Lab.
'-' is waiting at Writer's Depot.
Go to Writer's Depot: north 1st left 3rd left.
Pickup a passenger going to Crime Lab.
Go to Crime Lab: north 1st right 2nd right 2nd left.
Switch to plan "n" if no one is waiting.
-1 is waiting at Starchild Numerology.
[n]
0 is waiting at Starchild Numerology.
Go to Starchild Numerology: south 1st right 1st left 1st left 2nd left.
Pickup a passenger going to Cyclone.
Pickup a passenger going to Addition Alley.
Go to Cyclone: east 1st left 2nd right.
[r]
Pickup a passenger going to Cyclone.
Pickup a passenger going to Addition Alley.
Go to Zoom Zoom: north.
Go to Addition Alley: west 1st left 1st right.
Pickup a passenger going to Addition Alley.
Go to Chop Suey: north 1st right 2nd right.
Switch to plan "f" if no one is waiting.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park: north 1st left 3rd left 1st left.
Go to Cyclone: north 1st left.
Switch to plan "r".
[f]
Go to Addition Alley: north 1st left 2nd left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: north 1st right 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st left 1st right.

Giải trình:

Pickup the input and split it into individual characters
Pickup the value 1.
If the first character a hyphen, add -1. Otherwise, add 0.
Keep picking up characters and adding 1 until you're out.
Convert the running total to a string and print to stdout.

8
Tôi đã là một người ẩn giấu trong cuộc trao đổi này trong một thời gian dài, nhưng chưa bao giờ thấy một cái gì đó như thế này
Cup of Java

7
Điều này sẽ hết xăng nếu số lượng đủ dài?
Robert Fraser

5
Đây là một brainfuck lớn hơn brainfuck.
Omega

1
@RobertFraser Đó là lý do tại sao chúng tôi dừng lại ở Zoom Zoommỗi vòng lặp plan "r". Tôi chỉ kiểm tra nó tới 100.000 chữ số và nó không bao giờ hết xăng. Tôi đã không tính toán nhưng tôi cho rằng phải mất hơn đủ tiền vé để trả cho lượng gas mà nó đang sử dụng để nó lấp đầy bình trên mỗi vòng.
Kỹ sư Toast

1
@CupofJava OH MY GOSH làm thế nào tôi quên Shakespeare .
Kỹ sư Toast


14

đc, 3

?Zp

Lưu ý rằng thông thường dcyêu cầu số âm được đưa ra _thay vì thông thường hơn -. Tuy nhiên, trong trường hợp này, một trong hai có thể được sử dụng. Nếu -được đưa ra, sau đó dccoi đây là phép trừ trên một ngăn xếp trống, ném dc: stack empty, và sau đó tiếp tục với phần còn lại của số; Do đó, kết quả là không khác nhau.

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

?    # input
 Z   # measure length
  p  # print

Đây không phải chỉ Zlà một chức năng trình? dc'một ngôn ngữ kết hợp với các toán tử quote + dup + eval, do đó nó có thể sử dụng lại các chuỗi mã tùy ý.


5

05AB1E , 2 byte

Äg

Hãy thử trực tuyến! hoặc Thử tất cả các bài kiểm tra!

Ä  # Absolute value
 g # Length

Ä, Huh? Không phải þsao? Đủ công bằng.
Bạch tuộc ma thuật Urn

@carusocomputing Tôi nghĩ đến Äđầu tiên, nhưng þsẽ xử lý một dấu thập phân, vì vậy tôi đoán tốt hơn một chút.
Riley

Thật tuyệt vời khi 2 người nghĩ ra 2 giải pháp 2 byte khác nhau trong vòng 2 phút với nhau, tôi không nghĩ rằng có một phần ba; cố gắng nghĩ về một.
Bạch tuộc ma thuật Urn

5

Alice , 16 byte

//; 'q<)e
o!@i -

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

Giải trình

Tìm một bố cục nửa vời cho việc này là khá khó khăn. Tôi vẫn chưa hài lòng với nó vì không gian, <;, nhưng đây là điều tốt nhất tôi có thể làm bây giờ.

Độ dài chuỗi là một trong những phần tử tích hợp rất phổ biến không tồn tại trong Alice, bởi vì đầu vào của nó là một chuỗi và đầu ra của nó là một số nguyên (và tất cả các lệnh Alice đều là số nguyên cho số nguyên hoặc chuỗi thành chuỗi). Chúng ta có thể đo chiều dài của chuỗi bằng cách ghi nó vào băng ở chế độ Thông thường và sau đó tìm kết thúc của chuỗi ở chế độ Hồng y.

/      Reflect to SE. Switch to Ordinal. While in Ordinal mode, the IP will bounce
       diagonally up and down through the code.
!      Store an implicit empty string on the tape, does nothing.
;      Discard an implicit empty string, does nothing.
i      Read all input as a string.
'-     Push "-".
<      Set the horizontal component of the IP's direction to west, so we're bouncing
       back now.
-      Remove substring. This deletes the minus sign if it exists.
'i     Push "i".
;      Discard it again.
!      Store the input, minus a potential minus sign, on the tape.
/      Reflect to W. Switch to Cardinal. The IP immediately wraps to the
       last column.
e)     Search the tape to the right for a -1, which will be found at the end
       of the string we stored there.
<      Does nothing.
q      Push the tape head's position, which is equal to the string length.
'<sp>  Push " ".
;      Discard it again.
/      Reflect to NW. Switch to Ordinal. The IP immediately bounces off
       the top boundary to move SW instead.
o      Implicitly convert the string length to a string and print it.
       IP bounces off the bottom left corner, moves back NE.
/      Reflect to S. Switch to Cardinal.
!      Store an implicit 0 on the tape, irrelevant.
       The IP wraps back to the first line.
/      Reflect to NE. Switch to Ordinal. The IP immediately bounces off
       the top boundary to move SE instead.
@      Terminate the program.

Tôi cũng đã thử chăm sóc dấu trừ trong chế độ Cardinal với H(giá trị tuyệt đối), nhưng công tắc chế độ bổ sung luôn kết thúc đắt hơn trong các nỗ lực của tôi.


4

PHP, 23 byte

<?=-~log10(abs($argn));

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

Nhật ký cơ sở 10 của giá trị tuyệt đối cộng với một lần chuyển sang int

cho số không vì log10 đầu vào trả lại INFđược hiểu là sai

Cách tốt hơn là thay thế $argnbằng $argn?:1+3 byte

PHP, 27 byte

<?=strlen($argn)-($argn<0);

độ dài chuỗi trừ boolean thấp hơn 0

+2 byte để so sánh chuỗi $argn<"0"

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

PHP, 32 byte

<?=preg_match_all("#\d#",$argn);

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

Regex đếm tất cả các chữ số

35 byte

<?=strlen($argn)-strspn($argn,"-");

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

độ dài chuỗi trừ đi số -

strspn


1
Cái đầu tiên không hoạt động, ví dụ, vì 10, ^có mức độ ưu tiên thấp hơn. Bạn có thể sửa nó với -~.
dùng63956

Tại sao không đơn giản <?=strlen(abs($argn));?
roberto06

@ user63956 Phiên bản có log10 không thể hoạt động trong trường hợp đầu vào bằng 0 nên tôi xóa nó.
Jörg Hülsermann

1
@ JörgHülsermann Tại sao không chỉ $argn?:1? Nó sẽ là 26 byte với log10()abs().
dùng63956

1
@ JörgHülsermann -~$xtương đương với ((int)$x)+1. <?=-~log10(abs($argn?:1));dường như làm việc
dùng63956

4

Fortran 95 (gfortran), 121 96 95 byte

program c
character b
call get_command_argument(1,b,length=i)
print*,i-index(b,'-')
end program

Giải thích:
Trừ chỉ số của dấu '-' từ độ dài của đối số.
Mảng bắt đầu từ 1 trong Fortran và index () trả về 0 nếu không tìm thấy biểu tượng.

Chỉnh sửa: Chuyển sang số nguyên ẩn "i", cũng hợp nhất getter đối số.

Chỉnh sửa: -1 byte nhờ @Tsathoggua


1
Chào mừng đến với PPCG!
Martin Ender

3

PowerShell, 24 byte

"$args"-replace'-'|% Le*

ép giá trị "tuyệt đối" của đầu vào lập luận thành một chuỗi và nhận thuộc tính 'độ dài' của chuỗi.

1 byte ngắn hơn "".Length

cho đến khi ai đó tìm ra cách tốt hơn để có được số abs trong PS thì điều này có thể ngắn như nó sẽ nhận được.


Thế còn "$args".trim('-')|% Le*? :)
bất cứ điều gì


3

Brainfuck , 37 byte

-[+>+[+<]>+]>->,[-<->]<[>+>],[<+>,]<.

Đầu ra là giá trị byte.

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

Giải trình

-[+>+[+<]>+]>->  Constant for 45 (from esolangs wiki)
,                Read a byte of input
[-<->]           Subtract that byte from 45
<[>+>]           If the result is nonzero then increment a cell and move to the right
                 (0 means it was a minus; so not counted)
,[<+>,]          Read a byte and increment the cell to its left until EOF is reached
<.               Print the cell that was being incremented

Có thể thêm chân trang vào liên kết TIO để đưa ra kết quả dưới dạng số không?
Beta Decay

@BetaDecay Đã thêm
Mèo kinh doanh

Thật tuyệt vời, cảm ơn: D
Beta Decay

3

Ruby, 15 11 + 1 = 16 12 byte

Sử dụng -ncờ.

p~/$/-~/\d/

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

Giải trình

                  # -n flag gets one line of input implicitly
p                 # Print
 ~/$/             # Position of end of line (aka string length) in input
     -            # minus
      ~/\d/       # Position of first digit (1 if negative number, 0 otherwise)

1
Phép thuật này là gì?
Chowlett

2
@Chowlett thêm một lời giải thích.
Mực giá trị

2

Thạch , 2 byte

DL

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

Điều này đúng theo những gì được hỏi:

DL - Main link number n         e.g. -45
D  - convert to a decimal list       [-4,-5]
 L - get the length                  2

Đó là một tích hợp thú vị ở đó, có Dhoạt động trên số thập phân không? Sẽ -1.2đầu ra [-1,-0.2]? Đã thử nó bản thân mình, nó không.
Bạch tuộc ma thuật Urn

1
Không hoàn toàn, chuyển đổi cơ sở chỉ đi xuống các đơn vị, ví dụ, 654.321Dsẽ mang lại [6,5,4.321](thực tế [6.0,5.0,4.321000000000026])
Jonathan Allan

[-6.0, -5.0, -4.321000000000026], thực sự, rõ ràng.
Bạch tuộc ma thuật Urn

Ah - yeah vừa chỉnh sửa - số học dấu phẩy động.
Jonathan Allan




2

JavaScript (ES6), 27 26 25 24 byte

Đưa đầu vào dưới dạng một chuỗi.

s=>s.match(/\d/g).length
  • Lưu hai byte nhờ Arnauld.

Tiêu đề của bạn cho biết 23 byte, nhưng mã của bạn là 24 ... Tuy nhiên, đây là 23 byte : s=>`${s>0?s:-s}`.length!
Dom Hastings

Cảm ơn, @DomHastings. Bạn nên đăng câu trả lời của bạn dưới dạng câu trả lời riêng vì đây là cách tiếp cận khác với tôi.
Xù xì


2

Java, 30 24 byte

i->(""+i.abs()).length()

Giả sử ilà a BigInteger. Ngoài ra, loại được ngữ cảnh hóa, do đó không cần nhập, như được hiển thị trong mã kiểm tra.

Kiểm tra

// No imports
class Pcg120897 {
  public static void main(String[] args) {
    java.util.function.ToIntFunction<java.math.BigInteger> f =
        // No full class declaration past here
        i->(""+i.abs()).length()
        // No full class declaration before here
      ;
    System.out.println(f.applyAsInt(new java.math.BigInteger("-1267650600228229401496703205376"))); // -(2^100)
    System.out.println(f.applyAsInt(new java.math.BigInteger("1267650600228229401496703205376"))); // (2^100)
  }
}

Tiết kiệm

  • 30 -> 24 byte: nhờ @cliffroot

+""thay vì .toString()?
vách đá

2
+1 để cung cấp mã mẫu cho biết cách thức này được gọi và để làm rõ loại icâu trả lời của bạn. Tôi nghĩ rằng nhiều câu trả lời lambda nên làm điều này.
Chọc


1

Brain-Flak , 63 byte

([({})]((((()()()()())){}{})){}{})((){[()](<{}>)}{})([{}][]<>)

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

Đây là 62 byte mã và +1 byte cho -acờ.

Tôi đã thử hai cách tiếp cận khác, nhưng tiếc là cả hai đều dài hơn:

([]<({}[((((()()()()())){}{})){}{}]<>)((){[()](<{}>)}{})>)({}[{}])

([]<>)<>({}<>)((((([][]())){}{})){}{}[{}])((){[()](<{}>)}{})([{}]{})

Đây phải là một câu trả lời rất ngắn. Trên thực tế, nếu chúng tôi không phải hỗ trợ số âm, chúng tôi chỉ có thể làm:

([]<>)

Nhưng chúng ta phải so sánh đầu vào đầu tiên với 45 (ASCII -) trước, đây là phần lớn số byte của câu trả lời này.

Một giải pháp số học có thể ngắn hơn.


Tôi đếm 62 byte ..?
hoàn toàn là

1
@totallyhuman xem chỉnh sửa của tôi.
DJMcMayhem

49 byte:([{}]((((()()()()())){}{})){}{})({(<()>)}{}[]<>)
Nitrodon




1

Alice , 10 byte (không cạnh tranh)

 /d/
O@IHc

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

Đây là một giải pháp không cạnh tranh, bởi vì tại thời điểm thử thách này được đăng, lệnh cđã được đưa ra trong trình thông dịch chính thức (và chỉ: D). Martin Ender đã sửa nó trong khi đó, vì vậy điều này hiện đang hoạt động.

Giải trình

Con trỏ lệnh đi qua hai gương ( /) nhiều lần, do đó có thể hơi khó theo dõi. Tôi sẽ cố gắng giải thích rõ ràng nhất có thể, bằng cách sử dụng các hướng hồng y (ví dụ: N lên, SW ở bên trái ...). Tôi sẽ gọi /1gương ngoài cùng bên trái và gương /2ngoài cùng bên phải.

Command    Direction    Comment
               E        Execution starts from the upper-left corner going right
   /1        E → SE     Passing through the mirror changes direction and switches
                        to ordinal mode (string operations)
   I        SE → NE     Push the input string to the stack, then bounce against
                        the bottom of the code
   /2       NE → S      Back to cardinal mode (numeric operations)
   H           S        Pop n, push abs(n). Execution wraps from bottom to top
   /2        S → SE     Ordinal mode again
   c        SE → NW     Pop s, push each char of s separatedly. Bounce against
                        the bottom right corner
   /2       NW → W      Cardinal mode
   d           W        Push the depth of the stack (which is now equal to 
                        the number of characters in abs(input))
   /1     W → NW → SW   Pass through the mirror, then bounce agains the top
   O        SW → NE     Output the result, then bounce on the bottom left corner
   /1       NE → S      Last mirror, I promise
   @           S        Terminate execution

1

GNU Make , 78 byte

Phong cách bắt buộc:

$(eval T=$1)$(foreach D,$(shell seq 9),$(eval T=$(subst $D,? ,$T)))$(words $T)

Kiểu chức năng, 113 byte:

$(eval 2?=$(shell seq 9))$(if $2,$(call $0,$(subst $(word 1,$2),? ,$1),$(wordlist 2,$(words $2),$2)),$(words $1))

Pure Make, 83 byte:

$(eval T=$1)$(foreach D,0 1 2 3 4 5 6 7 8 9,$(eval T=$(subst $D,? ,$T)))$(words $T)

1

C ++, 80 76 byte

#include<string>
int main(int,char**c){printf("%d",strlen(c[1])-(*c[1]<46));}

In độ dài của đối số, trừ 1 nếu ký tự đầu tiên là dấu trừ vì boolđảm bảo chuyển đổi thành 1nếu truehoặc 0nếufalse

  • 4 byte nhờ @Squidy đã chỉ ra tôi có thể sử dụng <46thay vì =='-'và để trì hoãn mảng thay vì[]

Bạn có thể cạo 4 byte bằng cách thay thế c[1][0]=='-'bằng *c[1]<46vì chúng ta có thể giả định đầu vào sẽ luôn là một số nguyên hợp lệ. (Trừ khi các tiền tố khác ngoài '-' được cho phép ...)
Squidy

@Squidy oh wow tìm thấy tốt đẹp! Tôi đã thử thách trí não của mình trong nhiều năm cố gắng rút ngắn điều này và thậm chí không bao giờ nghĩ ra điều đó! Cảm ơn lời đề nghị và đặc biệt là đã đăng ký PCCG để cho tôi biết!
TAS

1

TI-Basic (TI-84 Plus CE, OS 5.2+), 6 byte

length(toString(abs(Ans

TI-Basic là ngôn ngữ được mã hóa; length(toString(là hai byte mỗi.

Ansđược sử dụng làm đầu vào ngầm định; giá trị cuối cùng (duy nhất) của dòng được trả lại hoàn toàn.

Khá đơn giản, lấy giá trị tuyệt đối để thoát khỏi dấu trừ, chuyển đổi thành chuỗi, trả về độ dài của chuỗi.

Một cách tiếp cận toán học 6 byte không hoạt động cho 0:

1+log(abs(Ans

Những máy tính nào có toString(?
kamoroso94

@ kamoroso94 TI-84 Plus CE
pizzapants184

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.