Berapa lama nomor saya?


26

Tantangan

Diberikan bilangan bulat, Qdalam kisaran -(2^100) ≤ Q ≤ 2^100, output jumlah digit dalam angka itu (di basis 10).

Aturan

Ya, Anda dapat mengambil nomor sebagai string dan menemukan panjangnya.

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 memiliki titik desimal.

Nol dapat memiliki satu atau nol digit.

Asumsikan input akan selalu berupa bilangan bulat yang valid.

Contohnya

Input > Output

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

Kemenangan

Kode terpendek dalam byte menang.

Jawaban:


10

Brachylog , 1 byte

l

Cobalah online!

Solusi bawaan lain, tetapi yang ini memiliki nama terpendek (kecuali seseorang menemukan bahasa yang melakukan tugas ini dalam nol byte). Ini harus berfungsi baik di Brachylog 1 dan Brachylog 2.

Ini adalah pengiriman fungsi (tautan TIO berisi argumen baris perintah yang menyebabkan penerjemah menjalankan fungsi individual daripada keseluruhan program), sebagian karena kalau tidak kita harus menghabiskan byte pada output, sebagian karena sintaks Brachylog untuk negatif angka agak tidak biasa dan membuat program ini suatu fungsi menyelesaikan setiap argumen potensial tentang sintaks input.

Seringkali saya merasa terganggu karena sebagian besar Brin bawaan Brachylog memperlakukan angka negatif seperti angka positif, tetapi fakta itu akhirnya berguna di sini. Saya kira ada pengorbanan yang terlibat dengan setiap bahasa golf.


Di sinilah saya berhenti menggulir ... ini keterlaluan!
Bogdan Alexandru

39

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

Cobalah online!

Tidak Disatukan:

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.

Penjelasan:

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
Saya telah menjadi lurker dalam pertukaran ini untuk waktu yang lama, tetapi belum pernah melihat sesuatu seperti ini
Piala Jawa

7
Apakah ini akan kehabisan bensin jika jumlahnya cukup lama?
Robert Fraser

5
Ini adalah brainfuck yang lebih besar daripada brainfuck.
Omega

1
@RobertFraser Itulah sebabnya kami berhenti Zoom Zoomdi setiap lingkaran plan "r". Saya baru mengujinya hingga 100.000 digit dan tidak pernah kehabisan bensin. Saya tidak menghitungnya tetapi saya kira dibutuhkan lebih dari cukup ongkos untuk membayar gas yang digunakannya sehingga mengisi tangki di setiap putaran.
Engineer Toast

1
@CupofJava OH MY GOSH bagaimana saya bisa melupakan Shakespeare .
Engineer Toast


14

dc, 3

?Zp

Perhatikan bahwa biasanya dcmembutuhkan angka negatif untuk diberikan _daripada yang lebih biasa -. Namun, dalam hal ini, keduanya dapat digunakan. Jika -diberikan, maka dcperlakukan ini sebagai pengurangan pada tumpukan kosong, lempar dc: stack empty, dan kemudian lanjutkan dengan sisa nomor; Dengan demikian hasilnya tidak berbeda.

Cobalah online .

?    # input
 Z   # measure length
  p  # print

Tidak bisakah ini hanya Zsebagai pengiriman fungsi? dcIni adalah bahasa concatenative dengan kutipan + dup + operator eval, karena itu dapat menggunakan kembali string kode sewenang-wenang.


5

05AB1E , 2 byte

Äg

Cobalah online! atau Coba Semua Tes!

Ä  # Absolute value
 g # Length

Äya Bukan þ? Cukup adil.
Magic Gurita Guci

@caruscomputing saya pikir Ädulu, tetapi þakan menangani titik desimal, jadi saya kira sedikit lebih baik.
Riley

Hanya keren bagaimana 2 orang datang dengan 2 solusi 2 byte yang berbeda dalam waktu 2 menit satu sama lain, saya tidak berpikir ada yang ketiga sekalipun; mencoba memikirkan satu.
Magic Gurita Guci

5

Alice , 16 byte

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

Cobalah online!

Penjelasan

Menemukan tata letak setengah layak untuk ini cukup sulit. Saya masih tidak terlalu senang dengan itu karena ruang, <dan ;, tetapi ini adalah yang terbaik yang bisa saya lakukan untuk saat ini.

Panjang string adalah salah satu dari built-in yang sangat umum yang tidak ada di Alice, karena inputnya adalah string dan outputnya adalah integer (dan semua perintah Alice adalah integer ketat ke integer atau string ke string). Kita dapat mengukur panjang string dengan menuliskannya ke kaset dalam mode Ordinal dan kemudian menemukan akhir dalam mode Cardinal.

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

Saya juga mencoba mengurus tanda minus dalam mode Kardinal dengan H(nilai absolut), tetapi sakelar mode tambahan selalu berakhir dengan lebih mahal dalam upaya saya.


4

PHP, 23 Bytes

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

Cobalah online!

log basis 10 dari nilai absolut ditambah satu pemeran ke int

untuk nol sebagai input input10 memberikan kembali INFyang ditafsirkan sebagai salah

Cara yang lebih baik adalah mengganti $argndengan $argn?:1+3 Bytes

PHP, 27 Bytes

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

panjang string dikurangi boolean lebih rendah dari nol

+2 Bytes untuk perbandingan string $argn<"0"

Cobalah online!

PHP, 32 Bytes

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

Cobalah online!

Regex menghitung semua digit

35 Bytes

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

Cobalah online!

panjang string dikurangi hitungan -

strspn


1
Yang pertama tidak berfungsi, misalnya, untuk 10, karena ^memiliki prioritas lebih rendah. Anda dapat memperbaikinya dengan -~.
user63956

Kenapa tidak sederhana saja <?=strlen(abs($argn));?
roberto06

@ user63956 Versi dengan log10 tidak dapat berfungsi jika input nol jadi saya menghapusnya.
Jörg Hülsermann

1
@ JörgHülsermann Mengapa tidak adil $argn?:1? Itu akan menjadi 26 byte dengan log10()dan abs().
user63956

1
@ JörgHülsermann -~$xsetara dengan ((int)$x)+1. <?=-~log10(abs($argn?:1));sepertinya berhasil.
user63956

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

Penjelasan:
Kurangi indeks tanda '-' dari panjang argumen.
Array mulai dari 1 di Fortran, dan index () mengembalikan 0 jika simbol tidak ditemukan.

Sunting: Beralih ke integer implisit "i", juga pengambil argumen terkonsolidasi.

Sunting: -1 byte berkat @Tsathoggua


1
Selamat datang di PPCG!
Martin Ender

3

PowerShell, 24 Bytes

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

melemparkan nilai "absolut" input input ke string dan mendapatkan properti 'panjang' dari itu.

1 byte lebih pendek dari "".Length

sampai seseorang menemukan cara yang lebih baik untuk mendapatkan abs dari angka di PS ini mungkin sependek yang akan didapat.


Bagaimana dengan "$args".trim('-')|% Le*? :)
apapun


3

brainfuck , 37 byte

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

Output adalah dengan nilai byte.

Cobalah online!

Penjelasan

-[+>+[+<]>+]>->  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

Apakah mungkin untuk menambahkan catatan kaki ke tautan TIO yang menampilkan hasilnya sebagai angka?
Beta Decay

@BetaDecay Added
Business Cat

Itu brilian, terima kasih: D
Beta Decay

3

Ruby, 15 11 + 1 = 16 12 byte

Menggunakan -nbendera.

p~/$/-~/\d/

Cobalah online!

Penjelasan

                  # -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
Sihir apa ini?
Chowlett

2
@ Chowlett menambahkan penjelasan.
Value Ink

2

Jelly , 2 byte

DL

Cobalah online!

Ini benar-benar melakukan apa yang diminta:

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

Itu built-in yang menarik di sana, apakah Dbekerja pada desimal? Akankah -1.2output [-1,-0.2]? Mencobanya sendiri, tidak.
Magic Gurita Guci

1
Tidak cukup, konversi basis hanya turun ke unit jadi, misalnya, 654.321Dakan menghasilkan [6,5,4.321](sebenarnya sebenarnya [6.0,5.0,4.321000000000026])
Jonathan Allan

[-6.0, -5.0, -4.321000000000026], sebenarnya, rupanya.
Magic Octopus Mm

Ah - ya baru diedit - aritmatika floating point.
Jonathan Allan


2

Japt , 5 byte

a s l

Cobalah online!

Penjelasan

 a s l
Ua s l
Ua     # take the absolute value of the input
   s   # and turn it into a string
     l # and return its length


2

JavaScript (ES6), 27 26 25 24 byte

Mengambil input sebagai string.

s=>s.match(/\d/g).length
  • Disimpan dua byte berkat Arnauld.

Judul Anda mengatakan 23 byte, tapi kode Anda adalah 24 ... Namun, ini adalah 23 bytes: s=>`${s>0?s:-s}`.length!
Dom Hastings

Terima kasih, @HomHastings. Anda harus memposting jawaban Anda sebagai jawaban terpisah karena ini pendekatan yang berbeda dengan saya.
Shaggy


2

Java, 30 24 byte

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

Asumsinya iadalah a BigInteger. Juga, jenisnya dikontekstualisasikan, jadi tidak diperlukan impor, seperti yang ditunjukkan dalam kode pengujian.

Uji

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

Menghemat

  • 30 -> 24 byte: terima kasih kepada @cliffroot

+""bukan .toString()?
cliffroot

2
+1 untuk memberikan kode sampel yang menunjukkan bagaimana ini diterapkan dan untuk mengklarifikasi jenis ijawaban Anda. Saya pikir lebih banyak jawaban lambda harus melakukan ini.
Poke


1

Brain-Flak , 63 byte

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

Cobalah online!

Ini adalah 62 byte kode dan +1 byte untuk -aflag.

Saya mencoba dua pendekatan lain, tetapi sayangnya keduanya lebih panjang:

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

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

Ini harus menjadi jawaban yang sangat singkat. Bahkan, jika kita tidak harus mendukung angka negatif, kita bisa melakukan:

([]<>)

Tetapi kita harus membandingkan input pertama dengan 45 (ASCII -) terlebih dahulu, yang merupakan jumlah byte paling banyak dari jawaban ini.

Solusi aritmatika mungkin lebih pendek.


Saya menghitung 62 byte ..?
manusiawi

1
@ sebenarnya manusia melihat hasil edit saya.
DJMcMayhem

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




1

Alice , 10 byte (tidak bersaing)

 /d/
O@IHc

Cobalah online!

Ini adalah solusi yang tidak bersaing, karena pada saat tantangan ini diposting, perintahnya cdisadap oleh penerjemah resmi (dan hanya: D). Sementara itu Martin Ender memperbaikinya, jadi ini sekarang berfungsi.

Penjelasan

Penunjuk instruksi melewati dua mirror ( /) beberapa kali, jadi mungkin agak sulit untuk diikuti. Saya akan mencoba menjelaskannya sejelas mungkin, menggunakan arah mata angin (mis. N naik, SW turun ke kiri ...). Saya akan memanggil /1cermin paling kiri, dan /2yang paling kanan.

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

Gaya imperatif:

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

Gaya fungsional, 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));}

Mencetak panjang argumen, minus 1 jika karakter pertama adalah minus karena boolmenjamin konversi ke 1jika trueatau 0jikafalse

  • 4 byte terima kasih kepada @Squidy untuk menunjukkan bahwa saya dapat menggunakan, <46bukan =='-', dan untuk menghormati array bukan[]

Anda bisa mencukur 4 byte dengan mengganti c[1][0]=='-'dengan *c[1]<46karena kita dapat mengasumsikan input akan selalu menjadi bilangan bulat yang valid. (Kecuali jika awalan selain '-' diizinkan ...)
Squidy

@Squidy oh wow temukan bagus! Aku memutar otak selama berabad-abad mencoba untuk mempersingkat ini dan bahkan tidak pernah datang dengan itu! Terima kasih atas sarannya, dan terutama karena mendaftar ke PCCG untuk memberi tahu saya!
Tas

1

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

length(toString(abs(Ans

TI-Basic adalah bahasa tokenized; length(dan toString(masing-masing dua byte.

Ansdigunakan sebagai input implisit; nilai baris terakhir (hanya) dikembalikan secara implisit.

Cukup sederhana, mengambil nilai absolut untuk menghilangkan tanda minus, mengubahnya menjadi string, mengembalikan panjang string.

Pendekatan matematika 6-byte yang tidak bekerja untuk 0:

1+log(abs(Ans

Kalkulator mana yang dimiliki toString(?
kamoroso94

@ kamoroso94 TI-84 Plus CE
pizzapants184

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.