Tôi phải viết bao nhiêu?


35

Viết ra các số là một trong những thế giới lập trình Hello, thường là các số 1-10.

Tôi muốn viết ra nhiều con số! Nhiều, nhiều số. Nhưng tôi phải viết bao nhiêu số?

Bài tập

Đưa ra một đầu vào số nguyên, đưa ra một số làm đầu ra sẽ cho tôi số chữ số sẽ có trong một chuỗi chứa tất cả các số nguyên trong phạm vi từ 0 đến đầu vào, bao gồm. Mã định danh phủ định ("-") được tính là một ký tự đơn.

Ví dụ I / O

Đầu vào: 8
Viết ra: 0,1,2,3,4,5,6,7,8
Đầu ra: 9

Đầu vào: 101
viết ra: 0,1,2,3 ...., 99,100,101
Đầu ra: 196

Đầu vào: 102
viết ra: 0,1,2,3 ....,
đầu ra 100,101,102 : 199

Đầu vào -10
Viết ra: 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10
đầu ra: 22

Đây là một . Số byte thấp nhất sẽ thắng!

Câu trả lời:




11

Röda , 23 byte

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

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

Giải thích:

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


7

Tiện ích Bash + OS X (BSD), 24 22 byte

Cảm ơn @seshoumara vì đã lưu 2 byte.

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

Chạy thử trên 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

Đây là phiên bản GNU:

Bash + coreutils, 40 38 byte

Một lần nữa, 2 byte được lưu nhờ vào @seshoumara.

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

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


@tuskiomi Tôi đã viết coreutils khi tôi muốn nói đến các tiện ích BSD - Tôi đã thử nghiệm nó trong Mac OS X, nơi nó cũng hoạt động trên các đầu vào tiêu cực (seq không giống như GNU seq).
Spector Mitchell

@DigitalTrauma Giải pháp GNU đẹp. Hãy tiếp tục và tự đăng nó nếu bạn muốn; Tôi nghĩ nó quá khác biệt khi được coi là một biến thể của tôi.
Spector Mitchell


Làm thế nào về việc sử dụng fold -1|wc -lđể làm việc đếm? Nó ngắn hơn.
seshoumara

6

Python 2, 83 , 78 64 byte

phiên bản ngắn nhất:

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

phiên bản này đã lưu 5 byte, nhờ @numbermaniac:

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

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

cái này tôi đã tự mình nghĩ ra sau đó (cùng một lượng byte):

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

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


Bạn có thể sử dụng maptrên dòng thứ hai cho 78 byte : print len(''.join(map(str,(range(x+1)if x>0 else range(0,x-1,-1))))). Bạn có thể tiết kiệm nhiều hơn bằng cách biến nó thành lambda.
số

1
@numbermaniac Tôi có thể làm điều gì đó tương tự theo cách này không?
micsthepick

1
@numbermaniac ở đây là tương đương: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)))))cho 71 byte
Felipe Nardi Batista

6

Java 7, 74 byte (đệ quy - bao gồm tham số mặc định thứ hai)

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

Giải thích (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 (vòng lặp - tham số đơn)

Nếu có một tham số thứ hai mặc định như 0đối với phương pháp đệ quy này không được phép vì một số lý do, một vòng lặp for như thế này có thể được sử dụng thay thế:

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

Giải thích (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

Mã kiểm tra:

Hãy thử nó ở đây.

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

Đầu ra:

9   9
196 196
199 199
22  22

1
Tôi thích giải pháp này, :)
tuskiomi

4

RProgN 2 , 5 byte

n0R.L

Giải thích

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

Giải pháp đơn giản, hoạt động như một nét duyên dáng.

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


4

Brachylog , 5 byte

⟦ṡᵐcl

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

Xây dựng phạm vi [0, đầu vào], chuyển đổi từng số thành chuỗi, nối thành một chuỗi và trả về độ dài của kết quả


Tôi nhận thấy TIO có một đối số Z; có chuyện gì thế Nó có nên được tính không?
steenbergh

3
@steenbergh: Trình của Leo là một chức năng, không phải là một chương trình đầy đủ. Đưa ra đối số Zcho trình thông dịch Brachylog bảo nó thêm một trình bao bọc thích hợp để làm cho hàm có thể kiểm tra được. (Nếu bạn chạy nó dưới dạng một chương trình đầy đủ, nó sẽ không tạo ra bất kỳ đầu ra nào.) Chúng tôi cho phép đệ trình chương trình hoặc chức năng ở đây, do đó không nên tính vào số byte, vì nó không thực sự là một phần của đệ trình.

4

PHP, 59 60 byte

Bị ruồng bỏ bởi Roberto06 - https://codegolf.stackexchange.com/a/112536/38505

Cảm ơn roberto06 vì đã nhận thấy phiên bản trước không hoạt động đối với các số âm.

Đơn giản chỉ cần xây dựng một mảng các số, đặt nó thành một chuỗi, sau đó đếm các chữ số (và dấu trừ)

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

Chạy ví dụ: php -f 112504.php 8


Điều này không hoạt động cho đầu vào tiêu cực, xem tại đây
roberto06

Bạn có thể lưu 3 byte bằng cách sử dụng jointhay implodevì vì đó là bí danh.
Mario

không cần phải thoát khỏi -1 Byte. Mặt khác, bạn có thể thay đổi regex của mình thành[--9]
Jörg Hülsermann

4

Haskell , 39 38 byte

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

Hãy thử trực tuyến! Chỉnh sửa: đã lưu 1 byte nhờ @xnor!

Giải trình:

Trong Haskell cho các số ab [a..b]là phạm vi từ ađến btăng 1 hoặc giảm 1, tùy thuộc vào việc bcó lớn hơn không a. Vì vậy, đối với một ndanh sách đầu tiên tích cực [0..n]++[n..0][0,1,2,...,n] và thứ hai trống. Đối với âm n, sản lượng phạm vi thứ hai [0,-1,-2,...,n]và thứ nhất là trống. Tuy nhiên, nếu n=0cả hai phạm vi đều mang lại danh sách [0], do đó việc nối [0,0]sẽ dẫn đến kết quả sai 2. Đó là lý do tại sao0 được xử lý như một trường hợp đặc biệt.

Trình điều khiển =<<trong danh sách giống như concatMapvậy, vì vậy mỗi số được chuyển đổi thành một chuỗi showvà tất cả các chuỗi đó được nối trong một chuỗi dài trong đó chuỗi lengthcuối cùng được trả về.


Trước mẹo của xnor tôi đã sử dụng [0,signum n..n]thay vì [0..n]++[n..0]. signum n-1cho số âm, 0cho zero và 1cho các số dương và một loạt các hình thức [a,b..c]xây dựng danh sách các số từ ađến cvới increment b. Qua đó [0,signum n..n]xây dựng phạm vi [0,1,2,...,n]cho tích cực n[0,-1,-2,...,n]tiêu cực n. Đối với n=0nó sẽ xây dựng danh sách vô hạn[0,0,0,...] nên chúng ta cũng cần xử lý 0như một trường hợp đặc biệt.


Tôi nghĩ [0..n]++[n..0]nên làm cho [0,signum n..n].
xnor

4

PHP, 41 35 byte

Đã lưu 6 byte nhờ user59178

câu trả lời của sai là sai cho đầu vào tiêu cực, tôi đã tự mình lấy nó để xây dựng một giải pháp mới:

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

Chức năng này :

  • Xây dựng một mảng từ 0đến $argv[1](còn gọi là đầu vào)
  • Implodes nó với một ký tự trống (tức là biến nó thành một chuỗi)
  • Tiếng vang chiều dài của chuỗi

Hãy thử nó ở đây!


Đây là một giải pháp tốt hơn cho tôi, idk tại sao tôi nghĩ rằng tôi phải làm điều đó preg_match():(
ʰᵈˑ

Chà, tôi sẽ không nghĩ range()nếu nó không phải là giải pháp của bạn, tôi đoán chúng tôi thậm chí;)
roberto06

1
bạn có thể lưu 3 byte bằng cách sử dụng join()thay vì implode(). đó là một bí danh cho điều tương tự. php.net/manual/en/function.join.php
user59178

1
Và thêm 3 bằng cách bỏ qua tham số 'keo'.
dùng59178

Tôi biết có một bí danh cho implode, nhưng tôi không biết tôi có thể bỏ qua tham số gue. Cảm ơn !
roberto06


4

R, 26 20 byte

sum(nchar(0:scan()))

Cách tiếp cận rất cơ bản:

  • Tạo một vectơ 0: x

  • Đếm các ký tự trong mỗi giá trị (sẽ được tự động ép thành một chuỗi)

  • Tổng

Không chắc chắn nếu có bất kỳ thủ thuật để cắt giảm định nghĩa chức năng? 6 byte được lưu nhờ Giuseppe, bằng cách lấy đầu vào từ stdin thay thế.


sum(nchar(0:scan()))thay vào đó bạn có thể làm và đọc ntừ stdin.
Giuseppe

4

Toán học, 48 47 46 byte

-1 byte nhờ Martin Ender !

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

Hàm ẩn danh, lấy số làm đối số.

Giải pháp ngắn hơn của Greg Martin , 39 byte

1-#~Min~0+Tr@IntegerLength@Range@Abs@#&

1
Bạn có thể sử dụng Sign@#cho #/Abs@#.
Martin Ender

1
Bạn có thể lưu một vài byte với cách tiếp cận hơi khác : 1-#~Min~0+Tr@IntegerLength@Range@Abs@#&. Các 1tài khoản ban đầu cho chữ số 0, trong khi -#~Min~0tài khoản cho tất cả các dấu âm nếu đầu vào là âm.
Greg Martin

3

Mẻ, 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%

Tính toán sum(min(0,abs(n)+1-10^k),k=0..9)+(n<0?1-n:1). (Tôi chỉ phải đi lên 9vì những hạn chế của số học số nguyên của Batch.)



3

MATL , 11 byte

0hSZ}&:VXzn

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

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

3

PowerShell , 23 byte

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

Hãy thử trực tuyến! (sẽ barf trên TIO cho các đầu vào rất lớn (tuyệt đối))

Sử dụng ..toán tử phạm vi để xây dựng một phạm vi từ 0đến đầu vào $args(truyền dưới dạng chuỗi để chuyển đổi từ mảng đầu vào). Đó là -joined với nhau thành một chuỗi (ví dụ, 01234) và sau đó Length được lấy. Đó là còn lại trên đường ống và đầu ra là ẩn.


Giải pháp chính xác tôi có trong đầu khi đọc câu hỏi này
briantist

3

Perl 6 , 18 byte

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

Thử nó

Mở rộng:

{  # 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
}

3

QBIC , 25 byte

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

Giải trình:

:[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$

3

JavaScript, 50 byte

Phối hợp với @ETHproductions

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


3

Võng mạc , 28 byte

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

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

Giải trình

\d+
$*

Chuyển đổi số thành unary, giữ cho dấu hiệu không bị ảnh hưởng.

1
$`1¶

Mỗi 1 được thay thế bởi mọi thứ lên đến chính nó cộng với một dòng mới. Với điều này, chúng tôi nhận được một phạm vi từ 1 đến n nếu n là dương, từ -1 đến n với một bổ sung -khi bắt đầu nếu nó là âm. Tất cả các số là trong unary và tách biệt bởi dòng mới.

1+
$.&

Chuyển đổi từng chuỗi số thành số thập phân tương ứng.

^-?
0

Đặt một 0lúc bắt đầu, thay thế thêm -nếu nó ở đó.

.

Đếm số lượng ký tự (không phải dòng mới).


3

Emacs, 20 byte

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

Bản thân lệnh là 20 tổ hợp phím, nhưng tôi cần làm rõ về cách thức này được tính là byte. Tôi lập luận rằng việc đếm mỗi tổ hợp phím là 1 byte sẽ là công bằng nhất. Lệnh trên được viết thông thường để dễ đọc hơn.

Giải trình

C-x (

Bắt đầu xác định một macro bàn phím.

C-x C-k TAB

Tạo một bộ đếm macro mới. Viết 0vào bộ đệm; giá trị của bộ đếm hiện là 1.

C-x )

Kết thúc định nghĩa macro bàn phím.

M-{input} C-x e

Sau khi nhấn META, nhập số đầu vào của bạn. Sau C-x eđó thực thi macro nhiều lần.

C-x h

Đặt dấu thành bắt đầu bộ đệm (chọn tất cả các văn bản được tạo ra).

M-=

Chạy đếm ký tự trên vùng đã chọn. Số lượng ký tự sẽ được in trong bộ thu nhỏ.

Thí dụ

Lời xin lỗi cho màu sắc nổi bật khủng khiếp. Đây là một ví dụ về việc sử dụng lệnh này với đầu vào 100. Đầu ra nằm trong bộ thu nhỏ ở cuối màn hình.

Ví dụ thực hiện với đầu vào là 100


Đúng, tôi khá chắc chắn một tổ hợp phím là một byte.
NoOneIsHãy

@NoOneIs Có hai suy nghĩ của tôi về điều đó: 1) Ctrl + ký tự có thể được biểu diễn dưới dạng một byte không? Và 2) Tôi thấy rất nhiều câu trả lời ở đây khi đếm các ký tự Unicode là một byte, nhưng chúng không có, vì vậy tôi nghĩ có lẽ CodeGolf có thể có định nghĩa riêng về "byte"? Cảm ơn.
cheryllium

Tôi thực sự không biết. Nhưng bạn có thể hỏi trên Meta .
NoOneIsHãy

3

Lua, 52 byte

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

Lặp lại qua một vòng lặp for từ 0 - đầu vào, chuyển đổi số nguyên ithành chuỗi và thêm độ dài của chuỗi vào ttrước khi int



2

C #, 77 73 byte

-4 byte nhờ @Kevin Cruijssen

Hàm Lambda:

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

Ungolfed và với các trường hợp thử nghiệm:

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

Bạn có thể thay đổi whileđể fortiết kiệm một vài 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 Bạn nói đúng, cảm ơn.
Ông Scapegrace

Bạn có thể có thể sử dụng một bộ đếm int và thêm độ dài bên trong vòng lặp để lưu một số byte. Nếu bạn biên dịch thành một, Func<int, int>bạn có thể gọi các hàm như r=>...để lưu 2 byte (có thể làm điều này bằng mọi cách).
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>


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.