얼마를 써야합니까?


35

숫자를 쓰는 것은 Hello의 프로그래밍 세계 중 하나이며, 종종 숫자 1-10입니다.

많은 숫자를 쓰고 싶습니다! 많은 숫자. 그러나 몇 개의 숫자를 써야합니까?

태스크

정수 입력이 주어지면 0에서 입력까지 범위의 모든 정수를 포함하는 문자열의 자릿수를 제공하는 숫자를 출력으로 지정하십시오. 부정 식별자 ( "-")는 단일 문자로 계산됩니다.

예제 I / O

입력 : 8
기록 : 0,1,2,3,4,5,6,7,8
출력 : 9

입력 : 101
쓰기 : 0,1,2,3 ...., 99,100,101
출력 : 196

입력 : 102
기록 : 0,1,2,3 ...., 100,101,102
출력 : 199

입력 -10
기록 : 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10
출력 : 22

이것은 입니다. 가장 적은 바이트 수가 이깁니다!

답변:




11

Röda , 23 바이트

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

온라인으로 사용해보십시오!

설명 :

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

Bash + OS X (BSD) 유틸리티, 24 22 바이트

2 바이트를 절약 한 @seshoumara에게 감사합니다.

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

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

GNU 버전은 다음과 같습니다.

Bash + coreutils, 40 38 바이트

@seshoumara 덕분에 다시 2 바이트가 절약되었습니다.

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

온라인으로 사용해보십시오!


@tuskiomi 필자는 BSD 유틸리티를 의미 할 때 coreutils를 작성했습니다. Mac OS X에서 테스트했는데, 음의 입력에서도 작동합니다 (GNU seq와 동일하지 않은 것으로 가정).
Mitchell Spector

@DigitalTrauma 멋진 GNU 솔루션. 원할 경우 직접 게시하십시오. 내 변형으로 간주하기에는 너무 다르다고 생각합니다.
Mitchell Spector 2018 년


fold -1|wc -l계산 에 사용 하는 것은 어떻습니까? 더 짧습니다.
seshoumara

6

파이썬 2, 83 , 78 64 바이트

최단 버전 :

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

이 버전은 @numbermaniac 덕분에 5 바이트를 절약했습니다.

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

온라인으로 사용해보십시오!

이 후 나는 자체적으로 (같은 양의 바이트)를 생각해 냈습니다.

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

온라인으로 사용해보십시오!


map두 번째 줄에서 78 바이트를 사용할 수 있습니다 print len(''.join(map(str,(range(x+1)if x>0 else range(0,x-1,-1))))). 람다로 만들어 더 많은 비용을 절약 할 수 있습니다 .
numbermaniac

1
@numbermaniac 이런 식으로 비슷한 것을 할 수 있습니까?
micsthepick

1
@numbermaniac는 다음과 같습니다.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)))))71 바이트
펠리페 나르디 바티스타

6

Java 7, 74 바이트 (재귀-두 번째 기본 매개 변수 포함)

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

설명 (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 바이트 (루프-단일 매개 변수)

0이 재귀 적 접근 방식에 대한 기본 두 번째 매개 변수 가 어떤 이유로 허용되지 않는 경우 다음과 같은 for-loop를 대신 사용할 수 있습니다.

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

설명 (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

테스트 코드 :

여기에서 시도하십시오.

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

산출:

9   9
196 196
199 199
22  22

1
나는이 솔루션을 좋아한다 :)
tuskiomi


4

Brachylog , 5 바이트

⟦ṡᵐcl

온라인으로 사용해보십시오!

[0, input] 범위를 구성하고, 각 숫자를 문자열로 변환하고, 단일 문자열로 연결하고 결과의 길이를 반환합니다


나는 TIO가 논쟁을하는 것을 보았습니다 Z. 무슨 일이야? 카운트해야합니까?
steenbergh

3
@steenbergh : Leo의 제출은 전체 프로그램이 아닌 기능입니다. ZBrachylog 인터프리터에 인수 를 제공하면 함수를 테스트 할 수 있도록 적절한 랩퍼를 추가하도록 지시합니다. (전체 프로그램으로 실행 한 경우 출력이 생성되지 않습니다.) 여기서는 프로그램 또는 함수 제출을 허용하므로 실제로 제출의 일부가 아니므로 바이트 수에 대해 계산하지 않아야합니다.

4

PHP, 59 60 바이트

Roberto06에 의해 Outgolfed - https://codegolf.stackexchange.com/a/112536/38505

이전 버전이 음수에 대해 작동하지 않았다는 roberto06 덕분에 .

단순히 숫자의 배열을 만들고 문자열에 넣은 다음 숫자 (및 빼기 기호)를 계산합니다.

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

예제를 실행하십시오. php -f 112504.php 8


음의 입력에는 작동하지 않습니다. 여기를 참조하십시오
roberto06

별명이므로 join대신 3 바이트를 사용할 수 implode있습니다.
Mario

빼기 -1 바이트를 이스케이프 할 필요가 없습니다. 반면에 정규식을 다음과 같이 변경할 수 있습니다.[--9]
Jörg Hülsermann

4

하스켈 , 39 38 바이트

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

온라인으로 사용해보십시오! 편집 : @xnor 덕분에 1 바이트를 절약했습니다!

설명:

숫자 하스켈 ab [a..b]의 범위 ab있는지 여부에 따라 1 씩 증가 또는 1- 감소율에서 b크다 a. 따라서 긍정적 인 n경우 첫 번째 목록 [0..n]++[n..0][0,1,2,...,n]있고 두 번째 목록 은 비어 있습니다. 음수의 n경우 두 번째 범위가 산출 [0,-1,-2,...,n]되고 첫 번째 범위 가 비어 있습니다. 그러나 n=0두 범위 모두 목록을 생성하면 [0]연결 [0,0]로 인해 잘못된 결과가 발생 2합니다. 그래서 0특별한 경우로 취급됩니다.

=<<리스트 의- 연산자는와 동일 concatMap하므로 각 숫자는에 의해 문자열로 변환되고 show모든 문자열은 하나의 긴 문자열로 연결되며 그 중 하나 length가 최종 반환됩니다.


xnor 's tip 전에 나는 [0,signum n..n]대신 사용 했다 [0..n]++[n..0]. signum n-1음수 대한 0제로 및 1양수과 형태의 범위 [a,b..c]에서 숫자들의 목록을 작성 a하는 c증가량 b. 이것에 의해 양 [0,signum n..n]의 범위 와 음 의 범위 [0,1,2,...,n]가 구축 됩니다. 들어 는 무한 목록을 만들 것입니다 우리가 처리 할 필요가 있으므로 특별한 경우로, 너무.n[0,-1,-2,...,n]nn=0[0,0,0,...]0


나는 [0..n]++[n..0]해야 한다고 생각 합니다 [0,signum n..n].
xnor

4

PHP, 41 35 바이트

사용자 덕분에 6 바이트 절약

이후 ʰᵈ의 대답은 음의 입력에 대한 잘못, 나는 새로운 솔루션을 구축하기 위해 자신에 그것을했다 :

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

이 기능 :

  • 어레이에서 구축 0하는 $argv[1](입력 일명)
  • 빈 문자로 표현 (즉, 문자열로 변환)
  • 줄의 길이를 메아

여기 사용해보십시오!


이것이 내가하는 더 좋은 해결책, idk 내가 왜 그렇게해야한다고 생각했는지 preg_match():(
ʰᵈˑ

글쎄, 나는 range()그것이 당신의 해결책이 아니라면 생각하지 않았을 것입니다 . 우리는 심지어 생각합니다.)
roberto06

1
join()대신을 사용하여 3 바이트를 절약 할 수 있습니다 implode(). 그것은 같은 것의 별칭입니다. php.net/manual/en/function.join.php
user59178

1
'glue'매개 변수를 생략하여 3 개 더.
user59178

에 대한 별칭이 있다는 것을 알았지 implode만 gue 매개 변수를 생략 할 수 있다는 것을 몰랐습니다. 감사 !
roberto06


4

R, 26 20 바이트

sum(nchar(0:scan()))

매우 기본적인 접근 방식 :

  • 벡터를 0 : x로 만듭니다.

  • 각 값의 문자 수를 계산합니다 (문자열로 자동 변환 됨)

  • 합집합

함수 정의를 줄이기위한 트릭이 있는지 확실하지 않습니까? 대신 stdin에서 입력을 받아 Giuseppe 덕분에 6 바이트가 절약되었습니다.


당신이 할 수있는 sum(nchar(0:scan()))대신에 읽기 n대신 stdin에서.
주세페

4

Mathematica, 48 47 46 바이트

Martin Ender 덕분에 -1 바이트 !

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

숫자를 인수로 사용하는 익명 함수.

Greg Martin의 짧은 솔루션 , 39 바이트

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

1
당신은 사용할 수 있습니다 Sign@#에 대한 #/Abs@#.
Martin Ender

1
약간 다른 접근 방식으로 몇 바이트를 저장할 수 있습니다 1-#~Min~0+Tr@IntegerLength@Range@Abs@#&. 초기 값 1은 숫자 0을 나타내고 -#~Min~0, 입력이 음수이면 모든 음수 부호를 나타냅니다.
Greg Martin

3

배치, 110 바이트

@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%

계산 sum(min(0,abs(n)+1-10^k),k=0..9)+(n<0?1-n:1)합니다. ( 9배치의 정수 산술의 한계 때문에 위로 올라 가야합니다 .)



3

MATL , 11 바이트

0hSZ}&:VXzn

온라인으로 사용해보십시오!

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 바이트

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

온라인으로 사용해보십시오! (매우 큰 (절대) 입력의 경우 TIO에서 바프됩니다)

..range 연산자를 사용하여 범위를 0입력 $args(입력 배열에서 변환 할 문자열로 캐스트)로 구성합니다. 그것은 -join함께 문자열 (예를 들어, 01234)로 연결되고 그 후 Length가 취해집니다. 그것은 파이프 라인에 남아 있으며 출력은 암시 적입니다.


이 질문을 읽을 때 내가 머릿속에서했던 정확한 해결책 😝
briantist

3

펄 6 , 18 바이트

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

시도 해봐

넓히는:

{  # 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 바이트

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

설명:

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

자바 스크립트, 50 바이트

@ETHproductions와 협력

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


3

레티 나 , 28 바이트

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

온라인으로 사용해보십시오!

설명

\d+
$*

부호를 그대로 유지하면서 숫자를 단항으로 변환합니다.

1
$`1¶

각 1은 그 자체까지의 모든 내용과 개행 문자로 대체됩니다. 이것으로 n이 양수이면 1에서 n까지, -음수이면 시작시에 추가 로 -1에서 n까지의 범위를 얻습니다 . 모든 숫자는 단항으로 개행 문자로 구분됩니다.

1+
$.&

각 1의 시퀀스를 해당 10 진수로 변환하십시오.

^-?
0

을 넣어 0여분의 교체, 시작시 -이가 있다면.

.

(줄 바꿈이 아닌) 문자 수를 계산하십시오.


3

이맥스, 20 바이트

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

명령 자체는 20 번의 키 입력이지만 이것이 바이트로 계산되는 방법에 대한 설명이 필요합니다. 각 키 입력을 1 바이트로 계산하는 것이 가장 공정하다고 생각했습니다. 위의 명령은 읽기 쉽도록 일반적으로 작성되었습니다.

설명

C-x (

키보드 매크로 정의를 시작하십시오.

C-x C-k TAB

새로운 매크로 카운터를 만듭니다. 0버퍼에 씁니다 . 카운터의 값은 이제 1입니다.

C-x )

키보드 매크로 정의를 종료합니다.

M-{input} C-x e

META를 누른 후 입력 번호를 입력하십시오. 그런 C-x e다음 매크로를 여러 번 실행합니다.

C-x h

마크를 버퍼의 시작으로 설정합니다 (이렇게 생성 된 모든 텍스트를 선택합니다).

M-=

선택한 지역에서 문자 수를 실행합니다. 문자 수는 미니 버퍼에 인쇄됩니다.

끔찍한 강조 색상에 대한 사과. 이 명령을 입력 100과 함께 사용하는 예입니다. 출력은 화면 하단의 미니 버퍼에 있습니다.

100을 입력하여 실행 예


네, 하나의 키 입력이 1 바이트라고 확신합니다.
NoOneIsHereHere

@NoOneIsHere 그것에 대해 두 가지 생각이 있습니다. 1) Ctrl + 문자를 단일 바이트로 나타낼 수 있습니까? 그리고 2) 여기에 유니 코드 문자를 1 바이트로 계산하는 많은 답변이 있지만 그렇지는 않습니다. 그래서 CodeGolf 자체에 "바이트"라는 자체 정의가 있다고 생각합니까? 감사.
cheryllium

나는 정말로 모른다. 그러나 당신은 메타를 요청할 수 있습니다 .
NoOneIsHere

3

루아, 52 바이트

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

입력에서 for 루프를 반복-입력에서 정수 i를 문자열 로 변환하고 t인쇄 전에 문자열 길이를 추가합니다t



2

C #, 77 73 바이트

@Kevin Cruijssen 덕분에 -4 바이트

람다 함수 :

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

Ungolfed 및 테스트 사례 :

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

당신은을 변경할 수 있습니다 while하기 for: 바이트의 몇 저장 (r)=>{var l="";for(int i=0,s=r<0?-1:1;i!=r+s;i+=s)l+=i;return l.Length;};( 73 바이트 )
케빈 Cruijssen

@Kevin Cruijssen 감사합니다.
Mr Scapegrace

아마도 int 카운터를 사용하고 루프 안에 길이를 추가하여 바이트를 절약 할 수 있습니다. 에 컴파일 하면 2 바이트를 절약하는 Func<int, int>것과 같은 함수를 호출 할 수 r=>...있습니다 (아마도 이것을 할 수 있습니다).
TheLethalCoder

2

자바 스크립트, 44 바이트

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>


2

REXX, 56 바이트

arg n
l=0
do i=0 to n by sign(n)
  l=l+length(i)
  end
say l
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.