展開と契約


19

入力として正の整数を取ります。スタートと繰り返し増加 10の最大の整数乗で、このようなことと。kn:=1nn+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はい、できます。
エソランジングフルーツ

回答:


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

オンラインでお試しください!

-4バイトをありがとうSriotchilism O'Zaic!

使用法

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へようこそ!いい最初の答え。
アーナルド

2
私はHaskellのを知らないが、多分これらのヒントのいずれかが役立つかもしれない:Haskellではゴルフのためのヒント<すべての言語>でのゴルフのためのヒントを。しかし、私は同意します、いい答えです。私から+1。
ケビンクルーッセン

2
サイトへようこそ!以来(^)高い優先順位であるよりも、(+)あなたの周りの括弧は必要ありません(^)表現を。同じことがのために行く(!)(:)
小麦ウィザード

1
pred.length.show.min c$t-cに短縮できますlength(show.min c$t-c)-1。匿名関数は許容されるため、Haskellのゴルフルールのガイドでf=説明されているように、リーディングを削除できます。
ライコニ

1
ガードの代わりに、1つのケースと条件のみを使用できますc!t=c: if t>c then (c+10^(length(show.min c$t-c)-1))!t else []。これにより、このヒントを適用しさらに数バイトを節約できます。オンラインで試してみてください!
ライコニ

6

JavaScript(ES6)、50バイト

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

オンラインでお試しください!

どうやって?

理論

次の手順は、n=0まで繰り返されます。

  • nの 10進表現で末尾のゼロの数kを探しますn
  • nが正確な10の累乗である場合、kデクリメントしますn10
  • nからバツ=10k引くn

実装

バツの値は、次の式を使用して文字列として直接計算されます。

+---- 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'10n=1000n=102300'10'


1つの変数のみを追跡しながら、「逆方向」にイテレーションを行うことができます。あなたが使用することを少し混乱していますkチャレンジの説明よりも完全に異なる何か(実際にはあなたのためにnOPのミックスであるnkし、あなたがx自分であるi。)
Ørjanヨハンセン


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

オンラインでお試しください!

{}∘1n

⍺=⍵kn

    返す(および暗黙的に出力する)k

  その他:

  ⎕←⍵n

  ⍺-  からそれを引くk

  ⍵,  追加n

  10⍟ログ10

   それらを床

  ⌊/ それらの最小

  10* 10の累乗

  ⍵+n

  ⍺∇ 同じを使用して再帰するkn


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=1し、i=110の力を表します。

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

次の10の累乗に達したi場合nは10で乗算します。

@echo %n%

の現在の値を出力しますn

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

入力を超えずにi追加できる間、繰り返しnます。

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

以前の値を復元し、10 nで除算iします。

@if %i% neq 0 goto c

iがゼロでない場合はin再度追加してみてください。


1

R67 65バイト

-ジュゼッペのおかげで2バイト

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、2番目のバイトを取得できます。
アーロンヘイマン


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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.