最初、最後、そしてその間のすべて


33

2つの整数を指定して、2つの整数を出力し、次にそれらの間の範囲(両方を除く)を出力します。

範囲の順序は入力と同じでなければなりません。

例:

 Input        Output
 0,  5   ->   [0, 5, 1, 2, 3, 4]
-3,  8   ->   [-3, 8, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7]
 4,  4   ->   [4, 4]
 4,  5   ->   [4, 5]
 8,  2   ->   [8, 2, 7, 6, 5, 4, 3]
-2, -7   ->   [-2, -7, -3, -4, -5, -6]

事前に順序付けられた順序で入力を取得できないと思いますか?
ケビンクルーッセン

@KevinCruijssen、いいえ、出力順序は入力順序に依存します
-TFeld

@StewieGriffin、出力順序は入力と同じでなければなりません
-TFeld

、この出力フォーマットは許容できますか?改行に注意してください
ルイスメンドー

2
@KevinCruijssen妥当なI / Oは許容されます。
TFeld

回答:


14

R39 33 30バイト

c(a<-scan(),setdiff(a:a[2],a))

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

user2390246とJ.Doeに保存されたバイトをありがとう。


入力を2つの個別の整数としてではなくベクトルとして取得することで、数バイトを節約できます。
-user2390246

ええ、それは合理的であり、実際には機能ではなく完全なプログラムとしてさらに短くなります。
キリル

:オペレーターが両方の引数の最初の要素を30バイト
-J.Doe



10

Python 2(Cython)36 35バイト

lambda x:x+range(*x,-cmp(*x)|1)[1:]

@nwellnhofに1バイトのゴルフをしてくれてありがとう!

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


Python 2、37バイト

lambda x:x+range(*x+[-cmp(*x)|1])[1:]

CPythonへの移植について@JonasAuseviciusに感謝します!

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


2
これは、標準のPython 2に37バイトで適用できますlambda x:x+range(*x+[-cmp(*x)|1])[1:]。良い解決策
ジョナスオーセビシウス


7

Python 2、40バイト

lambda x,y:[x,y]+range(x,y,-(y<x)|1)[1:]

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


本当に好き-(y<x)|1です。非常にクールですが、なぜ機能するのかわかりません!説明できる可能性はありますか?
エルペドロ

2
@ElPedro基本的に、がより小さいy<xかどうかをチェックし、そうでない場合は返します。その後、単項ISは、変換、それに適用するとします。最後のステップは、この数値をでビット単位でORすることです。これにより、明らかに()が影響を受けず、また()が影響を受けません(の符号ビットが設定されているため、そのまま保持されます)。ただし、に変換されるので、of を使用して文句を言うことはありません。yxTrueFalse-True-1False0110b1-1-0b1-101rangestep0
エリックアウトゴルファー

それは真剣にクールで非常に賢いです。2回賛成票を投じることができた場合。説明に感謝します。
エルペドロ

6

Python 3、64 62 51バイト

lambda a,b:[a,b]+[*range(a+1,b)]+[*range(a-1,b,-1)]

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

パイソン2、58の 45バイト

lambda a,b:[a,b]+range(a+1,b)+range(a-1,b,-1)

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


2
空のリストは偽であるため、a<=b and 両方の回答から削除できます
-TFeld

次の+代わりに使用することもできますor
TFeld

@TFeldはあなたに感謝
ジョナスAusevicius

Python 3から47バイトまで:lambda a,b:[a,b,*range(a+1,b),*range(a-1,b,-1)]
-mypetlion


6

JavaScript(ES6)、51バイト

入力をとして受け取ります(a)(b)

a=>g=(b,c=b)=>(b+=b<a|-(b>a))-a?[...g(b,c),b]:[a,c]

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

コメント済み

a =>                // main function, taking a
  g = (             // g = recursive function
    b,              //     taking b
    c = b           // we save a backup of the original value of b into c
  ) =>              //
    (b +=           // add to b:
      b < a |       //   +1 if b is less than a
      -(b > a)      //   -1 if b is greater than a
    )               //   (or 0 if b = a)
    - a ?           // if the updated value of b is not equal to a:
      [             //   generate a new array:
        ...g(b, c), //     prepend all values generated by a recursive call
        b           //     append the current value of b
      ]             //
    :               // else:
      [a, c]        //   stop recursion and return the first 2 values: a and c

6

パイソン247の 41、40バイト

lambda a,b:[a,b]+range(a,b,a<b or-1)[1:]

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

ここに私のものがあります。他の多くのPythonの回答が投稿されました。

-6バイト、GBのおかげ


無効なときに空の範囲を活用することは、前方または後方のリストを処理するスマートな方法です。非常に有用であり、存在することを知るのに良いトリックであることがわかりました。
アコジ

2
範囲(A、B(A <B)* 2-1):単一の範囲使用バイト41
GB

a<b or-13番目の範囲パラメーターの方が短くなります。私が得た最短はlambda x,y:[x,y]+range(x+(x<y or-1),y,x<y or-1)
-mbomb007

5

Java 10、109 108 104 102 93 62バイト

スペース区切りの文字列を使用:

b->a->{var r=a+" "+b;for(;a<b?++a<b:--a>b;)r+=" "+a;return r;}

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

リストを使用する:

b->a->{var r=new java.util.Stack();for(r.add(a),r.add(b);a<b?++a<b:--a>b;)r.add(a);return r;}

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

a<b?++a<b:--a>bすることができ++a<b||(a-=2)>b、同じバイト数のために:文字列のためのオンラインそれを試してみてくださいまたはリストのためのオンラインそれを試してみてください。)


古い(109 108 104 102アレイを使用して101バイト)の答え:

a->b->{int s=a<b?1:-1,i=a!=b?(b-a)*s+1:2,r[]=new int[i];for(r[0]=a,r[1]=b;i>2;)r[--i]=b-=s;return r;}

@nwellnhofのおかげで-7バイト。

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

説明:

a->b->{                // Method with 2 int parameters & int-array return-type
  int s=               //  Step integer, starting at:
        a<b?1          //   1 if the first input is smaller than the second
        :-1;           //   -1 otherwise
      i=               //  Array-index integer, starting at:
        a!=b?          //   If the inputs aren't equal:
         (b-a)*s+1     //    Set it to the absolute difference + 1
        :              //   Else:
         2,            //    Set it to 2
      r[]=new int[i];  //  Result-array of that size
  for(r[0]=a,          //  Fill the first value with the first input
      r[1]=b;          //  And the second value with the second input
      i>2;)            //  Loop `i` downwards in the range [`i`,2):
    r[--i]=            //   Decrease `i` by 1 first with `--i`
                       //   Set the `i`'th array-value to:
           b-=s;       //    If the step integer is 1: decrease `b` by 1
                       //    If the step integer is -1: increase `b` by 1
                       //    And set the array-value to this modified `b`
  return r;}           //  Return the result-array

整数の範囲を作成するためのJavaの標準ライブラリには何もありませんか?または、使用するには冗長すぎますか?
Οurous

@Οurousそれは確かに冗長すぎる:a->b->{var L=java.util.stream.IntStream.range(a,b).boxed().collect(java.util.Collectors.toList());L.add(0,b);L.add(0,a);return L;}(130バイト)
ケビンCruijssen

Java 8またはJava 10ですか?「var」のため^^ '
ネイト

1
@Neyt Ah、修正済み。以下の配列を使用した私の最初のバージョンはを使用しませんでした。そのためvar、通常は8を使用しvar、10を使用するもの(およびString.repeat11 を使用するもの)を配置します。:)リストと文字列の回答を追加した後に更新するのを忘れていましたが、今修正する必要があります。ありがとう。
ケビンCruijssen

5

APL(Dyalog Extended)、5バイト

匿名挿入関数。

,,…~,

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

, 最初と最後(lit.引数の連結)

, および(点灯。連結)

 範囲

~ なしで

, 最初と最後(lit.引数の連結)


いいですね、これからこれからすべてのゴルフでこれを使うと思いますか?
ザカリー

@Zacharýおそらく、コードが大幅に短いか単純場合のみ。
アダム



4

J、26バイト

,,[|.@]^:(>{.)<.+1}.i.@|@-

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

説明:

二項動詞(左右の引数を取る)

                         -    subtracts the arguments
                       |@     and finds the absolute value
                    i.@       and makes a list 0..absolute difference
                 1}.          drops the fist element
                +             adds to the entire list
              <.              the smaller of the arguments
   |.@]                       reverses the list
       ^:                     only if
  [                           the left argument
         (>{.)                is greater than the first item of the list
 ,                            appends the list to
,                             the right argument appended to the left one

1
,,[:}.@}:<.+i.@-@(+*)@-23バイトで、相対的な引数の順序に特別な大文字小文字はありません(むしろ:signum内に隠されています*)。これは20歳未満になりそうな気がしますが、疲れています。
ジョナ

@ジョナありがとうございます!Btw FrownyFrogのソリューションは私のものよりもはるかに優れているので、これ以上ゴルフをするつもりはありません。
ガレンイワノフ



3

バッチ、107バイト

@echo %1
@echo %2
@for %%s in (1 -1)do @for /l %%i in (%1,%%s,%2)do @if %1 neq %%i if %%i neq %2 echo %%i

入力をコマンドライン引数として受け取ります。説明:

@echo %1
@echo %2

2つの整数を出力します。

@for %%s in (1 -1)do

昇順と降順の両方の範囲を試してください。

@for /l %%i in (%1,%%s,%2)do

包括的範囲でループします。

@if %1 neq %%i if %%i neq %2

2つの整数を除外します。

echo %%i

現在の値を出力します。


3

Pyth、5バイト

+QtrF

入力は2要素のリストです[input 1, input 2]ここでオンライン試すか、ここですべてのテストケースを一度に確認してください

+QtrFQ   Implicit: Q=eval(input())
         Trailing Q inferred
   rFQ   Generate range [input 1 - input 2)
  t      Discard first element
+Q       Prepend Q

2要素リストのF代わりに使用すること.*は、これから絶対に使用する素晴らしいトリックです。
hakr14





3

APL(Dyalog Classic)、29バイト

{⍺,⍵,(⌽⍣(⍺>⍵))(⍺⌊⍵)+¯1↓⍳|⍺-⍵}

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

私のJソリューションの移植


うわー、一見単純な作業にこれが非常に長いことに驚いています。
クインテック

@Quintecおそらくそれはゴルフができるか、あるいは別のアルゴリズムがはるかに短いソリューションをもたらすでしょう。
ガレンイワノフ

3

PHP(102バイト)

function t($a,$b){count($r=range($a,$b))>1?array_splice($r,1,0,array_pop($r)):$r=[$a,$b];print_r($r);}

サンドボックス

残念ながら(ゴルフの場合)PHPにはかなり冗長な関数名があり、長さに大きく貢献しています。しかし、基本的な考え方は、範囲を作成することです、その後のオフセット1から最後の要素をオフにポップしに戻ってそれをステッチ4,4例私は追加する必要がありましたcount($r=range($a,$b))>1?...:$r=[$a,$b];かなりのビットを付加され、残念ながらarray_splice()参照することによってである少数のより多くのために私を襲いましたバイト($r= and a ;)。それはすべて、その「エッジケース」のためです(笑)。

とにかく楽しんでください!


これがコードゴルフの正しいアプローチだとは思いません。これを確認してください function t($a,$b){$o=array($a,$b);for($i=$a+1;$i<$b;$i++)$o[]=$i;print_r($o);}
th3pirat3

またはこのようなものfunction t($a,$b){echo $a.$b;for($i=$a+1;$i<$b;$i++)echo $i};
-th3pirat3

1
関数でなければならず、配列を出力しなければなりません。より良い回答があれば、投稿してください。
ArtisticPhoenix

編集しましたが、今は有効な提出ですか?それを新しい答えにしようか、それとも何にしようか?
th3pirat3

それは完全にあなた次第です、私はループなしでそれをやりたかっただけです... lol
ArtisticPhoenix

3

Clojure、61バイト

(fn[[a b]](def s(if(> a b)-1 1))(list* a b(range(+ a s)b s)))

2ベクトルを入力として受け取り、リストを返す無名関数。

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

説明

(fn [[a b]] ; An anonymous function that accepts a 2-vector as input, and destructures it to a and b
  (def s (if (> a b) -1 1)) ; If a > b assigns -1 to s and assigns 1 to s otherwise. This determines the order of the elements of the output list.
  (list* a b ; Creates a list with a and b as the first two elements. The remaining elements will be appended from the following range:
    (range (+ a s) b s))) ; A range starting at a+s and ending at b with step s


3

TI-BASIC、35 34バイト

Misha Lavrovから-1バイト

Prompt A,B
Disp A,B
cos(π(A>B
For(I,A+Ans,B-Ans,Ans
Disp I
End

2
そして、置き換えることにより、1つの以上のバイト1-2(A>Bcos(π(A>B
ミシャラヴロフ

@MishaLavrov seq(入力場所のために働かないAB、残念ながら、同じ:(
kamoroso94

本当です-また、私はの引数を省略したseq(ので、それがもっと小さいとさえ確信していません。それでも、cos(トリックは役立つはずです。
ミシャラヴロフ

2

、15バイト

IE²NI…⊕θηI⮌…⊕ηθ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

IE²N

入力を別々の行に印刷します。

I…⊕θη

昇順の範囲がある場合は印刷します。

I⮌…⊕ηθ

逆昇順の逆方向範囲があれば、それを印刷します。


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