465アレンジメント


24

これが課題です。範囲内のすべての整数を出力するコードを作成します。簡単に聞こえますが、ここで注意が必要な部分があります。最小の番号から開始し、次に最大の番号になります。次に、配列にまだない最小の番号。それから、まだその中にない最高。

例:

1〜5を開始点としてみましょう

番号は[1、2、3、4、5]です。

私たちは最初のものを取るので、[1]。残りの数字は[2、3、4、5]です。最後に、新しい配列は[1、5]です。残りの数字は[2、3、4]です。最初の新しい配列は[1、5、2]です。残りの数字は[3、4]です。最後の新しい配列は[1、5、2、4]です。残りの数字は[3]です。最初の新しい配列は[1、5、2、4、3]です。残りの数字はありません、完了です。出力[1、5、2、4、3]

ルール:

  • これはコードゴルフです。最小のバイト数で、あらゆる言語で記述してください。
  • 標準的な抜け穴はありません。
  • オンライン通訳へのリンクをお願いします。(例:https : //tio.run/
  • 2つの入力、両方とも整数。範囲の下限と範囲の上限。
  • 出力のデータ型は何でも構いませんが、正しい順序で数字を表示する必要があります。

低:4高:6結果:4 6 5


低:1高:5結果:1 5 2 4 3


低:-1高:1結果:-1 1 0


低:-1高:2結果:-1 2 0 1


低:-50高:50結果:-50 50 -49 49 -48 48 -47 47 -46 46 -45 45 -44 44 -43 43 -42 42 -41 41-40 40 -39 39 -38 38 -37 37 -36 36 -35 35 -34 34 -33 33 -32 32 -31 31 -30 30 -29 29 -28 28 -27 27 -26 26 -25 25 -24 24 -23 23 -22 22 -21 21- 20 20 -19 19 -18 18 -17 17 -16 16 -15 15 -14 14 -13 13 -12 12 -11 11 -10 10 -9 9 -8 8 -7 7 -6 6 -5 5 -4 4 -3 3 -2 2 -1 1 0


ハッピーゴルフ!


2
ほとんど重複しています(違いは、マージする前に後半を逆にする必要があることです)。
ピーターテイラー

入力は常にローエンド、ハイエンドの順になりますか?
Sumner18

1
@ Sumner18はい。ここのコミュニティは入力検証に対して行き詰まっており、逆順序の入力を要求していないので、常に低から高になると想定できます。
AJファラデー

1
@ Sumner18これらの課題が通常どのように機能するかは、無効な入力がどのように処理されるかを気にしないことです。コードは、有効な入力を処理する方法によってのみ成功と判断されます(つまり、両方とも整数で、最初のコードは2番目の
コード

1
@AJFaraday:Xが常にYよりも厳密に低い(つまりX!= Y)ことを示すメモをメイン投稿に追加する必要があります。このコメントを見逃しました;)
digEmAll

回答:


15

R38 37 36バイト

function(a,b)rbind(a:b,b:a)[a:b-a+1]

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

  • @ user2390246のおかげで-1バイト
  • @Kirill Lのおかげで-1バイト

Rが列ごとに行列を格納するという事実を活用する


を使用することrbindは私のアプローチよりもはるかに優れていますが、の[seq(a:b)]代わりにを使用して1バイト節約できますunique
user2390246

そうです、a <b(決して等しくない)と指定されているコメントを逃したので、次を使用できますseq(a:b)
digEmAll

@digEmAll私の解決策は本質的にパズルの文字通りの解釈であり、このようなことをすることすら考えもしなかったでしょう。印象的な、賛成票を持っています!
Sumner18



8

R65 64 61 60バイト

ロバートSのおかげで-1バイト

-4さらにdigEmAllに感謝

x=scan();z=x:x[2];while(sum(z|1)){cat(z[1],"");z=rev(z[-1])}

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


に置き換えlength(z)sum(z|1)1バイトを節約できます:)
Robert S.

私はそれがどのように機能するか理解していませんが、私はそれが推測する。sum(z | 1)は常に少なくとも1に評価されるように思われるため、whileループは無限にループします。どうやらない
Sumner18

4
zはベクトルです。そのベクトルの各要素には1が割り当て|られます。これは常に1に等しくなります。合計をとると、ベクトルがTRUEsで埋められるため、結果はベクトルの長さに等しくなります。ベクトルが空の場合、これは何にも関係ない|ため、出力ベクトルはlogical(0)です。その合計を取ると、0
OganM



5

PowerShell59 48バイト

param($a,$b)(($z=0..($b-$a))|%{$a+$_;$b-$_})[$z]

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

(長いようです...)

入力を受け取り$a$b、範囲を構成する0 .. ($b-$a)、には、その店舗$z、その範囲をループ。その範囲のループは、十分な反復を取得するためのカウンターとしてのみ使用されます。繰り返しごとに、加算/減算を使用してパイプライン上に配置$a$bます。それは私たちに何かを与える1,5,2,4,3,3,4,2,5,1ので、元の配列0$b-$a(つまりカウント)までそれをスライスする必要があるので、適切な要素だけが残っています。それはパイプラインに残り、出力は暗黙的です。

-11バイトはmazzyのおかげです。



@mazzyああ、私はその$b-$aトリックが好きです-それは賢いです!
AdmBorkBork

5

05AB1E、6バイト

ŸDvć,R

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

説明

Ÿ        # push range [min ... max]
 D       # duplicate
  v      # for each element in the copy
   ć,    # extract and print the head of the original list
     R   # and then reverse it

インターリーブを使用したŸ2ä`R.ι非反復ですが、これはまだはるかに優れています。
マジックタコop

1
@MagicOctopusUrn:最初に非反復ソリューションを試しましたが、知らなかったのでさらに悪化しました;)
Emigna

私が念頭に置いていたものと同様、私からの明らかな+1。@MagicOctopusUrnを通​​じて、代替の7バイトも気に入っています。:)
ケビンクルーッセン

1
@KristianWilliams:私のために働いているようです。
エミグナ

1
@KevinCruijssen:とにかく直感的に感じたので、代わりにペアに切り替えました:)
Emigna



4

R、51バイト

function(x,y,z=x:y)matrix(c(z,rev(z)),2,,T)[seq(z)]

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

説明:x:y長さNのシーケンスの場合、最上行のx:yシーケンスと最下行のy:xシーケンスで構成される2行N列の行列を作成しますmatrix(c(z,rev(z)),2,,T)Nマトリックスの最初の要素を選択すると、[seq(z)]列ごとに選択され、必要な出力が得られます。

digEmAllによるアウトゴルフ


1
ちょうどあなたの30秒前に非常に似たアプローチを投稿しました:D
digEmAll

@digEmAllはい、しかしあなたの方がずっといいです!
user2390246

4

cQuents、19バイト

#|B-A+1&A+k-1,B-k+1

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

TIOのインタープリターが最新ではないため、現在TIOでは機能しないことに注意してください。

説明

#|B-A+1&A+k-1,B-k+1
                      A is the first input, B is the second input
#|B-A+1               n = B - A + 1
       &              Print the first n terms of the sequence
                      k starts at 1 and increments whenever we return to the first term
        A+k-1,         Terms alternate between A + k - 1 and
              B-k+1     B - k + 1
                       increment k



4

JVMバイトコード(OpenJDK asmtools JASM)、449バイト

enum b{const #1=Method java/io/PrintStream.print:(I)V;static Method a:(II)V stack 2 locals 4{getstatic java/lang/System.out:"Ljava/io/PrintStream;";astore 3;ldc 0;istore 2;l:iload 2;ldc 1;if_icmpeq t;aload 3;iload 0;invokevirtual #1;iinc 0,1;iinc 2,1;goto c;t:aload 3;iload 1;invokevirtual #1;iinc 1,-1;iinc 2,-1;c:aload 3;ldc 32;i2c;invokevirtual java/io/PrintStream.print:(C)V;iload 0;iload 1;if_icmpne l;aload 3;iload 0;invokevirtual #1;return;}}

ゴルフをしていない(そして少しきれいな)

 enum b {    
    public static Method "a":(II)V stack 5 locals 4 {
        getstatic "java/lang/System"."out":"Ljava/io/PrintStream;";
        astore 3;
        ldc 0;
        istore 2;
    loop:
        iload 2;
        ldc 1;
        if_icmpeq true;
    false:
        aload 3;
        iload 0;
        invokevirtual "java/io/PrintStream"."print":"(I)V";
        iinc 0,1;
        iinc 2,1;
        goto cond;
    true:
        aload 3;
        iload 1;
        invokevirtual "java/io/PrintStream"."print":"(I)V";
        iinc 1,-1;
        iinc 2,-1;
        goto cond;
    cond:
        iload 0;
        iload 1;
        if_icmpne loop;
        aload 3;
        iload 0;
        invokevirtual "java/io/PrintStream"."print":"(I)V";
        return;
    }
}

スタンドアロン機能。Javaから呼び出す必要があります。 b.a(num1,num2)

説明

このコードでは、メソッドパラメーターを変数として使用し、ローカル#3でブール値を使用して出力する数値を決定します。左または右の各ループ反復が出力され、その数値は左の場合は増分され、右の場合は減分されます。両方の数値が等しくなるまでループが続き、その数値が出力されます。

... バイトカウントが大幅に抑えられているという明確な感覚がある


4

Wolfram言語(Mathematica)56 54バイト

これは私の初めてのゴルフです!

f[a_,b_]:=(c=a~Range~b;Drop[c~Riffle~Reverse@c,a-b-1])

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

インフィックス表記法を使用して2バイトを保存しました。

説明:

f[a_,b_]:=                                   \function of two variables
c=a~Range~b;                                 \list of integers from a to b 
                           Reverse@c         \same list in reverse
                  c~Riffle~Reverse@c         \interleave the two lists
             Drop[c~Riffle~Reverse@c,a-b-1]  \drop last |a-b-1| elements (note a-b-1 < 0)

または、Take[...,b-a+1]同じ結果に使用できます。

テスト:

f[4, 6]
f[1, 5]
f[-1, 1]
f[-1, 2]

出力:

{4, 6, 5}
{1, 5, 2, 4, 3}
{-1, 1, 0}
{-1, 2, 0, 1}

「オンラインで試す」リンクは403を返します。「申し訳ありませんが、このアイテムにアクセスする権限がありません。」
Rohit Namjoshi

@RohitNamjoshiリンクを更新しました
Kai

TIOでは、実際のコードボックスの上下のテキストボックスにヘッダーコードとフッターコードを配置できることに注意してください。これにより、コードが見やすくなり、PPCG回答フォーマッター(esc-sg)を利用できるようになります。オンラインでお試しください!
ジョーキング

@JoKingは非常にありがたいです、私は前にそれを使ったことがありませんでした!
カイ





3

Forth(gforth)、52バイト

: f 2dup - 1+ 0 do dup . i 2 mod 2* 1- - swap loop ;

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

説明

0から(終了-開始)にループします。EndとStartをスタックの一番上に配置します。

各反復:

  • 現在の番号を出力する
  • 現在の数から1を加算(または減算)します
  • 現在の番号を他の番号に切り替えます

コードの説明

: f           \ start new word definition
  2dup -      \ get the size of the range (total number of integers)
  1+ 0        \ add 1 to the size because forth loops are [Inclusive, Exclusive) 
  do          \ start counted loop from 0 to size+1
    dup .     \ output the current top of the stack
    i 2 mod   \ get the index of the loop modulus 2
    2* 1-     \ convert from 0,1 to -1,1
    -         \ subtract result from top of stack (adds 1 to lower bound and subtracts 1 from upper)
    swap      \ swap the top two stack numbers 
  loop        \ end the counted loop
;             \ end the word definition


3

Haskell、30バイト

l%h=l:take(h-l)(h:(l+1)%(h-1))

使用法: 3%7 `[3,7,4,6​​,5]を返します

入力l, hの場合、関数はinputsを使用して再帰的に呼び出しl+1, h-1、開始に追加l,hします。停止条件の代わりに、コードはtake(h-l)シーケンスを適切な長さに短縮するために使用します(それ以外の場合は、数の増加と減少の無限のシーケンスになります)。


3

Brachylog、15バイト

⟦₂{∅|b↔↰T&hg,T}

入力は2要素リスト[lo、hi]です。負数にはアンダースコアが使用されることに注意してください。オンラインでお試しください!

説明

⟦₂               2-argument inclusive range: [1,5] -> [1,2,3,4,5]
  {           }  Call this recursive predicate to calculate the output:
   ∅               Base case: the input is empty list; nothing to do
    |              Otherwise (recursive case):      [1,2,3,4,5]
     b             Behead the input list            [2,3,4,5]
      ↔            Reverse                          [5,4,3,2]
       ↰           Call the predicate recursively   [5,2,4,3]
        T          Label the result T
         &         Also, with the input list,
          h        Take the head                    1
           g       Wrap it in a list                [1]
            ,T     Append T from earlier            [1,5,2,4,3]

3

MathGolf、6バイト

↨_x^─▀

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

との説明 (1, 5)

↨        inclusive range from a to b    [1, 2, 3, 4, 5]
 _       duplicate TOS                  [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]
  x      reverse int/array/string       [1, 2, 3, 4, 5], [5, 4, 3, 2, 1]
   ^     zip top two elements on stack  [[1, 5], [2, 4], [3, 3], [4, 2], [5, 1]]
    ─    flatten array                  [1, 5, 2, 4, 3, 3, 4, 2, 5, 1]
     ▀   unique elements of string/list [1, 5, 2, 4, 3]

これが機能する理由は、出力内のすべての要素が一意である必要があるためです。そのため、一意の要素演算子は配列の後半を除外し、正しい出力を生成します。






2

Cubix、16バイト

;w(.II>sO-?@;)^/

ここで試してみてください

立方体

    ; w
    ( .
I I > s O - ? @
; ) ^ / . . . .
    . .
    . .

説明

基本的に、これは2つの境界を、それらが出会うまで一度に1ステップずつ近づけます。ループを通過するたびにs、境界をwapし、Outputし、差を取り、符号に基づいて増分)または減分し(ます。


2

Pyth、10 8バイト

{.iF_B}F

ここで試してみてください

説明

{.iF_B}F
      }FQ  Generate the range between the (implicit) inputs.
 .iF_B     Interleave it with its reverse.
{          Deduplicate.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.