我要写多少钱?


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

这是一个。最低字节数获胜!

Answers:




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字节

感谢@seshoumara节省了2个字节。

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上进行了测试,它也可以在负输入上工作(seq与GNU seq不同)。
米切尔·史派克特

@DigitalTrauma Nice GNU解决方案。如果愿意,继续自己发布。我认为这与我的变体相差太大。
米切尔·史派克特


如何使用fold -1|wc -l计数?它更短。
seshoumara

6

Python 2中, 8378 64个字节

最短版本:

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

这个版本节省了5个字节,这要归功于@numbermaniac:

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)))))。通过将其设置为lambda,您可以节省更多。
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循环:

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

RProgN 2,5字节

n0R.L

解释

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

简单的解决方案,就像一个魅力。

在线尝试!


4

Brachylog,5个字节

⟦ṡᵐcl

在线尝试!

建立范围[0,input],将每个数字转换为字符串,连接成单个字符串并返回结果的长度


我注意到TIO有争论Z; 那是怎么回事?应该算在内吗?
steenbergh

3
@steenbergh:Leo的提交是一个功能,而不是完整的程序。将参数提供Z给Brachylog解释器会告诉它添加适当的包装器以使该函数可测试。(如果将其作为完整程序运行,则不会产生任何输出。)我们在此处允许程序或函数提交,因此不应计入字节数,因为它实际上不是提交的一部分。

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]
约尔格Hülsermann

4

Haskell39 38字节

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

在线尝试!编辑:感谢@xnor,保存了1个字节!

说明:

在Haskell中输入数字ab [a..b]取值范围是从ab1递增还是1递减,取决于是否b更大a。因此,对于正数n,第一个列表[0..n]++[n..0][0,1,2,...,n],第二个列表为空。如果为负,n则第二个范围屈服[0,-1,-2,...,n],第一个为空。但是,如果n=0两个范围都产生列表[0],则串联[0,0]将导致错误的结果2。这就是为什么0将其作为特殊情况处理的原因。

=<<列表上的-operator与相同concatMap,因此每个数字都由转换为一个字符串show,所有这些字符串都串联在一个长字符串中,length最后返回。


在xnor提出建议之前,我使用[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]为负n。因为n=0它将建立无限列表,[0,0,0,...]所以我们也需要0作为特殊情况进行处理。


我认为[0..n]++[n..0]应该这样做[0,signum n..n]
xnor

4

PHP,41 35字节

感谢user59178,节省了6个字节

由于ʰᵈ的答案对于否定的输入是错误的,因此我自己决定建立一个新的解决方案:

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

该功能:

  • 0到建立数组$argv[1](又称输入)
  • 用一个空字符将其插入(即将其转换为字符串)
  • 回显字符串的长度

在这里尝试!


这是一个更好的解决方案,矿山,IDK为什么我认为我必须这样做preg_match():(
ʰᵈˑ

好吧,我不会想range()这是否不是您的解决方案,我想我们甚至还没有;)
roberto17年

1
您可以使用join()代替来节省3个字节implode()。这是同一件事的别名。php.net/manual/en/function.join.php
user59178'3

1
还有3个,省略了'glue'参数。
user59178'3

我知道有的别名implode,但我不知道可以省略gue参数。谢谢 !
roberto06年


4

R,26 20字节

sum(nchar(0:scan()))

非常基本的方法:

  • 设定向量0:x

  • 计算每个值中的字符(将自动强制为字符串)

不知道是否有任何技巧可以减少函数定义? 通过使用Giuseppe,通过从stdin接收输入,节省了6个字节。


您可以sum(nchar(0:scan()))改为n从标准输入中读取。
朱塞佩

4

Mathematica,48 47 46字节

-1字节感谢Martin Ender

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如果输入为负,则占所有负号。
格雷格·马丁

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

Python 2,68个字节

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

在线尝试!

比其他Python解决方案更长但有所不同。定义一个称为例如的递归函数f(10)


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上打断)

使用..范围运算符构造从0到输入的范围$args(以字符串形式显示,以从输入数组转换)。将-join它们一起编入字符串(例如01234),然后使用Length。那留在管道上,输出是隐式的。


当我读到这个问题时,我心中的确切答案是solution
briantist

3

Perl 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

JavaScript,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序列转换为相应的十进制数。

^-?
0

将a 0放在开头,-如果有多余的,请将其替换。

.

计算(非换行符)字符的数量。


3

Emacs,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的示例执行


是的,我很确定一个按键就是一个字节。
NoOneIsHere

@NoOneIsHere我对此有两个想法:1)Ctrl +字符可以表示为单个字节吗?2)我在这里看到很多答案,将Unicode字符计为一个字节,但不是,所以我想也许CodeGolf可能有自己的“字节”定义?谢谢。
cheryllium

我真的不知道 但是您可以在Meta上询问。
NoOneIsHere

3

Lua,52个字节

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

从0-输入遍历for循环,将整数i转换为字符串,并t在打印之前将字符串的长度加到t



2

C#,77 73字节

-4个字节,感谢@Kevin Cruijssen

Lambda函数:

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

取消测试并包含测试用例:

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您说得对,谢谢。
Scapegrace先生17年

您可能可以使用int计数器并在循环内添加长度以节省一些字节。如果编译为a Func<int, int>,则可以调用函数r=>...以节省2个字节(仍然可以执行此操作)。
TheLethalCoder

2

JavaScript,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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.