以我的方式编号

Gryphon 08/21/2017. 20 answers, 1.959 views
code-golf number

人们总是告诉我,一个数字的平方是数字乘以自己的数字。 这显然是错误的。 对一个数字进行平方处理的正确方法是将它放在一个正方形中,方法是将其叠加在它自身的顶部,等于它所具有的位数,然后从所得到的正方形中读取所有数字,水平(从仅从左到右)和垂直(仅从上到下),然后将它们添加在一起。 所以,对于数字123,你首先创建方块:

123
123
123 

然后你从广场上取出所有的行和列,并将它们加在一起:

123+123+123+111+222+333 

这给了我们1035的结果。

对于负数,您可以正常堆叠(请记住,您只计算digits ,因此负号不包含在长度中),然后正常读取水平数字(带负号),然后忽略负号垂直数字。 所以,对于数字-144我们得到了方块:

-144
-144
-144 

这给了我们-144-144-144+111+444+444 ,这等于567

对于只有一位数字的数字,正方形总是等于数字的两倍(水平读取一次,垂直读取一次)。 所以4给我们

4 

这给了我们4+4 ,等于8

对于带有小数部分的数字,通常堆叠(请记住,只有digits是按堆叠数字的次数计算的,因此小数点不计算在内),并且在读取垂直数字时忽略小数点符号。 例如,数字244.2给了我们

244.2
244.2
244.2
244.2 

这给了我们244.2+244.2+244.2+244.2+2222+4444+4444+2222 ,这等于14308.8

小数或复数不能平方。

你的任务:

我厌倦了用手工排列数字,所以我决定让这个过程自动化。 给我写一个程序或函数,根据你的喜好输入一个浮点数或字符串作为输入,并返回按我的方式平方的结果。

例子:

123    -> 1035
388    -> 3273
9999   -> 79992
0      -> 0
8      -> 16
-6     -> 0
-25    -> 27
-144   -> 567
123.45 -> 167282.25
244.2  -> 14308.8
2      -> 4
-0.45  -> 997.65
0.45   -> 1000.35 

评分:

由于写出所有这些方块,我的手变得局促,并且我的计算机不支持复制/粘贴,所以输入的代码最少的代码(由于某种原因,以字节为单位进行测量?)会胜出!

5 Comments
Gryphon 07/29/2017
我意识到这不是沙盒中很长一段时间(只有一天多一点),但它已经有7个upvotes,所以我认为它可能已经准备好发布。
1 Leaky Nun 07/29/2017
因为计算机以二进制形式存储数字,所以“123.45”和“244.2”本身无效。 在问题依赖于十进制表示法之前,这通常不是问题。
3 Leaky Nun 07/29/2017
@Gryphon这是失败的地方。 244.2不是浮点数。 它不能被转换成字符串"244.2"
2 Leaky Nun 07/29/2017
@Gryphon但是,这样的行为使其非常不方便。
7 Gryphon 07/29/2017
为什么选择三个关闭? 如果有11个人可以回答这个问题,我想这可能很清楚!

20 Answers


Erik the Outgolfer 07/29/2017.

05AB1E ,7个字节

þSDg×+O 

在线试用!

说明

þSDg×+O Implicit input
þ       Keep digits
 S      Get chars
  D     Duplicate
   g    Length
    ×   Repeat string(s)
     +  Add (implicit input added to all elements)
      O Sum 
4 comments
3 Jonathan Allan 07/29/2017
当你可以请求时,Ooo解释
1 Jonathan Allan 07/29/2017
另外我会注意到,单个前导零是对<输入<1的输入的要求(即0.45和0.45是不同的输入但是相同的数字,只有前者是可接受的)
Erik the Outgolfer 07/29/2017
@JonathanAllan后者没有处理。
Erik the Outgolfer 07/29/2017
@JonathanAllan完成。

Jonathan Allan 07/29/2017.

果冻13 12 字节

fØDẋ€L$ŒV+VS 

一个monadic链接接受一个字符列表(一个格式正确的十进制数,单引导零是-1 < n < 1 )的要求并返回一个数字。

Try it online!

14个字节接受和返回数字(输入限制在+/-10-5乘以ŒṘ ): ŒṘfØDẋ€L$ŒV+⁸S

怎么样?

fØDẋ€L$ŒV+VS - Link: list of characters         e.g. "-0.45"
 ØD          - yield digit characters                "0123456789"
f            - filter keep                           "045"
      $      - last two links as a monad:
     L       -   length (number of digit characters) 3
   ẋ€        -   repeat list for €ach digit          ["000","444","555"]
       ŒV    - evaluate as Python code (vectorises)  [0,444,555]
          V  - evaluate (the input) as Jelly code    -0.45
         +   - addition (vectorises)                 [-0.45,443.55,554.55]
           S - sum                                   997.65 
4 comments
Erik the Outgolfer 07/29/2017
嗯,你可以用15个字节的版本替换+€ + -1。
Jonathan Allan 07/29/2017
已经做到了,谢谢!
Erik the Outgolfer 07/29/2017
嗯不是在15个字节的版本。 编辑:3秒太早我想...
Jonathan Allan 07/29/2017
你刚才注意到你说的15字节版本 - 再次感谢!

nimi 07/29/2017.

Haskell, 59 56字节

f s|l<-filter(>'.')s=0.0+sum(read<$>(s<$l)++[c<$l|c<-l]) 

输入被视为一个字符串。

在线试用!

怎么运行的

l<-filter(>'.')s      -- let l be the string of all the numbers of the input string
f s   = 0.0 + sum     -- the result is the sum of (add 0.0 to fix the type to float)
   read<$>            -- turn every string of the following list into a number
   s<$l               -- length of l times the input string followed by
   [c<$l|c<-l]        -- length of l times c for each c in l 

ETHproductions 07/29/2017.

Japt v2,16个字节

o\d
l
¬xpV +V*Ng 

在线测试!

说明

o\d    First line: Set U to the result.
o      Keep only the chars in the input that are
 \d      digits. (literally /\d/g)

l    Second line: Set V to the result.
l    U.length

¬xpV +V*Ng    Last line: implicitly output the result.
¬             Split U into chars.
 x            Sum after
  pV            repeating each V times.
     +V*Ng    Add V * first input (the sum of the horizontals) to the result. 

Ian H. 07/31/2017.

C#(.NET Core), 150 141 133字节

Saved 9 bytes thanks to @TheLethalCoder
由@TheLethalCoder保存了另外8个字节

a=>{var c=(a+"").Replace(".","").Replace("-","");int i=0,l=c.Length;var r=a*l;for(;i 

在线试用!

以字符串作为输入并将“平方”数字输出为浮点数。


此代码遵循以下算法:

  1. 从输入中创建一个新的字符串,但没有小数点和符号,所以我们可以从那里得到我们的长度和列数。

  2. 计算我们在点1创建的字符串长度的输入时间。

  3. 对于我们的'方形'中的每一列,创建一个新的字符串,列号和行长度并将其添加到我们的结果中。

例:

输入: -135.5

  1. 如果我们替换小数点和符号,我们得到字符串1355 ,长度为4
  2. 输入时间4: -135.5 * 4 = -542
  3. 现在我们为每一列创建新的字符串,解析它们并将它们添加到我们的结果中:
    5555

如果我们总结这些数字,我们得到15012 ,这正是我们的程序将输出的。

5 comments
1 Dada 07/31/2017
欢迎来到本网站,首先回答很好(特别感谢解释!)!
Ian H. 07/31/2017
@达达谢谢! 即使强硬,我从string.Replace()获得的字节比如string.Replace() ,但我猜这是它工作的唯一方式!
TheLethalCoder 07/31/2017
通过将il设置为浮动,可以节省一些字节。
Ian H. 07/31/2017
@TheLethalCoder也想到了这一点,可悲的索引不适用于浮动,并且.Length不能隐式转换为浮动。
1 TheLethalCoder 07/31/2017
a=>{var c=a.Replace(".","").Replace("-","");int i=0,l=c.Length;var r=float.Parse(a)*l;for(;i 141个字节。 可以通过以float输入并将其转换为带有n+""的字符串来保存,但我没有检查过。

Erik the Outgolfer 07/29/2017.

Brachylog ,23个字节

{∋ịṫ}ᶠ⟨≡zl⟩j₎ᵐ;[?]zcịᵐ+ 

在线试用!

Brachylog与浮动不适合...

说明:

{∋ịṫ}ᶠ⟨≡zl⟩j₎ᵐ;[?]zcịᵐ+ Takes string (quoted) input, with '-' for the negative sign
     ᶠ                  Return all outputs (digit filter)
{   }                    Predicate (is digit?)
 ∋                        An element of ? (input)
  ị                       Convert to number (fails if '-' or '.')
   ṫ                      Convert back to string (needed later on)
      ⟨   ⟩             Fork
       ≡                 Identity
         l               Length
                        with
        z                Zip
             ᵐ          Map
            ₎            Subscript (optional argument)
           j              Juxtapose (repeat) (this is where we need strings)
              ;         Pair with literal
               [ ]       List
                ?         ?
                  z     Zip
                   c    Concatenate (concatenate elements)
                     ᵐ  Map
                    ị    Convert to number
                      + Add (sum elements) 

Zgarb 07/29/2017.

稻壳 ,15字节

§+ȯṁrfΛ±TṁrSR#± 

取一个字符串并返回一个数字。 在线试用!

说明

有点烦人的是,内置解析函数r在无效输入上给出了解析错误,而不是返回默认值,这意味着我必须明确地过滤掉包含非数字的列。 如果它在格式错误的输入上返回0,我可以丢弃fΛ±并保存3个字节。

§+ȯṁrfΛ±TṁrSR#±  Implicit input, e.g. "-23"
             #±  Count of digits: 2
           SR    Repeat that many times: ["-23","-23"]
         ṁr      Read each row (parse as number) and take sum of results: -46
  ȯṁrfΛ±T        This part is also applied to the result of SR.
        T        Transpose: ["--","22","33"]
     fΛ±         Keep the rows that contain only digits: ["22","33"]
   ṁr            Parse each row as number and take sum: 55
§+               Add the two sums: 9 

Mr. Xcoder 07/29/2017.

Python 3,95 94 87 85 84字节

 def f(i):l=[x for x in i if"/" 

测试套件

Python 3,78字节

 lambda x:sum(float(i*len(z))for z in[[i for i in str(x)if"/" 

测试套件。

第二种方法是受到@ officialaimm解决方案启发的Python 3的端口。


ThePirateBay 07/31/2017.

JavaScript, 75 62字节

a=>(b=a.match(/\d/g)).map(b=>a+=+b.repeat(c),a*=c=b.length)&&a 

在线试用

-2 bytes thanks to Arnauld
-5 bytes thanks to Shaggy (我虽然该函数必须收到一个数字,但现在我看到很多其他答案也收到字符串)


Xcali 08/05/2017.

Perl 5,37 33 + 1(-p)= 38 34字节

 $_*=@n=/\d/g;for$\(@n){$_+=$\x@n} 

在线试用!

使用Dom代码中的一些技巧来削减4个字节

Explained:

 @n=/\d/g;    # extract digits from input
$_*=@n;      # multiply input by number of digits
for$\(@n){   # for each digit:
  $_+=       # add to the input
  $\x@n}     # this digit, repeated as many times as there were digits
             # taking advantage of Perl's ability to switch between strings
             # and numbers at any point 
3 comments
Dom Hastings 07/31/2017
想出了一个非常类似的方法,但设法使用$ \取消几个字节并退出循环: 在线尝试!
Xcali 08/05/2017
用你的一些灵感来剃光。 什么是你最后的“} {”结构? 我不熟悉那个。
Dom Hastings 08/05/2017
这是我从这个网站学到的,基本上是-n-p从字面上围绕代码包装了一段while(){...} ,所以}{突破了这一点。 这会取消设置$_但如果您使用$\作为变量,它将继续打印,因为每个打印都附加了$\ 。 意味着你可以存储数字或其他东西,并忽略$_ 。 不确定这是一个很好的解释,但请查看Perl线程中的g打印技巧 ,我相信这会更好地解释它! 很高兴帮助你的分数!

Erik the Outgolfer 07/29/2017.

果冻 ,17字节

ŒṘfØDẋ€L©$ŒV;ẋ®$S 

在线试用!


Erik the Outgolfer 07/29/2017.

Pyth,18字节

s+RvQsM*RF_lB@jkUT 

在这里尝试。


Mr. Xcoder 07/29/2017.

Pyth21 20字节

K@jkUTQ+smv*lKdK*lKv 

测试套件。

@ EriktheOutgolfer的回答采用了一种完全不同的方法,它帮助我在高尔夫球1个字节的聊天过程中,从22日到21日。


说明

  K@jkUTQ+s.ev*lKbK*lKv   K @ jkUTQ  - 过滤数字并将它们分配给变量K.           m  - 地图。 用变量d对数字进行迭代             v  - 评估(转换为浮点数)。              * lKd  - 将每个字符串数字乘以K的长度          s  -  Sum         +  - 总和                   * lKvQ  - 将数字乘以数字字符串的长度 

officialaimm 07/30/2017.

Python 2,81 74字节

-7 bytes thanks to @Mr. Xcoder -7 bytes thanks to @Mr. Xcoder'/'

  • 取整数或浮点数,返回浮点数。
 lambda x:sum(float(i*len(z))for z in[[i for i in`x`if"/" 

在线试用!

说明:

123.45是作为输入。 [i for i in`x`if"/"给出了字符串化整数['1','2','3','4','5'] (也是z )的列表。 现在我们遍历[x]+z ie [123.45,'1','2','3','4','5'] ,将每个元素乘以len(z) ,这里是5并将每个元素转换为浮动(以便字符串也相应地转换),产生[617.25,11111.0,22222.0,33333.0,44444.0,55555.0] 。 最后我们计算sum(...)并获得167282.25

4 comments
Mr. Xcoder 07/29/2017
78个字节 。 将i.isdigit()替换为"/"
1 Mr. Xcoder 07/29/2017
74字节 。 事实上,你可以用"/"来替换i.isdigit() ,因为两者都是.-具有比数字更低的ASCII码,adn /位于它们之间
officialaimm 07/29/2017
@ Mr.Xcoder非常感谢!
Mr. Xcoder 07/29/2017
别客气。 我将它移植到Python 3作为我的答案的替代方案

Bruce Forte 07/30/2017.

八度100 82字节

非常感谢@TomCarpenter教给我的作业具有返回值并节省了18个字节!

 @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n))) 

在线试用!

Ungolfed /解释

 function f=g(v)
  s=strrep(num2str(abs(v)),'.','')-'0';  % number to vector of digits (ignore . and -)
  n=nnz(s);                              % length of that vector
  f=n*v+sum(sum(s'*logspace(0,n-1,n)))   % add the number n times and sum the columns of the square
end 

这种方式的工作原理是,我们基本上需要自己添加数字n次,然后添加列的总和。 总结s' * logspace(0,n-1,n)实现了列的总和,例如如果v=-123.4那么矩阵将是:

 [ 1     10    100   1000;
  2     20    200   2000;
  3     30    300   3000;
  4     40    400   4000 ] 

所以我们只需要sum一下,我们就完成了。

1 comments
1 Tom Carpenter 07/30/2017
你可以通过把它全部写入匿名函数@(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(‌​s'*logspace(0,n-1,n)‌​))在线试用!

Mr. Xcoder 07/30/2017.

Swift 4,139 134字节

 func f(s:String){let k=s.filter{"/"<$0};print(Float(s)!*Float(k.count)+k.map{Float(String(repeating:$0,count:k.count))!}.reduce(0,+))} 

测试套件。


说明

  • func f(s:String) - 用一个显式的String参数s定义一个函数f

  • let k=s.filter{"/"<$0} - 过滤数字:我注意到-. 具有比所有数字更小的ASCII值,并且/在两者之间.-0 。 因此,我只是检查"/"是否小于当前字符,就像我在Python的回答中那样。

  • print(...) - 打印结果。

  • Float(s)!*Float(k.count) - 将字符串和位数转换为Float并将它们相乘(Swift不允许Float和Int乘法:())。 因此它将数字加上x次,其中x是它包含的数字的数量。

  • k.mapNO maps over k with the current value $0 . - k.map{}k映射到当前值$0String(repeating:$0,count:k.count)取每个数字,创建x相同数字的字符串和Float(...)! 将其转换为浮点数。

  • .reduce(0,+) - 获取上面列表的总和。

  • 最后+总结这两个结果。


我们来举个例子吧!

说我们的字符串是"0.45" 。 首先,我们过滤数字,所以我们留下0, 4, 5 。 我们将"0.45"转换为浮点数并乘以位数: 0.45 * 3 = 1.35 。 然后我们将每个数字转换成一个重复该数字的字符串,直到它填满正方形的宽度(有多少数字): 0, 4, 5 -> 000, 444, 555 。 我们总结这个, 000 + 444 + 555 = 999 。 然后我们只需将结果加在一起: 1.35 + 999 = 1000.35


TheLethalCoder 07/31/2017.

C#, 139 137字节

 using System.Linq;n=>{var d=(n+"").Where(char.IsDigit);return d.Sum(i=>int.Parse(new string(i,d.Count())))+new int[d.Count()].Sum(_=>n);} 

Saved 2 bytes thanks to @Ian H.

在线试用!

完整/格式化版本:

 namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func f = n =>            {
                var d = (n + "").Where(char.IsDigit);
                return d.Sum(i => int.Parse(new string(i, d.Count()))) + new int[d.Count()].Sum(_ => n);
            };

            Console.WriteLine(f(123));
            Console.WriteLine(f(-144));
            Console.WriteLine(f(4));
            Console.WriteLine(f(244.2));

            Console.ReadLine();
        }
    }
} 
2 comments
Ian H. 07/31/2017
你可以在开始时使用var d=(n+ ...而不是var d = (n ...来保存2个字节。
TheLethalCoder 07/31/2017
@IanH。 忘记删除所有空格-_-这就是我在接听电话时得到的答复。

Jenny_mathy 08/09/2017.

Mathematica,107字节

(t=Length[s=#&@@RealDigits[#]//.{a___, 0}:>{a}];If[IntegerPart@#==0,t++];t#+Tr[FromDigits@Table[#,t]&/@s])& 

Titus 08/11/2017.

PHP, 78 88 +1字节

 for($e=preg_match_all("#\d#",$n=$argn);~$c=$n[$i++];)$s+=str_repeat($c,$e);echo$s+$n*$e; 

使用-nR作为管道运行。

可能会在PHP 7.1中产生警告。 使用$c>0?$c:0,$e来修复$c>0?$c:0,$e


C McAvoy 07/31/2017.

Python 3,68 70 73 77字节

 lambda n:sum(float(n)+int(_*sum(x>"/"for x in n))for _ in n if"/"<_) 

在线试用!

循环遍历每个数字字符并重复整个数字字符的数量,将其转换为整数,并将其添加到n 。 通过这种方式, n被加上d次,总和的水平部分,以及数字重复,这是垂直部分。 最初使用str.isdigit>"/" ,感谢这个线程中的其他人,节省了大量的字节。 将n作为字符串保存两个字节,但输出更加混乱。

 lambda n:sum(n+int(_*sum(x>"/"for x in str(n)))for _ in str(n)if"/"<_) 

在线试用!

Related questions

Hot questions

Language

Popular Tags