同じ数字を逆にして、1からnまでの数字をインターリーブします


34

簡単なもの:

正の整数を取るN 1000未満、及び出力から整数1nがから整数でインターリーブN1。数字を連結して、区切り記号なしで数字が表示されるようにする必要があります。

テストケース:

n = 1
11

n = 4
14233241

n = 26
12622532442352262172081991810171116121513141413151216111710189198207216225234243252261

n = 100
110029939849759669579489399210911190128913881487158616851784188319822081218022792378247725762675277428732972307131703269336834673566366537643863396240614160425943584457455646554754485349525051515052495348544755465645574458435942604161406239633864376536663567346833693270317130722973287427752676257724782379228021812082198318841785168615871488138912901191109299389479569659749839921001

これはため、各言語のバイト単位の最短の提出が勝ちです。説明が奨励されます。

回答:


16

JavaScript(ES6)、30バイト

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

どうやって?

これは非常に簡単ですが、文字列が末尾から先頭まで構築されることに注意する価値があります。冒頭の空の文字列は最後に追加され、最終結果を文字列に強制することができます。

以下は、再帰の詳細ですf(4)

f(4) =                                            // initial call
f(4, 1) =                                         // applying the default value to k
f(3, 2) + 4 + 1 =                                 // recursive call #1
(f(2, 3) + 3 + 2) + 4 + 1 =                       // recursive call #2
((f(1, 4) + 2 + 3) + 3 + 2) + 4 + 1 =             // recursive call #3
(((f(0, 5) + 1 + 4) + 2 + 3) + 3 + 2) + 4 + 1 =   // recursive call #4
((('' + 1 + 4) + 2 + 3) + 3 + 2) + 4 + 1 =        // n = 0 --> end of recursion
'' + 1 + 4 + 2 + 3 + 3 + 2 + 4 + 1 =              // final sum
'14233241'                                        // final result

テストケース


10

Python 2、46バイト

lambda n:''.join(`x+1`+`n-x`for x in range(n))

4バイトのovsに感謝

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

説明:

lambda n:''.join(`x+1`+`n-x`for x in range(n))
lambda n:                                      # anonymous lambda taking one parameter n
                 `x+1`+`n-x`                   # `x` is repr(x) which is equivalent to str(x) for integers less than INT_MAX
                            for x in range(n)  # integers x in [0, n)

1
二つは、Python 3に複数のバイト:f'{x}{n-~-x}'
L3viathan

2
@ L3viathanこれは、3.6で追加された新しい機能です。
メゴ

1
Python 3.6はPython 3ではありませんか?
-L3viathan

6
lambda n:''.join('x+1'+'n-x'for x in range(n))46バイトの場合('リストの内包表記をバッククォートに置き換えます)
-ovs

6
@ovsちょっと、あなたはバックティックをエスケープすることができます->に`\`x+1\``レンダリング`x+1`
ロッド


7

Bash、25バイト

printf %s`seq $1 -1 1|nl`

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

減少するシーケンスを印刷し、行数を増やし、printfで行を結合します

スペース区切り、20バイト:seq $ 1 -1 1 | nl | xargs


それが受け入れられない場合、seq $1 -1 1|nl|tr -d ' \n\t'8バイト以上変更することができます
-marcosm

1
20バイトの送信は無効です。私の賛成票は25バイトの提出です。
デジタル外傷

Digital Traumaが指摘したように、20バイトのソリューションは無効です。
エリックアウトゴルファー

time printf %s'seq 1000000 -1 1|nl'; grep name /proc/cpuinfo real 0m7.985s user 0m6.092s sys 0m0.392s model name : Intel(R) Pentium(R) D CPU 3.00GHz model name : Intel(R) Pentium(R) D CPU 3.00GHz
-marcosm

7

R、35バイト

n=scan();cat(rbind(1:n,n:1),sep="")

オンラインで試す

rbind(1:n,n:1)最初の行に1〜n、2番目の行にn〜1の2行の行列を作成します。cat関数は、各列を下に読み取り、このマトリックスを崩壊します。


1
これは対話モードでのみ機能し、ユーザーはn(stdin経由で渡すのではなく)コマンドラインで入力する必要があることに注意してください。
シャドウトーカー

@ssdecontrolはい、それは通常許可されていると思いますが、私はここでかなり新しいので、間違っているかもしれません。
user2390246

私はそれが一般的に許容可能だと思うが、NBは、あなたはフッターのフィールドに入力(複数可)を配置する必要があり、適切TIOでそれを実行するために(そしてそれは、リンクを含めることは常に良いことだ!)tio.run/nexus/...
ジュゼッペ

6

05AB1E6 5バイト

revで提案された新しいインターリーブ組み込みを使用してバイトを保存しました

LÂ.ιJ

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

説明

L        # range [1 ... input]
 Â       # create a reversed copy
  .ι     # interleave the lists
    J    # join

revという名前のユーザーが提案しましたLÂ.ιJ
ジョナサンフレッチ

@JonathanFrech:チャレンジよりも新しい機能を使用できるというコンセンサスが得られていることは知っていますが、新しいビルトインがチャレンジをより良く完了させるため、通常は古い回答を編集するのをためらいます。そのように改善することができるすべての非常に多くの答えがあります:)
Emigna

まあ、私はメッセンジャーでした。可能性のある@revは独自の回答を投稿する必要があります。
ジョナサンフレッチ

@JonathanFrech:それを非難するつもりはなかった。Revは、新しいビルトインが作成されるたびに新しい回答を投稿するよりも既存の回答を編集する方が良いため、編集を提案したときに正しくそれを行いました。少なくとも提案がなされたときは、私は本当に古い答えを修正するのがもっと上手になるはずです。
エミグナ

4

CJam、10バイト

ri,:)_W%]z

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

説明

ri   e# Read input and convert to integer N.
,    e# Turn into range [0 1 ... N-1].
:)   e# Increment to get [1 2 ... N].
_W%  e# Duplicate and reverse the copy.
]    e# Wrap both in an array to get [[1 2 ... N] [N ... 2 1]]
z    e# Transpose to get [[1 N] [2 N-1] ... [N-1 2] [N 1]]
     e# This list is printed implicitly at the end of the program,
     e# but without any of the array structure (so it's essentially flattened,
     e# each number is converted to a string and then all the strings
     e# are joined together and printed).


4

空白、71バイト

   
 
 	
		 
 			
  
 
	   	
	    
 	
 	 
	 
 	
 	   	
	  	 
 
	 	

 


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

説明

sssn  ; push 0 - seed the stack with 0 (this will be our 1->n counter, a)
sns   ; dup
tntt  ; getnum - read n (stored on the heap)
sns   ; dup
ttt   ; retr - pull n onto the stack (this will be our n->1 counter, b)
nssn  ; label 'loop'
snt   ; swap - bring a to the top
ssstn ; push 1
tsss  ; add - increment a
sns   ; dup
tnst  ; putnum - output a as a number
snt   ; swap - bring b to the top
sns   ; dup
tnst  ; putnum - output b as a number
ssstn ; push 1
tsst  ; sub - decrement b
sns   ; dup
ntstn ; jez 'exit' if b is 0
nsnn  ; jmp 'loop'

スタックを正しくセットアップするには、最初の2つの命令が必要です。ホワイトスペースの入力コマンドはヒープに書き込みます。そのため、b(入力値)をスタックにコピーする必要があります。1の代わりに0を宣言する方が短い(バイトを保存する)ため、a = 0から始め、対処するためにインクリメント命令を並べ替えるだけです。その後、bが0(デクリメント後にチェック)に達するまで、a、出力a、出力b、デクリメントbをループしてインクリメントします。


後続の空白をすべて削除すると、これははるかに多くなる可能性があります。P
cat

4

Haskell、65 48 47バイト

Laikoniのおかげで1バイト節約:

f n=show=<<(\(l,r)->[l,r])=<<zip[1..][n,n-1..1]

nimiのおかげで6バイト節約されました:

f n=show=<<(\(l,r)->[l,r])=<<zip[1..n][n,n-1..1]

以前の回答と説明:

f n=concatMap show$concatMap(\(l,r)->[l,r])(zip[1..n][n,n-1..1])

ここにはすでにより良いHaskellの回答がありますが、私はHaskellとコードゴルフの両方が初めてなので、投稿することもできます:)

この関数は、リスト[1..n]を逆に圧縮して、タプルのリストを作成します。

[(1,n),(2,n-1),(3,n-2)..(n,1)]

次にconcatMap、ラムダをこのタプルのリストにマップして、リストのリストを作成します...

[[1,n],[2,n-1],[3,n-2]..[n,1]]

...そしてそれを連結します。

[1,n,2,n-1,3,n-2..n,1]

次に、最後にリストにconcatMapマップshowし、それを単一の文字列に連結します。

f 26 "12622532442352262172081991810171116121513141413151216111710189198207216225234243252261"


2
infix関数=<<は(リストモナド内で)以下と同じconcatMapですf n=show=<<(\(l,r)->[l,r])=<<zip[1..n][n,n-1..1]
-nimi

1
1)現在のソリューションはわずか48バイトです。2)ドロップnインできます[1..n]オンラインで試してみてください!
ライコニ

1)1つずつのエラーを解消します... 2)お電話ください!
ダンアンブロジオ

3

Pyth、7バイト

jksC_BS

オンラインで試す:デモンストレーション

説明:

jksC_BSQ   implicit Q (=input number) at the end
      SQ   create the range [1, ..., Q]
    _B     bifurcate by inversion, this gives [[1, ..., Q], [Q, ..., 1]]
  sC       zip and flatten result
jk         join to a string


3

Perl 6、20バイト

{[~] 1..*Z~($_...1)}

試して

入力が100000の場合、これにはコンパイルと出力の印刷を含めて約10秒かかります。

拡張:

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

  [~]            # reduce using concatenation operator 「&infix:«~»」
                 # (shorter than 「join '',」)

    1 .. *       # Range from 1 to infinity

    Z~           # zip using concatenation operator

    ( $_ ... 1 ) # deduced sequence starting at the input
                 # going down to 1
}

Z~必要~それ以外の場合は、スペースで文字列化されますリストのリストを生成しているため。

Z入力リストのいずれかがなくなると停止するため、1から始まる範囲を制限する必要はありません。
これにより2バイト節約されます(後にスペースが必要になります$_


3

Java 61バイト

(int n)->{for(int i=0;i<n;System.out.print(i+1+""+(n-i++)));}

2
また、PPCGへようこそ!:)
スチューウィーグリフィン

匿名関数を許可しているため、ここ(int n)->{//for loop}で動作するはずです。
ネイサンメリル

それは良いですか?
-cheemcheem

2
うん!System.out.print()forループの最後のステートメントに潜在的に置くことができますが、i2回使用しているため複雑になります(そして式でそれをインクリメントする必要があります)。
ネイサンメリル

ループ内に印刷物を入れて、最後の可能な場所でiをインクリメントし、テストケースでそれが機能することを確認しました。ありがとう@NathanMerrill
cheemcheem

3

ゼリー、5バイト

RṚĖVV

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

使い方

RṚĖVV  Main link. Argument: n

R      Range; yield [1, ..., n].
 Ṛ     Reverse; yield [n, ..., 1].
  Ė    Enumerate; yield [[1, n], ..., [n, 1]].
   V   Eval; convert each flat array to a string, interpret it as a Jelly program,
       and yield the output. This concatenates the integers in each pair, yielding
       a flat array of integers
    V  Repeat the previous step, concatenating the intgegers from before.


2

Clojure、61バイト

#(let[a(range 1(+ 1 %))](apply str(interleave a(reverse a))))

文字通り、求められていることを行います。それほどささいな解決策では解決できないと思います。

オンラインで見る


2

Aceto25 22バイト

)&
pX`=
(pl0
id@z
r}Z)

説明:

整数を読み取り、2つのスタックに配置します。

id
r}

1つはrange_up(Z)を呼び出し、もう1つはrange_down()を呼び出しz、キャッチマークを設定して後でこの場所に戻ることができるようにします。

  @z
  Z)

次に、現在のスタックが空かどうかを確認し、空の場合は終了します。

 X`=
  l0

それ以外の場合は、両方のスタックから印刷し、キャッチマークに戻ります。

)&
p
(p

2

R、41バイト

pryr::f(for(i in 1:x){cat(i);cat(x-i+1)})

pryr::f()1つの入力を受け取る関数を作成します。の1:x各要素と1:x一緒にループし、の各要素を出力しますx:1。STDOUTに出力します。



@ssdecontrolのほとんどの主要な置換function(x):)
JAD


2

MATL、13 11 9バイト

@Luisのおかげで2バイト節約

:tPv1eVXz

MATL Online試しください

説明

        % Implicitly grab input as a number, N
:       % Create an array from 1..N
tP      % Create a reversed copy
v       % Vertically concatenate the two
1e      % Reshape it into a row vector
V       % Convert to a string
Xz      % Remove whitespace and implicitly display

@LuisMendo Ah!空白を削除する機能があると思ったが、見つからなかった。ありがとう!
スーバー

2

PHP、36 35 29バイト

for(;$argn;)echo++$i,$argn--;

JörgHülsermannのおかげで1バイト節約できました。
Christophのおかげで6バイト節約されました。


3
えっと… for(;$argn;)echo++$i,$argn--;
クリストフ

2

Scala、43バイト

それは最高ではありませんが、それは私の最初のコードゴルフです。

n=>1.to(n).foldLeft("")((s,x)=>s+x+(n-x+1))

2

V、20バイト

ywo1@"­ñykPjñkògJ

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

説明する:

yw                    ' Copy the input number (for looping later)
  o1                 ' Insert a 1 under the input (on a newline)
     @"               ' [Copy register] number of times
       ­ñ      ñ       ' Do the thing inside of this loop
        ykP           ' Copy the current line and line above it, and paste above both
           j        ' decrement the current (top) number, and increment the one below
               k      ' Go to the top line
                ògJ   ' recursively join all of the lines

2

Cubix、17バイト

....1I>sO)su.@?(O

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

cubified:

    . .
    . .
1 I > s O ) s u
. @ ? ( O . . .
    . .
    . .

プッシュ1し、入力を読み取り(I)、ループに入り、スタックの最上部をスワップし、出力し、増分し、スワップし、スタックの最上部を出力し、デクリメントし、スタックの最上部が0の場合に停止します。



2

MathGolf、5バイト

{îkï-

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

説明:

{      Run a for loop over implicit input
 î     Push 1 based index of loop
  k    Push inputted number
   ï-  Subtract 0 based index of loop
       Implicitly output all this joined together

1
私は、同じ結果が得られる長さ5の13個のプログラムを見つけることができました:╒{ïí,╒{ïk,╒{íï-╒{kï-╒{┐í,╒{┐k,╒x{î\ {îïí,{îïk,{îíï-{îkï-{î┐í,{î┐k,。しかし、長さ4以下のプログラムを見つけることができませんでした。完全な検索は行っていませんが、MathGolfには5バイトが最適である可能性が非常に高いです。
9



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