扩大数量


11

扩大数量

您的任务是按以下方式扩展大于0的整数:

将数字拆分为十进制数字,并根据以下规则为每个数字生成一个列表:

  • 如果该数字为奇数,则列表以该数字开头并降为1;
  • 如果数字是偶数,则列表以数字开头,并上升到9。
  • 如果数字为0,则列表为空。

写下数字下方的奇数列表,偶数上方的列表。然后将各列顶部对齐,并收集每一行中的数字以制成整数。作为最后一步,将数字加起来以查找数字的扩展。

以下是适用于34607的上述规则的示例:

 9          
 8          
 79         
 68         
 57         
346 7 ->  399 7 -> 3997 -> 9418
2   6     288 6    2886
1   5     177 5    1775
    4      66 4     664
    3      5  3      53
    2      4  2      42 
    1         1       1

这是测试用例:

1: 1
2: 44
3: 6
44: 429
217: 1270
911: 947
2345: 26114
20067: 3450
34875632: 70664504
9348765347634763: 18406119382875401

这是,因此每种语言中以字节为单位的最短答案都会获胜。


1
我们可以将输入作为字符串吗?还是数字数组?
Arnauld

@Arnauld必须为整数,并使用程序/函数将其拆分为数字
Galen Ivanov

@GalenIvanov但是,如果输入来自标准输入,我想可以(即使从技术上来说是一个字符串),对吗?
亚当

@Adám是的,从技术上讲,它是一个字符串,这样就可以了。
加伦·伊凡诺夫

在这里,我认为这将是像一个扩展
Engineer Toast

Answers:


8

果冻,13 个字节

Dḟ0RrḂ?€9UZḌS

取并返回正整数的单子链接。

在线尝试!或查看测试套件

怎么样?

Dḟ0RrḂ?€9UZḌS - Link: positive integer           e.g. 702
D             - cast to a decimal list                [7,0,2]
  0           - literal zero                          0
 ḟ            - filter discard                        [7,2]
        9     - literal nine
       €      - for each:
      ?       -   if:
     Ḃ        -   ...condition: bit (modulo by 2)      1              ,0
   R          -   ...then: range ([1,...n])            [1,2,3,4,5,6,7],n/a
    r         -   ...else: inclusive range ([n,...9])  n/a            ,[2,3,4,5,6,7,8,9]
         U    - upend                                 [[7,6,5,4,3,2,1],[9,8,7,6,5,4,3,2]]
          Z   - transpose                             [[7,9],[6,8],[5,7],[4,6],[3,5],[2,4],[1,3],2]
           Ḍ  - cast from decimal lists               [79,68,57,46,35,24,13,2]
            S - sum                                   324

4

Perl 6的 68  66个字节

{sum roundrobin(.comb».&{$_%2??($_...1)!!(9...+$_) if +$_})».join}

尝试一下

{sum roundrobin(.comb».&{[R,] $_%2??1..$_!!$_..9 if +$_})».join}

尝试一下

展开:

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

  sum

    roundrobin( # grab from the sub lists in a round robin fashion

      .comb\             # split the input into digits
      ».&{               # for each digit do this

        [R,]             # reduce with reversed &infix:«,» (shorter than reverse)

              $_ % 2     # is the digit not divisible by 2?
          ??  1  .. $_   # from 1 to the digit
          !!  $_ ..  9   # from the digit to 9

        if +$_           # only do the above if the current digit isn't 0
                         # (has the effect of removing 0 from the list)
     }

    )».join     # join each of the sub-lists from roundrobin
}

3

APL(Dyalog),39字节

完整的程序主体。提示从STDIN输入。将结果打印到STDOUT。

+/10⊥¨0~⍨¨↓⍉↑{2|⍵:⌽⍳⍵⋄×⍵:⌽⍵,⍵↓⍳9⋄⍬}¨⍎¨⍞

在线尝试!

为了正确地显示上次测试的情况下,⎕FR˚F loating点- [R epresentation)已被设置为128位十进制和⎕PPP RINT P recision)已被设置为34位。

 提示从STDIN输入文本

⍎¨ 执行每个(获取每个数字作为数字)

{ 对于每个元素,应用以下函数,其中参数由表示

2|⍵: 如果是奇数(当除以2时点亮“ if”除法余数),则:

   相反

   所述ɩ从1 ntegers直到

   论点

 其他

×⍵: 如果参数为正(点亮“ if”信号),则:

   相反

   论点

  , 其次是

   论点

   元素从

  ⍳9 所述的ɩ ntegers从1至9

 其他

   空清单

 将此列表列表混合(合并)到单个矩阵中,右侧填充零

 转置

 将此矩阵拆分为列表列表

0~⍨¨ 从每个列表中删除所有零

10⊥¨ 将每个数字从10转换为普通数字(这将收集数字)

+/ 求和


2
谢谢你的解释。只是想告诉您,我在APL代码高尔夫视频中观看了您之后发现了代码高尔夫。
加伦·伊凡诺夫

3

JavaScript(ES6),88 83 82字节

f=(n,k=0)=>k<9&&+[...n+''].map(x=>+x&&(x=x&1?x:9-k<x||9)>k?x-k:'').join``+f(n,k+1)

注意

9 - k < x || 9保存一个字节,9 - k >= x && 9但是生成1而不是0验证不平等。如果导致1 > k,将触发外部三元组中错误的路径,这将是一个问题。但这意味着,k = 0因此9 - k = 9,我们不可能同时拥有9 - k < x

测试用例

注意:删除了最后一个超出JS编号精度的测试用例。



3

爪哇11,210个 209 191 181字节

n->{long r=0;var a="0".repeat(9).split("");for(int d:(n+"").getBytes())for(int k=0,x=d-48,y=9;x>0&(k<1||(d%2<1?y-->x:x-->1));a[k++]+=d%2<1?y:x);for(var q:a)r+=new Long(q);return r;}

好的,这花了相当长的时间(主要是因为我一开始犯了一个错误,所以必须写下每个步骤以更好地了解我做错了什么)。最有可能打更多的高尔夫球。

-18个字节感谢@ceilingcat

说明:

在这里尝试。

n->{                             // Method with long as both parameter and return-type
  long r=0;                      //  Result-long `r`, starting at 0
  var a="0".repeat(9).split(""); //  String array `a`, filled with nine String zeroes
  for(int d:(n+"").getBytes())   //  Cast the input to a String,
                                 //   and loop over its codepoints as integers:
    for(int k=0,                 //   Row-index `k`, starting at
        x=d-48,                  //   Temp integer `x`, set to the current digit
        y=9                      //   Temp integer `y`, set to 9
        ;                        //   Inner loop, if:
         x>0                     //     The current digit is not a 0,
          &(k<1                  //     and if this is the first iteration,
             ||(d%2<1?           //     or if the digit is even:
                 y-->x           //      And `y` is larger than the digit
                                 //      (and afterwards decrease `y` by 1 with `y--`)
                :                //     or if the digit is odd:
                 x-->1));        //      And `x` is larger than 1
                                 //      (and afterwards decrease `x` by 1 with `x--`)
      a[k++]+=                   //    Append the current row with:
                                 //    (and afterwards increase `k` by 1 with `k++`)
       d%2<1?                    //     If the digit is even:
        y                        //      Append the row with `y`
       :                         //     Else (the digit is odd):
        x);                      //      Append the row with `x`
  for(var q:a)                   //  Loop over the String rows in the array:
    r+=new Long(q);              //   Convert it to a long, and add it to the result-sum
  return r;}                     //  Return the result

2

,28字节

J_MS(RV{a?a%2?\,aa,tl}Ma)ZDx

在线尝试!

说明

                      Ma      Map this function to the digits of the 1st cmdline arg:
        a?                     If digit != 0:
          a%2?                  If digit is odd:
              \,a                Inclusive-range(digit)
                 a,t            Else (digit is even), range from digit to 10 (exclusive)
                    l          Else (digit is 0), empty list
     RV{             }         Apply reverse to the result before returning it
                              This gives us a list of lists like [9 8 7 6] or [3 2 1]
    (                   )ZDx  Zip, with a default value of empty string
J_MS                          Use map-sum to join each sublist and sum the results
                              Autoprint (implicit)

步骤如何34607作为参数进行:

34607
[[1 2 3] [4 5 6 7 8 9] [6 7 8 9] [] [1 2 3 4 5 6 7]]
[[3 2 1] [9 8 7 6 5 4] [9 8 7 6] [] [7 6 5 4 3 2 1]]
[[3 9 9 "" 7] [2 8 8 "" 6] [1 7 7 "" 5] ["" 6 6 "" 4] ["" 5 "" "" 3] ["" 4 "" "" 2] ["" "" "" "" 1]]
[3997 2886 1775 664 53 42 1]
9418



2

R153146字节

function(n,m=n%/%10^(nchar(n):0)%%10)sum(strtoi(apply(sapply(m[m>0],function(x)c(r<-"if"(x%%2,x:1,9:x),rep("",9-sum(r|1)))),1,paste,collapse="")))

在线尝试!

有时候,我不知道如果我在打高尔夫球只是垃圾,或者如果R是....这绝对是我的,保存7感谢user2390246,谁提醒我的另一种方式来提取数字(我建议我自己)字节。

您可以将替换strtoias.double以获取18406718084351604最后一个测试用例(这是错误的)。R仅具有32位整数。


您可以通过将n用作整数并使用一种技巧转换为数字来节省一点!146个字节
user2390246,2017年

@ user2390246,你知道,我尝试过,但是我想我一直在使用隐式转换, character->int直到我调用:然后再使用时strtoi
朱塞佩

1

Perl 5,120 +1(-a)= 121字节

$p=y/01357/ /r;$n=y/02468/ /r;map{$p=~s/9/ /g;$p=~s/\d/$&+1/ge;$n=~s/\d/$&-1/ge;$n=~s/0/ /g;@F=($p,@F,$n)}0..7;say for@F

在线尝试!


1

Python 2,131字节

lambda n:sum(int(''.join(`n`for n in l if n))for l in map(None,*[range(n and(n%2*n or 9),(n%2<1)*~-n,-1)for n in map(int,`n*10`)]))

在线尝试!


1

05AB1E,16 个字节

0KεDÈi9ŸëL]íõζJO

在线尝试验证所有测试用例

或者:

0KεDÈ8*>Ÿ{R}õζJO
0Kε9Ÿ¬L‚yèR}õζJO

说明:

0K        # Remove all 0s from the (implicit) input-integer
  ε       #  Map each digit to:
   D      #   Duplicate the digit
    Èi    #   If it's even:
      9Ÿ  #    Pop and push a list in the range [digit, 9]
     ë    #   Else (the digit is odd):
      L   #    Pop and push a list in the range [1, digit]
  ]       # Close both the if-else statement and map
   í      # Reverse each inner ranged list
     ζ    # Zip/transpose, swapping rows and columns,
    õ     # with an empty string as filler
      J   # Join each inner list together
       O  # And sum that list
          # (after which the result is output implicitly)

1

滑稽,39字节

riXX:nz{J2dv{{9r@}{ro}}che!<-}m[tp)im++

在线尝试!

ri      #Read as int
XX      #Return list of digits
:nz     #Filter for non-zero
{
 J2dv   #Divisible by 2?
 {
  {9r@} #Range a, 9
  {ro}  #Range 1, a
 }che!  #Run based on if divisible
 <-     #Reverse the range
}m[     #Apply to each digit
tp      #Transpose digits
)im     #Join each list into single int
++      #Sum each int
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.