展开和收缩


19

以正整数作为输入。从开始,并反复将增加10的最大整数幂,以使和。kn:=1niini+nk

重复直到并返回所有中间值的列表,包括初始和最终。n=kn1k

在这一过程中,增长最初将受到前者的不平等的限制,然后才受到后者的限制。增长将采取初始“扩张”时期的形式,在此期间,会以更大的幂增加,随后是“契约”时期,在此期间,会以越来越小的幂增加以“放大”在正确的数字上。nn

测试用例

1 => [1]
10 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
321 => [1,  2,  3,  4,  5,  6,  7,  8,  9,
        10, 20, 30, 40, 50, 60, 70, 80, 90,
        100, 200, 300, 310, 320, 321]
1002 => [1,   2,   3,   4,   5,   6,   7,   8,   9,
         10,  20,  30,  40,  50,  60,  70,  80,  90,
         100, 200, 300, 400, 500, 600, 700, 800, 900,
         1000, 1001, 1002]

这是,因此最短的答案(以字节为单位)获胜。


2
我们可以打印数字而不是返回列表吗?
亚当

@Adám是的,您可以。
硕果累累

Answers:


8

Haskell72 68 64 63字节

f=(1!)
c!t|t==c=[c]|t>c=c:(c+10^(pred.length.show.min c$t-c))!t

在线尝试!

感谢Sriotchilism O'Zaic的-4个字节!

用法

f 321
[1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100,200,300,310,320,321]

说明

c!t         -- c=current number, t=target number
 |t==c=[c]  -- Target is reached, return last number
 |t>c=c:(c+10^(pred.length.show.min c$t-c))!t
      c:                                        -- Add current number to list
                                min c$t-c       -- The minimum of the current number, and the difference between the current number and the target
                    length.show.                -- The length of this number
               pred.                            -- Minus 1
           10^(                          )      -- Raise 10 to this power
         c+                                     -- Add that to the current number
        (                                 )!t   -- Recursion

4
欢迎来到PPCG!不错的第一答案。
Arnauld

2
我不了解Haskell,但以下任何技巧都可能会有所帮助:Haskell 打高尔夫球的技巧<all language>打高尔夫球的技巧。但我同意,很好的答案。向我+1。
Kevin Cruijssen

2
欢迎光临本站!因为(^)优先级高于(+)您,所以不需要在(^)表达式之间加上括号。这同样适用于(!)(:)
小麦向导

1
pred.length.show.min c$t-c可以缩短为length(show.min c$t-c)-1。可以接受匿名函数,因此您可以按照Haskell中的高尔夫规则指南中的f=说明删除领先者。
Laikoni

1
除了警卫,您只能使用一种情况和一个条件:c!t=c: if t>c then (c+10^(length(show.min c$t-c)-1))!t else []。这允许应用此技巧来节省更多字节:在线尝试!
Laikoni

6

JavaScript(ES6),50个字节

f=n=>n?[...f(n-(1+/(^10)?(0*$)/.exec(n)[2])),n]:[]

在线尝试!

怎么样?

理论

重复以下步骤,直到ñ=0为止:

  • n的十进制表示中寻找尾随零的数字ķñ
  • 如果n10的精确幂,则将ķ1ñ10
  • n减去X=10ķñ

实作

X的值直接使用以下表达式作为字符串计算:

+---- leading '1'
|
1 + /(^10)?(0*$)/.exec(n)[2]
     \____/\___/
        |    |
        |    +---- trailing zeros (the capturing group that is appended to the leading '1')
        +--------- discard one zero if n starts with '10'

注意:排除前导'10'仅会影响10精确乘方(例如ñ=1000),但不会更改ñ=102300值所捕获的尾随零的数量(因为多余的非零中间数字'10'实际上是在这种情况下根本不匹配)。


巧妙地注意到您可以进行“向后”迭代,仅跟踪一个变量!这是一个有点混乱,您使用k的东西比在挑战的描述完全不同的(其实你n是OP的的混合n,并k与你的x是他们i。)
与Orjan约翰森


2

Perl 6的48 41个字节

->\k{1,{$_+10**min($_,k-$_).comb/10}...k}

在线尝试!

说明:

->\k{                                   }  # Anonymous code block taking k
     1,                             ...k   # Start a sequence from 1 to k
       {                           }       # Where each element is
        $_+          # The previous element plus
           10**      # 10 to the power of
                           .comb     # The length of
               min($_,k-$_)          # The min of the current count and the remainder
                                /10  # Minus one

2

APL(Dyalog Unicode),30 字节SBCS

匿名默认前缀功能。在单独的行上将数字打印到标准输出。

{⍺=⍵:⍺⋄⍺∇⍵+10*⌊/⌊10⍟⍵,⍺-⎕←⍵}∘1

在线尝试!

{}∘1 匿名中缀lambda,其中以1开头的ñ咖喱:

⍺=⍵ 如果ķñ相等:

   返回(并隐式打印)ķ

  其他:

  ⎕←⍵ 打印ñ

  ⍺- 从k减去ķ

  ⍵, 前置ñ

  10⍟日志10

   那些那些

  ⌊/ 最少的

  10* 十倍的力量

  ⍵+ñ

  ⍺∇ 使用相同的递归ķñ


2

05AB1E,15 个字节

1[=ÐIαD_#‚ßg<°+

@PaulMutser(第一个)Haskell答案的端口,所以请确保支持他!!

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

输出以换行符分隔的数字。
如果它必须是列表,则必须添加3个字节:

X[DˆÐIαD_#‚ßg<°+}¯

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

说明:

1             # Push a 1 to the stack
 [            # Start an infinite loop
  =           #  Print the current number with trailing newline (without popping it)
  Ð           #  Triplicate the current number
   Iα         #  Get the absolute difference with the input
     D        #  Duplicate that absolute difference
      _       #  If this difference is 0:
       #      #   Stop the infinite loop
      ‚ß      #  Pair it with the current number, and pop and push the minimum
        g   #  Calculate 10 to the power of the length of the minimum minus 1
           +  #  And add it to the current number



1

批处理,131个字节

@set/an=i=1
:e
@if %n%==%i%0 set i=%i%0
@echo %n%
:c
@set/an+=i
@if %n% leq %1 goto e
@set/an-=i,i/=10
@if %i% neq 0 goto c

将输入作为命令行参数,并将数字列表输出到STDOUT。说明:

@set/an=i=1

开始n=1i=1代表10的幂。

:e
@if %n%==%i%0 set i=%i%0

i如果n达到下一个10的幂,则乘以10。

@echo %n%

输出的当前值n

:c
@set/an+=i
@if %n% leq %1 goto e

i可以重复添加while n而不超出输入范围。

@set/an-=i,i/=10

恢复以前的值n并除以i10。

@if %i% neq 0 goto c

如果i不为零,则尝试添加in一次。


1

R67 65字节

-2个字节,感谢Giuseppe

k=scan();o=1;i=10^(k:0);while(T<k)o=c(o,T<-T+i[i<=T&i+T<=k][1]);o

很简单 它需要一组10的幂,超过相反顺序所需的幂i

(我宁愿使用i=10^rev(0:log10(k))而不是,i=10^(k:0)因为后者在计算上效率低下,但是高尔夫就是高尔夫!)。

然后在while循环中,将条件应用于第一个条件i(即最大条件);更新n,并追加到输出

在线尝试!


1
使用T而不是n; 保存一个字节;应该是2,但我认为这TRUE不是可接受的输出k=1,所以我们设置了o=+T尝试一下!
朱塞佩

2
我喜欢那可怕的编码。顺便说一句,我可以设置o=1,并获得第二个字节。
亚伦·海曼


1

,27字节

Wa>Po+:y/t*Y1Ty>o|o+y>ay*:t

在线尝试!

用伪代码:

a = args[0]
o = 1
print o
while a > o {
  y = 1
  till y > o || o + y > a
    y *= 10
  o += y / 10
  print o
}

我对能够缩短此算法的高尔夫技巧感到非常满意。通过初始化,更新和打印循环头中的内容,我可以避免在循环主体中使用花括号。不过,可能有一个高尔夫球手算法。


0

Japt,18个字节

ÆT±ApTmTnU)sÊÉÃf§U

尝试一下

ÆT±ApTmTnU)sÊÉÃf§U     :Implicit input of integer U
Æ                      :Map the range [0,U)
 T±                    :  Increment T (initially 0) by
   A                   :  10
    p                  :  Raised to the power of
     Tm                :    The minimum of T and
       TnU             :      T subtracted from U
          )            :    End minimum
           s           :    Convert to string
            Ê          :    Length
             É         :    Subtract 1
              Ã        :End map
               f       :Filter
                §U     :  Less than or equal to U


0

Prolog(SWI),142字节

L-D-M:-append(L,[D],M).
N-L-C-X-R-I:-I=1,C is X*10,N-L-C-C-R-1;D is C+X,(D<N,L-D-M,N-M-D-X-R-I;D>N,N-L-C-(X/10)-R-0;L-D-R).
N-R:-N-[]-0-1-R-1.

在线尝试!

明天有什么解释

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.