Berapa yang harus saya tulis?

35

Menulis angka adalah salah satu dari dunia pemrograman Hello, seringkali angka 1-10.

Saya ingin menulis banyak angka! Banyak, banyak angka. Tetapi berapa banyak angka yang harus saya tulis?

Tugas

Diberikan input integer, berikan angka sebagai output yang akan memberi saya jumlah digit yang akan berada dalam string yang berisi semua angka integer dalam kisaran dari 0 hingga input, inklusif. Pengidentifikasi negasi ("-") dihitung sebagai satu karakter.

Contoh I / Os

Input: 8
Ditulis: 0,1,2,3,4,5,6,7,8
Output: 9

Input: 101
ditulis: 0,1,2,3 ...., 99,100,101
Output: 196

Input: 102
ditulis: 0,1,2,3 ...., 100,101,102
output: 199

Input -10
Ditulis: 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10
output: 22

Ini adalah . Jumlah byte terendah menang!

tuskiomi
sumber

Jawaban:

23

05AB1E , 3 byte

Kode:

ÝJg

Menggunakan pengkodean CP-1252 . Cobalah online!

Penjelasan:

Ý     # Range [0 .. input]
 J    # Join into one string
  g   # Get the length of the string
Adnan
sumber
13

Python 2 , 55 46 byte

lambda n:len(`range(abs(n)+1)`)+2*~n+3*n*(n<0)

Cobalah online!

Membaik.

Jonathan Allan
sumber
11

Röda , 23 byte

f x{[#([seq(0,x)]&"")]}

Cobalah online!

Dijelaskan:

f x{[#([seq(0,x)]&"")]}
f x{                  } /* Defines function f with parameter x. */
        seq(0,x)        /* Creates a stream of numbers from 0 to x. */
       [        ]       /* Creates an array. */
                 &""    /* Joins with "". */
     #(             )   /* Calculates the length of the resulting string. */
    [                ]  /* Returns the value. */
fergusq
sumber
10

Python 2 , 41 byte

f=lambda n:len(`n`)+(n and f(n+cmp(0,n)))

Cobalah online!

Dennis
sumber
+1: Anda benar-benar tidak dapat mengalahkan solusi rekursif yang dibuat secara cerdas ini dengan Python
micsthepick
7

Utilitas Bash + OS X (BSD), 24 22 byte

Terima kasih kepada @seshoumara karena telah menghemat 2 byte.

seq 0 $1|fold -1|wc -l

Tes berjalan di Mac OS X:

$ for n in 8 101 102 -10 -1 0 1; do printf %6d $n; ./digitcount $n; done
     8       9
   101     196
   102     199
   -10      22
    -1       3
     0       1
     1       2

Ini versi GNU:

Bash + coreutils, 40 38 byte

Sekali lagi, 2 byte disimpan berkat @seshoumara.

(seq $1 0;seq 0 $1)|uniq|fold -1|wc -l

Cobalah online!

Mitchell Spector
sumber
@tuskiomi Saya menulis coreutils ketika saya maksud utilitas BSD - Saya mengujinya di Mac OS X, di mana ia bekerja pada input negatif juga (seq tidak ada yang sama dengan GNU seq).
Mitchell Spector
@DigitalTrauma Solusi GNU yang bagus. Silakan dan kirim sendiri jika Anda ingin; Saya pikir itu terlalu berbeda untuk dihitung sebagai varian saya.
Mitchell Spector
Oke, ini dia :)
Digital Trauma
Bagaimana kalau menggunakan fold -1|wc -luntuk melakukan penghitungan? Itu lebih pendek.
seshoumara
6

Python 2, 83 , 78 64 byte

versi terpendek:

lambda x:sum(map(len,map(str,(range(0,x+cmp(x,.5),cmp(x,.5))))))

versi ini menghemat 5 byte, terima kasih kepada @numbermaniac:

x=input()
print len(''.join(map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))

Cobalah online!

yang ini saya buat sendiri setelah itu (jumlah byte yang sama):

x=input()
print sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))

Cobalah online!

micsthepick
sumber
Anda dapat menggunakan mappada baris kedua untuk 78 byte: print len(''.join(map(str,(range(x+1)if x>0 else range(0,x-1,-1))))). Anda mungkin bisa lebih berhemat dengan menjadikannya lambda.
numbermaniac
1
@numbermaniac, bisakah saya melakukan hal serupa dengan cara ini?
micsthepick
1
@numbermaniac di sini adalah setara:print sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))
micsthepick
lambda x:sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))untuk 71 byte
Felipe Nardi Batista
6

Java 7, 74 byte (rekursif - termasuk parameter default kedua)

int c(int r,int n){r+=(n+"").length();return n>0?c(r,n-1):n<0?c(r,n+1):r;}

Penjelasan (1):

int c(int r, int n){     // Recursive method with two integer parameters and integer return-type
                         // Parameter `r` is the previous result of this recursive method (starting at 0)
  r += (n+"").length();  //  Append the result with the current number's width
  return n > 0 ?         //  If the input is positive
     c(r, n-1)           //   Continue recursive method with n-1
    : n < 0 ?            //  Else if the input is negative
     c(r, n+1)           //   Continue recursive method with n+1
    ?                    //  Else (input is zero)
     r;                  //   Return the result
}                        // End of method

Java 7, 81 79 byte (loop - parameter tunggal)

Jika memiliki parameter kedua default 0untuk pendekatan rekursif ini tidak diizinkan karena beberapa alasan, untuk-loop seperti ini dapat digunakan sebagai gantinya:

int d(int n){String r="x";for(int i=n;i!=0;i+=n<0?1:-1)r+=i;return r.length();}

Penjelasan (2)

int d(int n){                 // Method with integer parameter and integer return-type
  String r = "x";             //  Initial String (with length 1 so we won't have to +1 in the end)
  for(int i=n; i != 0;        //  Loop as long as the current number isn't 0
      i += n < 0 ? 1 : 1)     //   After every iteration of the loop: go to next number
    r += i;                   //   Append String with current number
                              //  End of loop (implicit / single-line body)
  return r.length();          //  Return the length of the String
}                             // End of method

Kode uji:

Coba di sini.

class M{
  static int c(int r,int n){r+=(n+"").length();return n>0?c(r,n-1):n<0?c(r,n+1):r;}

  static int d(int n){String r="x";for(int i=n;i!=0;i+=n<0?1:-1)r+=i;return r.length();}

  public static void main(String[] a){
    System.out.println(c(0, 8) + "\t" + d(8));
    System.out.println(c(0, 101) + "\t" + d(101));
    System.out.println(c(0, 102) + "\t" + d(102));
    System.out.println(c(0, -10) + "\t" + d(-10));
  }
}

Keluaran:

9   9
196 196
199 199
22  22
Kevin Cruijssen
sumber
1
Saya suka solusi ini, :)
tuskiomi
4

RProgN 2 , 5 byte

n0R.L

Penjelasan

n0R   # A Stack of all numbers between 0 and the input converted to a number.
   .L # The length of the stringification of this.

Solusi sederhana, bekerja seperti pesona.

Cobalah online!

ATaco
sumber
4

Brachylog , 5 byte

⟦ṡᵐcl

Cobalah online!

Buat rentang [0, masukan], ubah setiap angka menjadi string, gabungkan menjadi satu string dan kembalikan panjang hasilnya

Leo
sumber
Saya perhatikan TIO punya argumen Z; Ada apa dengan itu? Haruskah itu masuk hitungan?
steenbergh
3
@steenbergh: Pengajuan Leo adalah fungsi, bukan program lengkap. Memberikan argumen Zkepada juru bahasa Brachylog menyuruhnya untuk menambahkan pembungkus yang sesuai untuk membuat fungsi dapat diuji. (Jika Anda menjalankannya sebagai program lengkap, itu tidak akan menghasilkan output apa pun.) Kami mengizinkan pengiriman program atau fungsi di sini, sehingga tidak boleh dihitung terhadap jumlah byte, karena itu sebenarnya bukan bagian dari pengiriman.
4

PHP, 59 60 byte

Diungguli oleh Roberto06 - https://codegolf.stackexchange.com/a/112536/38505

Terima kasih kepada roberto06 karena memperhatikan versi sebelumnya tidak berfungsi untuk angka negatif.

Cukup susun array angka, masukkan ke string, lalu hitung digit (dan tanda minus)

<?=preg_match_all("/\-|\d/",implode(",",range(0,$argv[1])));

Jalankan contoh: php -f 112504.php 8

ʰᵈˑ
sumber
Ini tidak berfungsi untuk input negatif, lihat di sini
roberto06
Anda bisa menghemat 3 byte menggunakan joinbukan implodekarena itu adalah alias.
Mario
tidak perlu keluar dari minus -1 Byte. Di sisi lain Anda dapat mengubah regex Anda menjadi[--9]
Jörg Hülsermann
4

Haskell , 39 38 byte

f 0=1
f n=length$show=<<[0..n]++[n..0]

Cobalah online! Sunting: disimpan 1 byte berkat @xnor!

Penjelasan:

Di Haskell untuk angka adan b [a..b]rentang dari ahingga bdalam 1-kenaikan atau 1-pengurangan, tergantung pada apakah blebih besar a. Jadi untuk yang positif ndaftar pertama [0..n]++[n..0]adalah [0,1,2,...,n]dan yang kedua kosong. Untuk negatif nrentang hasil kedua [0,-1,-2,...,n]dan yang pertama kosong. Namun jika n=0kedua rentang menghasilkan daftar [0], maka rangkaian [0,0]akan menghasilkan hasil yang salah 2. Itu sebabnya 0ditangani sebagai kasus khusus.

The =<<-operator pada daftar adalah sama concatMap, sehingga setiap nomor diubah menjadi string dengan showdan semua string yang akan digabungkan dalam satu string panjang yang lengthakhirnya dikembalikan.


Sebelum tip xnor saya gunakan [0,signum n..n]bukan [0..n]++[n..0]. signum nadalah -1untuk angka negatif, 0untuk nol dan 1untuk angka positif dan berbagai bentuk [a,b..c]membangun daftar angka dari asampai cdengan kenaikan b. Dengan demikian [0,signum n..n]membangun rentang [0,1,2,...,n]untuk positif ndan [0,-1,-2,...,n]negatif n. Untuk n=0itu akan membangun daftar tak terbatas [0,0,0,...]sehingga kita perlu menangani 0sebagai kasus khusus juga.

Laikoni
sumber
Saya pikir [0..n]++[n..0]harus lakukan untuk [0,signum n..n].
xnor
4

PHP, 41 35 byte

Disimpan 6 byte berkat pengguna59178

Karena jawaban ʰᵈ salah untuk input negatif, saya mengambilnya sendiri untuk membangun solusi baru:

<?=strlen(join(range(0,$argv[1])));

Fungsi ini:

  • Membangun array dari 0ke $argv[1](alias input)
  • Mengimpodnya dengan karakter kosong (mis. Mentransformasikannya menjadi string)
  • Menggemakan panjang tali

Coba di sini!

roberto06
sumber
Ini adalah solusi yang lebih baik untuk saya, idk mengapa saya pikir saya harus melakukan itu preg_match():(
ʰᵈˑ
Yah, saya tidak akan berpikir range()jika itu bukan solusi Anda, saya kira kita genap;)
roberto06
1
Anda dapat menyimpan 3 byte dengan menggunakan join()alih-alih implode(). ini adalah alias untuk hal yang sama. php.net/manual/en/function.join.php
user59178
1
Dan 3 lagi dengan menghilangkan parameter 'lem'.
user59178
Saya tahu ada alias untuk implode, tapi saya tidak tahu saya bisa menghilangkan parameter gue. Terima kasih!
roberto06
4

Ruby , 20 26 29 byte

->x{[*x..-1,0,*1..x]*''=~/$/}

Cobalah online!

GB
sumber
Kenapa meningkat?
Brian Minton
Versi pertama tidak berfungsi untuk angka negatif, versi kedua memiliki masalah dengan nol sebagai input.
GB
4

R, 26 20 byte

sum(nchar(0:scan()))

Pendekatan yang sangat mendasar:

  • Buat vektor 0: x

  • Hitung karakter di setiap nilai (akan dipaksa ke string secara otomatis)

  • Jumlah

Tidak yakin apakah ada trik untuk mengurangi definisi fungsi? 6 byte disimpan berkat Giuseppe, dengan mengambil input dari stdin sebagai gantinya.

pengguna2390246
sumber
Anda bisa melakukannya sum(nchar(0:scan()))sebagai gantinya dan membaca ndari stdin sebagai gantinya.
Giuseppe
4

Mathematica, 48 47 46 byte

-1 byte terima kasih kepada Martin Ender !

StringLength[""<>ToString/@Range[0,#,Sign@#]]&

Fungsi anonim, mengambil nomor sebagai argumen.

Solusi lebih pendek oleh Greg Martin , 39 byte

1-#~Min~0+Tr@IntegerLength@Range@Abs@#&
numbermaniac
sumber
1
Anda dapat menggunakan Sign@#untuk #/Abs@#.
Martin Ender
1
Anda dapat menyimpan beberapa byte dengan pendekatan yang sedikit berbeda: 1-#~Min~0+Tr@IntegerLength@Range@Abs@#&. 1Akun awal untuk digit 0, sedangkan -#~Min~0akun untuk semua tanda negatif jika input negatif.
Greg Martin
3

Batch, 110 byte

@set/a"n=%1,t=n>>31,n*=t|1,t=1-t*n,i=0
@for /l %%i in (0,1,9)do @set/a"t+=(i-n)*(i-n>>31),i=i*10+9
@echo %t%

Menghitung sum(min(0,abs(n)+1-10^k),k=0..9)+(n<0?1-n:1). (Saya hanya perlu naik 9karena keterbatasan aritmatika integer Batch.)

Neil
sumber
3

Python 2 , 68 byte

def f(i,j=1):
 if i==0:print j
 else:j+=len(`i`);f((i-1,i+1)[i<0],j)

Cobalah online!

Lebih lama tetapi berbeda dari solusi Python lainnya. Mendefinisikan fungsi rekursif yang disebut sebagai egf(10)

ElPedro
sumber
3

MATL , 11 byte

0hSZ}&:VXzn

Cobalah online!

0h           % Implicitly input n. Append a 0: gives array [n 0]
  S          % Sort
   Z}        % Split array: pushes 0, n or n, 0 according to the previous sorting
     &:      % Binary range: from 0 to n or from n to 0
       V     % Convert to string. Inserts spaces between numbers
        Xz   % Remove spaces
          n  % Length of string. Implicit display
Luis Mendo
sumber
3

PowerShell , 23 byte

-join(0.."$args")|% Le*

Cobalah online! (akan muntah di TIO untuk input sangat besar (absolut))

Menggunakan ..operator jangkauan untuk membangun rentang dari 0ke input $args(ditampilkan sebagai string untuk mengkonversi dari array input). Itu -joined bersama menjadi string (misalnya, 01234) dan kemudian Length diambil darinya. Yang tersisa pada pipa dan output tersirat.

AdmBorkBork
sumber
Solusi tepat yang ada di kepala saya ketika saya membaca pertanyaan ini 😝
briantist
3

Perl 6 , 18 byte

{chars [~] 0...$_}

Cobalah

Diperluas:

{  # bare block lambda with implicit parameter 「$_」

  chars        # how many characters (digits + '-')
    [~]        # reduce using string concatenation operator &infix:<~>
      0 ... $_ # deductive sequence from 0 to the input
}
Brad Gilbert b2gills
sumber
3

QBIC , 25 byte

:[0,a,sgn(a)|A=A+!b$]?_lA

Penjelasan:

:[0,a     Read 'a' from the cmd line, start a FOR loop from 0 to 'a'
,sgn(a)|  with incrementer set to -1 for negative ranges and 1 for positive ones
A=A+!b$   Add a string cast of each iteration (var 'b') to A$
]         NEXT
?_lA      Print the length of A$
steenbergh
sumber
3

JavaScript, 50 byte

Berkolaborasi dengan @ETHproductions

n=>{for(t="";n;n<0?n++:n--)t+=n;alert(++t.length)}
Oliver
sumber
3

Retina , 28 byte

\d+
$*
1
$`1¶
1+
$.&
^-?
0
.

Cobalah online!

Penjelasan

\d+
$*

Ubah nomornya menjadi unary, pertahankan tanda itu tidak tersentuh.

1
$`1¶

Setiap 1 diganti oleh semuanya hingga dirinya sendiri ditambah baris baru. Dengan ini kita mendapatkan rentang dari 1 ke n jika n positif, dari -1 ke n dengan tambahan -di awal jika negatif. Semua angka dalam unary dan dipisahkan oleh baris baru.

1+
$.&

Ubah setiap urutan yang menjadi angka desimal yang sesuai.

^-?
0

Letakkan 0di awal, ganti ekstra -jika ada.

.

Hitung jumlah karakter (non-baris baru).

Leo
sumber
3

Emacs, 20 byte

C-x ( C-x C-k TAB C-x ) M-{input} C-x e C-x h M-=

Perintah itu sendiri adalah 20 penekanan tombol, tetapi saya perlu klarifikasi tentang bagaimana ini harus dihitung sebagai byte. Saya beralasan bahwa menghitung setiap keystroke sebagai 1 byte akan menjadi yang paling adil. Perintah di atas ditulis secara konvensional agar lebih mudah dibaca.

Penjelasan

C-x (

Mulailah mendefinisikan makro keyboard.

C-x C-k TAB

Buat penghitung makro baru. Menulis 0ke buffer; nilai penghitung sekarang 1.

C-x )

Akhiri definisi makro keyboard.

M-{input} C-x e

Setelah menekan META, ketikkan nomor input Anda. The C-x ekemudian mengeksekusi makro yang berkali-kali.

C-x h

Setel tanda ke awal buffer (yang memilih semua teks yang dihasilkan).

M-=

Jalankan penghitungan karakter pada wilayah yang dipilih. Jumlah karakter akan dicetak dalam minibuffer.

Contoh

Permintaan maaf untuk warna highlight yang mengerikan. Ini adalah contoh dari menggunakan perintah ini dengan input 100. Outputnya ada di minibuffer di bagian bawah layar.

Contoh eksekusi dengan input 100

ceri
sumber
Yap, saya cukup yakin satu keystroke adalah satu byte.
NoOneIsHere
@NoOneIsHere Ada dua pemikiran saya tentang hal itu: 1) Dapatkah karakter Ctrl + direpresentasikan sebagai byte tunggal? Dan 2) Saya melihat banyak jawaban di sini menghitung karakter Unicode sebagai satu byte, tetapi tidak, jadi saya pikir mungkin CodeGolf mungkin memiliki definisi "byte" sendiri? Terima kasih.
cheryllium
Saya benar-benar tidak tahu. Tapi Anda bisa bertanya di Meta .
NoOneIsHere
3

Lua, 52 byte

t=0;for i=0,io.read()do t=t+#tostring(i)end;print(t)

Iterate melalui for for dari 0-input, ubah integer imenjadi string dan tambahkan panjang string tsebelum mencetakt

Josh
sumber
2

C #, 77 73 byte

-4 byte terima kasih kepada @Kevin Cruijssen

Fungsi lambda:

(r)=>{var l="";for(int i=0,s=r<0?-1:1;i!=r+s;i+=s)l+=i;return l.Length;};

Tidak disatukan dan dengan kasus uji:

class P
{
    delegate int numbers(int e);
    static void Main()
    {
        numbers n = (r) =>
        {
            var l = ""; 
            for (int i = 0, s = r < 0 ? -1 : 1; i != r + s; i += s)
                l += i; 
            return l.Length;
        };
        System.Console.WriteLine(n(8));
        System.Console.WriteLine(n(101));
        System.Console.WriteLine(n(102));
        System.Console.WriteLine(n(-10));
        System.Console.ReadKey();
    }
}
Tuan Scapegrace
sumber
Anda dapat mengubah whileto foruntuk menyimpan beberapa byte: (r)=>{var l="";for(int i=0,s=r<0?-1:1;i!=r+s;i+=s)l+=i;return l.Length;};( 73 byte )
Kevin Cruijssen
@Kevin Cruijssen Anda benar, terima kasih.
Tuan Scapegrace
Anda mungkin dapat menggunakan penghitung int dan menambahkan panjang di dalam loop untuk menyimpan beberapa byte. Jika Anda mengkompilasi ke Func<int, int>Anda dapat memanggil fungsi ingin r=>...menyimpan 2 byte (mungkin bisa melakukan ini pula).
TheLethalCoder
2

JavaScript, 44 byte

f=(n,i=1)=>n<0?f(-n)-n:n<i?1:n+1-i+f(n,i*10)
<input type=number oninput=o.textContent=f(+this.value)><pre id=o>

Neil
sumber
2

REXX, 56 byte

arg n
l=0
do i=0 to n by sign(n)
  l=l+length(i)
  end
say l
idrougge
sumber