整数を負の順序で出力し、毎回最大整数を増やします


44

主な任務

あなたの仕事は、1から始めて、与えられた入力に達するまで再び1を押し続けると増加する整数で降順で整数を印刷し、それから再び1を押すまで残りを印刷することです。入力の例6

1
21
321
4321
54321
654321
Without newlines (valid output):
121321432154321654321
サイドノート:これはOEISのA004736です。また、最初の例(改行あり)は、ルールで指定されている無効な出力です。

入力

コードは、整数または数値の形式であらゆる種類の入力(グラフィカル、STDIN)を取ることができます。

出力

コードは、入力番号に達するまで上記のシーケンスを出力し、再び1に達するまで出力を終了する必要があります。出力は何でもかまいません。したがって、数値、文字列、整数、またはグラフィック出力です。単一の数字を出力する必要があります(文字列の場合、改行はありません)。出力は、必要な数の文字で入力および出力できます(例:)[]

誤解があったので、出力を試すことができる正規表現パターンを次に示します。

^(\D*(\d)+\D*)$

ルール

  • 出力は、何も分割されず、改行も含めない完全な数でなければなりません。
  • アルゴリズムは、何らかの形で現れるNの最初のインスタンス(21inなど121321)をチェックするのではなく、実際の数としてNの最初のインスタンスをチェックする必要があります。
  • 単一の末尾の改行が許可されます。
  • 負の入力の処理は完全にあなたの選択であり、負の数はテストすべきケースではありません。

テストケース

Input: 6
Output: 121321432154321654321

Input: 1 Output: 1

Input: 26 Output: 121321432154321654321765432187654321987654321109876543211110987654321121110987654321131211109876543211413121110987654321151413121110987654321161514131211109876543211716151413121110987654321181716151413121110987654321191817161514131211109876543212019181716151413121110987654321212019181716151413121110987654321222120191817161514131211109876543212322212019181716151413121110987654321242322212019181716151413121110987654321252423222120191817161514131211109876543212625242322212019181716151413121110987654321

Input: 0 Output: 0, Empty, or Error

Input: 21 Output: 121321432154321654321765432187654321987654321109876543211110987654321121110987654321131211109876543211413121110987654321151413121110987654321161514131211109876543211716151413121110987654321181716151413121110987654321191817161514131211109876543212019181716151413121110987654321212019181716151413121110987654321

@Emignaに感謝します。私は彼のアルゴリズムを使用してこれらのテストケースを計算しました。

勝者

勝者が選ばれました!それは印象的な5バイトのErikGolferの答えでした!おめでとうございます!


The output must be a full number ...シーケンス全体、または異なる部分文字列(1、2-1、3-1 ...)のみを意味しますか?最初の例は、このステートメントと一致していないようです。
steenbergh

1
出力が単一の数値でなければならない場合、どのように「配列」になりますか?
smls 16

この配列は出力として受け入れられますか?[1, 21, 321, 4321, 54321, 654321] これはどう?[1,2,1,3,2,1,4,3,2,1,5,4,3,2,1,6,5,4,3,2,1] または、単一の要素を持つ配列について話しているだけ[121321432154321654321]ですか?
smls

1
出力形式について混乱しています。許容範囲の例を挙げていただけますか?数字の配列?スペースで区切られた数字の文字列?
ルイスメンドー

1
正規表現はの出力を許可しますmickey321211mouse。本当に\D部品がある理由はない
edc65

回答:


13

ゼリー、5バイト

RRUVV

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

フォーミュラは私のものではありません。

私はここであまりにも多くが起こっていると思う...

[回答済み]デニスに5人の担当者を派遣しましたが、これは評判交換ではありません。デニスは私にVV行動を示しました。驚いたことに、これは05AB1Eよりも短いです。


おめでとうございます、このコードのコードの量は最小です!
devRicher

19

05AB1E、6バイト

L€LíJJ

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

説明

入力例4

L       # range [1 ... input]
        # STACK: [1,2,3,4]
 €L     # map: range
        # STACK: [[1],[1,2],[1,2,3],[1,2,3,4]]
   í    # reverse each
        # STACK: [[1],[2,1],[3,2,1],[4,3,2,1]]
    J   # join inner lists
        # STACK: ['1','21','321','4321']
     J  # join list
        # OUTPUT: 1213214321

13

JavaScript(ES6)、37バイト

f=(n,k=1)=>k>n?n--?f(n):'':f(n,k+1)+k

デモ

n <10、34バイトの代替方法(非競合)

f=(n,s='1')=>--n?s+f(n,++s[0]+s):s

JavaScriptでは、文字列は不変です。したがって、s新しい値をに割り当てて、文字列のN番目の文字の内容を変更することはできませんs[N]

ただし、式++s[N]は有効であり、文字列が変更されていない場合でも、予想どおりに評価されます。例えば:

++"1"[0] // equals 2

そして拡張により:

s = "21"
++s[0] + s // equals "321"

n> 9
edc65

@ edc65もちろんです。私はそれが9でストップにOKだと思った理由を私は知らない
アルノー

12

V、29 28 27 23 19 17 16バイト

@DJMcMayhemのおかげで8バイト節約

@ nmjcman101のおかげで3バイト節約

"apÀ­ñÄòy$jpkgJ

非表示の文字:

"apÀ<C-x>ñÄ<C-x>òy$jpkgJ

C-x Ctrl + xです。

オンラインでお試しください!コマンドライン引数を介して入力を受け取ります

Hexdump:

0000000: 2261 70c0 adf1 c418 f279 246a 706b 674a  "ap......y$jpkgJ

説明

"ap            Paste the argument
À<C-x>         Argument minus 1 times (so that we exclude the 0)
ñ ... ò        Loop (for some weird reason the ò closes the ñ)
Ä<C-x>         paste current line above and decrement it

次のようになります。

1
2
...
n

続きました...

ò             recursively do (until a breaking error)
y$             yank this line
  jp           paste it down
    kgJ        go up and join
              implicit ò end

GIF(期限切れ)

(argの場合6

gif


私は、暗黙のうちに終わり)にあなたのループを変更することで、いくつかを持って、それは)むしろ終わりに比べて(行くとb)は、行を連結òy$jpkgJ
nmjcman101

@ nmjcman101 2バイトの節約にご協力いただきありがとうございます!
Kritixiリトス

これはかなりゴルフです。私は20分間頭を悩ませてきましたが、これより短いものは考えられません。:)
DJMcMayhem

@DJMcMayhemそれは私にいくつかの大きな助けがあったからです:)
Kritixi Lithos

やったよ!16バイトまで減らすことができます。引数を貼り付けてから、上に複製/デクリメントすると、Hが削除されます。次に、でデクリメント演算子を使用Àすると、xを削除できるように上部に0がなくなります。その後、明らかにa òが閉じ­ñますので、2番目­ñ(保存したバイト)を削除できます。 リンクが意味をなさないため
nmjcman101

11

C#、72 69 65バイト

n=>{for(int i=0,j;i<n;)for(j=++i;j>0;)System.Console.Write(j--);}

コンソールに書き込まれるのではなく、出力を返すことができる場合

C#、71 68 64バイト

n=>{var s="";for(int i=0,j;i<n;)for(j=++i;j>0;)s+=j--;return s;}

多くのバイトを節約してくれた@VisualMelonに感謝

ここでテストします(オンラインコンパイラは420を超えると中断します)


それは本当に速かった。
devRicher

@devRicher私が投稿する何かを待っていた、何を言うことができます:P
アルフィーGoodacre

2
C#コードゴルフでwhileループを使用する理由はありません。for-loopは、良くないにしても常に同様に実行されます。この場合、j=1forループにの割り当てを含め、セミコロンを保存できます。また、を宣言jiて保存することもできintます。を割り当てにi++移動してj=i、バイトを保存することもできます。また、交換することができるはずi<=ni<n、あなたがそれを作る場合はj=++i代わりにして起動i時に0
VisualMelon 16

@VisualMelonが編集し、3バイト節約しました!一緒にint型の宣言実際のバイト数に差は行われませんが、それはループがビット見た目が良くなります
アルフィーGoodacre

@AlfieGoodacre forループで一緒に宣言すると、さらに2バイト節約できますfor(int i=0,j;i<n;);)また{}、内側のforループの必要もありません。
VisualMelon 16

8

ピュアバッシュ、34

eval eval printf %s \\{{1..$1}..1}

2レベルのブレース拡張。入力6では、最初のレベルはに展開され{1..1} {2..1} {3..1} {4..1} {5..1} {6..1}ます。これはに展開され1 2 1 3 2 1 4 3 2 1 5 4 3 2 1 6 5 4 3 2 1、で1つの文字列にまとめられますprintf %sevalの両方の展開レベルで必要です-最初のレベルでは$1パラメータが最初に展開され、2番目のレベルでは最初のレベルの後に展開されます。

オンラインで試す



7

Pyth、7バイト

jks}R1S

整数の入力を受け取り、結果を出力するプログラム。

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

使い方

jks}R1S   Program. Input: Q
jks}R1SQ  Implicit input fill
    R     Map
      SQ  over [1, 2, 3, 4, ..., Q] with i:
   } 1     Yield [i, i-1, i-2, i-3, ..., 1]
  s       Merge
jk        Join
          Implicitly print

個人的に私はそれjk_hC.:Sがより長いが、素晴らしい仕事であることに非常に失望している!
FryAmTheEggman 16

7

GeoGebra、67バイト

1
InputBox[a]
Sum[Join[Sequence[Sequence[Text[j],j,i,1,-1],i,1,a]]]

各行は個別に入力バーに入力されます。入力は入力ボックスから取得されます。

実行のgifは次のとおりです。

プログラム実行

使い方

1暗黙的に入力するとに割り当てaられ1InputBoxコマンドは入力ボックスをに関連付けますa。その後、それぞれのi中に{1, 2, 3, ..., a}、リストを{i, i-1, i-2, ..., 1}使用して作成されたSequenceコマンドを、それぞれjそのリストの中には、使用して文字列に変換されますText。最後に、Joinすべてのリストをマージし、Sumすべての要素を1つのテキストオブジェクトに連結して表示します。


@devRicherそれは理にかなっているようです。ありがとう!
TheBikingViking 16


7

網膜26 22バイト

バイトカウントはISO 8859-1エンコードを前提としています。

.+
$*

$`¶
1
$.%'
0?¶

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

説明

.+
$*

入力を単項に変換します。


$`¶

各位置に、そのポイントまでのプレフィックスと改行を挿入します。これにより、から2までの単項範囲が作成されn+1、1行に1つの値が設定されます。

1
$.%'

それぞれ1を同じ行のその後の文字数で置き換えます。これはのようなもの11111になり43210ます。

0?¶

すべての改行とその前のゼロを削除します。



5

APL、10バイト

∊⍕¨∘⌽∘⍳¨∘⍳

例えば:

      (∊⍕¨∘⌽∘⍳¨∘⍳)6
121321432154321654321

説明:

  • :1からNまでの数字を取得します。
  • ⍳¨∘:それらのそれぞれについて、1からNまでの数字を取得します。
  • ⌽∘:そのリストを逆にする
  • ⍕¨∘:各項目の文字表現を取得します(したがって、間にスペースを入れて数値を出力しません)
  • :結果の配列を平坦化します

コードを逆方向に解析していますか?
devRicher 16

機能組成物である、私は、関数が実際に評価された順番に説明を与えた
マリナス

1
好奇心のための解析ツリーを次に示します。tryapl.org
marinus

5

Python 2、71 68バイト

再帰的な解決策はもっと短いかもしれませんが、これを1つに定式化するのは大変です。

n=input()
i=0
o=""
while i<n:
    i+=1;j=i
    while j:o+=`j`;j-=1
print o

オンラインで試す


5

実際には8バイト

RR♂RΣRεj

Actuallyに初めて回答を投稿するので、おそらくゴルフができます。

使い方

Program takes implicit input, implicit print at EOF
R           Takes the input and creates a range (1, input)   
                STACK = [1,2,..,n]
 R          Reverse the top stack item (our range)
                STACK = [n,..,2,1]
  ♂R        For each item in our range, create a range (1, rangeitem)
                STACK = [[1,2,..,n], .., [1,2], [1]]
    Σ       Stitch the items of the list together
                STACK = [n,..,1,2,3,1,2,1]
     R      Reverse the top stack item again (our answer)
                STACK = [1,2,1,3,2,1,..n]
      εj    Create an empty string and append each item from the list to it.
            (turns non string items into strings)

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


1
より短い解決策あるかどうかはわかりません、以前自分が間違っていることを証明しました。いずれにせよ、ここに回答用のオンライン試用リンクがあります。
Sherlock9

1
コードR♂R♂RΣεjは同じバイト数ですが、説明を書く方が簡単かもしれません。
Sherlock9

@ Sherlock9の方がもう少しエレガントです。昨日追加するのを忘れていたリンクと説明を追加しました。
ティールペリカン


4

Perl 6、22バイト

{[~] flat [\R,] 1..$_}

文字列を返すラムダ。

オンラインで試してください。

説明:

  • 1..$_:整数の範囲... (1 2 3 4)
  • [,] 1..$_:カンマ演算子を減らす( "fold")... (1 2 3 4)
  • [\,] 1..$_:中間結果(三角リデュース)...((1) (1 2) (1 2 3) (1 2 3 4))
  • [\R,] 1..$_反転メタ演算子をコンマに適用...((1) (2 1) (3 2 1) (4 3 2 1))
  • [~] flat ...:リストのネストを削除し、文字列連結演算子を重ねます... 1213214321

4

Haskell、35バイト

f x=[1..x]>>= \y->[y,y-1..1]>>=show

使用例:f 6-> "121321432154321654321"

すべての数字についてx1 ... xメイクリストx,x-1, ... ,1、文字列の中に数字を回し、単一の文字列にそれらを連結します。繰り返しますが、これらの文字列を単一の文字列に連結します。


4

C89、54バイト

i,j;f(n){for(i=1;j<=n;j=i++)while(j)printf("%d",j--);}

56 -2 = 54 ErikGolferに感謝!


最後の(テストされていない)の(j=i++)代わりに(j=i)削除できると思いますi++
エリックアウトゴルファー16

ここでは短い再帰バージョンです:i,j;f(n){j=++i;while(j)printf("%d",j--);i-n?f(n):0;}(52バイト)
Steadybox

@Steadybox必要に応じてそれを独自の回答として追加できますが、ありがとうございます!

@catわかりました、ありがとうございます。あなたのソリューションを編集しただけなので、私はそうすべきかどうかはわかりませんでした。
Steadybox 16

4

Python 3、87 92 83 74バイト

lambda n:"".join(["".join([str(i)for i in range(1,k)][::-1])for k in range(1,n+2)])

再帰を使用した短い回答:

f=lambda n:f(n-1)+"".join([str(i)for i in range(1,n+1)][::-1])if n>0else""

最短ではないかもしれませんが、Pythonのリスト内包表記でのみ作成されています!

(印刷機能を追加し、\ nを削除するように編集)

(印刷機能を削除し、n + 1、k + 1をn、k + 2に変更するように編集)


k、n + 2で動作しますが、k + 2、nでは動作しません。ただし、アイデアに感謝します:)
Sygmei

得点するコードが最初になります。また、Python 2を使用してからの`i`代わりに使用する必要がありstr(i)ます。そして、の"".join(...)代わりにを使用して"".join([...])range(1,k,-1)を削除できます[...][::-1]
mbomb007 16

また、n>0することができますn。そして、私は意味したrange(n,0,-1)。そして使用しますn and f(n-1)+...)or""
mbomb007 16

1
62バイト。実際、これはこの回答に近づきすぎている可能性があります
mbomb007 16

はい、これはかなり近づいています。2番目のバージョンを実行した後:(
Sygmei

3

Pyth、8バイト

jks_M._S

説明

jks_M._SQ   Implicit input
       SQ   Get the range [1, 2, ..., N]
     ._     Get each prefix
   _M       Reverse each prefix
jks         Join everything as a string


3

Mathematica、36バイト

ToString/@(""<>Range[Range@#,1,-1])&

安全に無視できる警告の束をスローします。

説明

5例として入力を使用する:

Range@#

範囲を作成します{1, 2, 3, 4, 5}

Range[...,1,-1]

Rangeリスト可能なので、任意の引数のリストを指定でき、その引数を自動的にスレッド化します。そのため、これにより一連の逆のリストが得られます。

{{1}, {2, 1}, {3, 2, 1}, {4, 3, 2, 1}, {5, 4, 3, 2, 1}}

次:

(""<>...)

これにより、ネストされたリストが空の文字列に結合されます。ネストされたリストには実際には文字列が含まれていないため、実際には値を結合できません(警告が生成される場所)が""<>、リストをフラット化する副作用があります。だからこれは私たちに与えます

1 <> 2 <> 1 <> 3 <> 2 <> 1 <> 4 <> 3 <> 2 <> 1 <> 5 <> 4 <> 3 <> 2 <> 1

Mathematicaの美しい機能が登場Mapしますが、これはマッピングする構造を気にしません。通常はリストに適用しますが、どのヘッドでも機能します。f /@ h[a, b, c]単にあなたに与えますh[f[a], f[b], f[c]]。この場合、head StringJoinはで、valueは整数です。

ToString/@...

したがって、これは単に整数を文字列に変換します。その時点でStringJoin[...]、それらをどう処理するかがわかり、それらをすべて単一の文字列に結合します。

"121321432154321"

1
それは単なる厄介です。:)
グレッグマーティン

3

GolfScript、14バイト

~,{),{)}%-1%}%

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

もちろん通常の方法ですが、これはGolfScriptです。

このVASTコードの説明:

~,{),{)}%-1%}% # Code
               # Initial stack.      ["n"]
~              # Eval ToS.           [n]
 ,             # ToS' lowered range. [[0..n)]
  {),{)}%-1%}  # Block. 1 argument.  [a]
   )           # Increment.          [a+1]
    ,          # Range.              [[0..a)]
     {)}       # Block. 1 argument.  [b]
      )        # Increment.          [b+1]
        %      # Map.                [[1..a]]
         -1    # Integer. -1         [[1..a] -1]
           %   # Each nth element.   [[a..1]]
             % # Map.                [[[1],[2,1],...,[n..1]]]
               # Implicit output.    121...n..1

出力は単一の数値であることに注意してください。末尾\n


3

R、38 33 44バイト

if((n=scan())>0)for(i in 1:n)cat(i:1,sep="")

STDINへの入力を受け取り、1からnまでループし、各ステップでシーケンスiから1を作成して印刷します。

編集:5バイトを保存し、会議中にゴルフをしない理由を示すことで置き換えられましseq(i,1)i:1


これは101、入力がの場合に生成されます0if((n=scan())>0)for(i in 1:n)cat(i:1,sep="")トリックを行います。
フレデリック

くそー、ゼロ以外の入力を想定:(
JAD

if(n<-scan())十分なはずです。
ジュゼッペ

3

MATL14 11バイト

:"@:P]v!VXz

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

説明

:      % Input N implicitly. Push range [1 2 ...N]
"      % For each k in [1 2 ...N]
  @:   %   Push range [1 2 ... k]
  P    %   Reverse
]      % End
v!     % Concatenate all arrays horizontally
V      % Convert to string
Xz     % Remove spaces. Display implicitly

not split up by anything、2番目のものが許可されるとは思わないでください。
JAD

2
私はOPの明確化まで1つ削除します@JarkoDubbeldam
ルイスMendo

1
@Jarko OPが明確になりました。現在のソリューションは仕様に準拠しています
ルイスメンドー

3

brainfuck、17バイト

>,[>[+.>]+.[<]>-]

説明

>           keep the first cell at 0
 ,          input of the decimal number into the cell
  [>        start a conditionnal loop and go to the next cell
   [+.>]    while it don't find 0, increment each cells and output the value
    +.      increment the new cell and output
     [<]    go to the first cell
      >-]   decrement the second cell and restart

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


PPCGへようこそ!ツアーページと最もホットなメタの質問をまだ読みましたか?私はあなたにアドバイスします、彼らは役に立ちます!また、コードをコードフォーマットでラップします。フォーマットのヘルプを読みましたか?また、可能であれば、コードの動作を説明する必要があります!
devRicher

私は説明を追加した@muddyfish
Milihhard

モバイルアプリを使用しました。結果の画面を見ることができます。
ミリハード16

大丈夫です。あなたが本当に出力は表示されませんので、しかし、リンクには、出力に含まは、ASCIIではなく小数である
Milihhard

@muddyfishあなたのパーマリンクはちょっとわかりにくいです。入力には目に見えない0x06があり、その後に10進数の数字6が続きます。
デニス

3

Python63 57 59バイト

Python 2と3の両方で動作する再帰的なソリューション。これはおそらくさらにゴルフをすることができます。ゴルフの提案を歓迎します!オンラインでお試しください!

編集:ジョナサンアランのおかげで-6バイト。私の答えの問題を指摘してくれたmbomb007に感謝します。

f=lambda n:n and f(n-1)+"".join(map(str,range(n,0,-1)))or""

アンゴルフ

def f(n):
    s = ""
    for i in range(n+1):
        m = map(str, range(n, 0, -1))
        s += "".join(m)
    return s

2
使用map6つのバイトを保存するには:lambda n:n and f(n-1)+"".join(map(str,range(n,0,-1)))or""
ジョナサン・アラン

2

PHP、35 34 33バイト

Titusに感謝します。そしてもう一つ!

while($i++<$argv[1])echo$s=$i.$s;

コマンドラインから実行 -rます。

非常に簡単な答えです。1から入力までループしn、数字を文字列の先頭に追加して出力します。


私は34を数えます。ポストインクリメントで1バイト短くなります。
タイタス

33バイト:while($i++<$argv[1])echo$s=$i.$s;
16

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