İlk, son ve arasındaki her şey


33

İki tamsayı verildiğinde, iki tamsayıyı ve ardından aralarındaki aralığı (ikisi hariç) verin.

Aralığın sırası giriş ile aynı olmalıdır.

Örnekler:

 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]

Sanırım girişleri önceden sipariş verilen sırada alamayız?
Kevin Cruijssen

@KevinCruijssen, hayır, çıktı sırası girdi sırasına bağlıdır
TFeld

@StewieGriffin, çıktı sırasının girdiyle aynı olması gerekiyor
TFeld

bu çıkış biçimi kabul edilebilir? Yeni
Luis Mendo

2
@KevinCruijssen Herhangi bir makul G / Ç kabul edilebilir.
TF

Yanıtlar:






8

Perl 6 , 26 22 bayt

{|@_,|[...^](@_).skip}

Çevrimiçi deneyin!

açıklama

{                    }
 |@_,   # Slip args a,b into result
      [...^](@_)  # Reduce args a,b with ...^ operator, same as a...^b
                .skip  # Skip first element
     |  # Slip into result

7

Python 2,40 bayt

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

Çevrimiçi deneyin!


Gerçekten beğendim -(y<x)|1. çok havalı ama neden işe yaradığını çözemiyorum! Açıklayabilme ihtimalin var mı?
ElPedro

2
@ElPedro Temel olarak, kesinlikle daha küçük y<xolup olmadığını kontrol eder , aksi takdirde döner . Bundan sonra, tekli olan dönüştürür, kendisine uygulanan için ve için . Son adım bitsel olarak VEYA bu sayı ile . Bu açık bir şekilde ( ) etkilenmez ve aynı zamanda ( ) etkilenmez (işaret biti ayarlanır, bu şekilde tutulur). Ancak, dönüştürmek yapar için böylece bir kullanarak bana şikayet etmez ait . yxTrueFalse-True-1False0110b1-1-0b1-101rangestep0
Outgolfer Erik,

Bu cidden havalı ve çok zekice. İki kere oy kullanabilseydim, yapardım. Açıklama için çok teşekkürler.
ElPedro


6

Japt, 8 bayt

cUr!õ kU

Burada dene

             :Implicit input of array U
c            :Concatenate
 Ur          :  Reduce U by
   !õ        :   Inclusive range
      kU     :  Remove all elements in original U

6

JavaScript (ES6), 51 bayt

Girişi olarak alır (a)(b).

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

Çevrimiçi deneyin!

Yorumlananlar

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

Python 2 , 47 41 40 bayt

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

Çevrimiçi deneyin!

İşte benim, şimdi birçok Python cevabı gönderildi.

-6 bayt, GB sayesinde


Geçersiz olduğunda boş aralığın avantajından yararlanmak, ileri veya geri listeleri ile başa çıkmak için akıllı bir yoldur. Bunun çok faydalı olduğunu ve var olduğunu bilmek güzel bir numara olduğunu görebiliyordum.
akozi

2
Tek bir aralık kullanarak 41 bayt: aralık (a, b, (a <b) * 2-1)
GB

a<b or-13. range parametresi için daha kısa. Bende en kısa oldulambda 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 bayt

Boşluk içeren bir Dize kullanma:

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

Çevrimiçi deneyin.

Liste Kullanımı:

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;}

Çevrimiçi deneyin.

( a<b?++a<b:--a>bOlabilir ++a<b||(a-=2)>baynı bayt sayım için: dize için çevrimiçi deneyin ya Listesi için çevrimiçi deneyin .)


Eski ( 109 108 104 102 101 bayt) bir dizi kullanarak cevap:

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 sayesinde -7 bayt .

Çevrimiçi deneyin.

Açıklama:

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'nın standart kütüphanesinde tamsayı aralıkları yapmak için bir şey yok mu? Ya da sadece kullanmak için çok ayrıntılı?
Büyük

@ Usurous Gerçekten çok ayrıntılı: 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 bytes)
Kevin Cruijssen

Java 8 mi, Java 10 mu? "Var" ^^ '
yüzünden

1
@Neyt Ah, düzeltildi. Aşağıdaki diziyi içeren ilk sürümümde kullanmıyordum var, bu yüzden bunları genellikle 8'e, var10'u (ve String.repeat11'i kullananlar ) kullandım. :) Liste ve Dize cevaplarını ekledikten sonra güncellemeyi unuttum, şimdi düzeltilmesi gerekiyor. Teşekkürler.
Kevin Cruijssen

5

APL (Dyalog Genişletilmiş) , 5 bayt

Anonim infix işlevi.

,,…~,

Çevrimiçi deneyin!

, ilk ve son (argümanların birleştirilmesini yaktı)

, ve (lit. birleştirilmiş)

 menzil

~ olmadan

, ilk ve son (argümanların birleştirilmesini yaktı)


Güzel, peki bundan böyle bütün golf oynamaların için bunu kullanacağını varsayıyorum?
Zacharı

Zachary @ kodudur Muhtemelen sadece anlamlı kısa ya da daha basit.
12’de


4

Jöle , 4 bayt

,œ|r

Çevrimiçi deneyin!

Nasıl çalışır

,œ|r  Main link. Left argument: a. Right argument: b

,     Pair; yield [a, b].
   r  Range; yield [a, ..., b].
 œ|   Perform multiset union.

4

J , 26 bayt

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

Çevrimiçi deneyin!

Açıklama:

İkili fiil (sol ve sağ argümanı alır)

                         -    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 bayt için ve göreli argüman sıralamasında özel bir kılıf yok (bunun yerine: signum içinde gizli *). Bunun 20'nin altına düşebileceğini hissediyorum ama yorgunum.
Jonah

@Jonah Teşekkürler! Btw FrownyFrog'un çözümü benimkinden çok daha iyi, bu yüzden daha fazla golf oynamayacağım.
Galen Ivanov


4

J , 13 bayt

,,<.+i.@-~-.=

Çevrimiçi deneyin!

     i.@-~       range [0 .. |difference|-1], reverse if the difference is positive
          -.=    remove the zero (either "=" is 0 or there’s nothing to remove)
  <.+            to each element add the smaller of the args
,,               prepend args

Güzel çözüm! i.Olumsuz tartışma ile tamamen unuttum .
Galen Ivanov

1
bu muhteşem!
Jonah

3

Toplu iş, 107 bayt

@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

Girdiyi komut satırı argümanları olarak alır. Açıklama:

@echo %1
@echo %2

İki tamsayının çıktısını alın.

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

Hem yükselen hem de azalan aralıkları deneyin.

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

Kapsayıcı değer aralığında döngü.

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

İki tam sayıyı hariç tutun.

echo %%i

Geçerli değerin çıktısını alın.


3

Pyth , 5 bayt

+QtrF

Giriş, iki elemanlı bir listedir [input 1, input 2]. Online Deneyin burada ya bir kerede tüm test durumları doğrulamak burada .

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

2 elemanlı listeler Fyerine kullanmak .*, bundan sonra kesinlikle kullanacağım harika bir numara.
hakr14



3

Ruby , 33 40 bayt

->a,b{[a,b]+[*a..b,*a.downto(b)][1..-2]}

Çevrimiçi deneyin!

Geçici düzeltme, daha iyi bir fikir bulmaya çalışıyorum


3
Bunun için [4,4]sadece bir tane verir[4]
Kirill L.

Haklısın ben düzelttim.
TR

3

Python 2 , 52 47 41 bayt

lambda i,j:[i,j]+range(i,j,(i<j)*2-1)[1:]

Çevrimiçi deneyin!

-5 @JoKing sayesinde

-6 Menzildeki ilk elementi dilimleyerek (fikir @TFeld'den çalındı ​​ve kredi ile çalındı)

Lambda dışı versiyon ...

Python 2 , 51 49 47 bayt

i,j=input();print[i,j]+range(i,j,(i<j)*2-1)[1:]

Çevrimiçi deneyin!

-2 @JoKing sayesinde



3

PHP (102 bayt)

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

Kum havuzu

Ne yazık ki (golf için) PHP, uzunluğa çok katkıda bulunan ayrıntılı işlev adlarına sahiptir. Fakat temel fikir bir aralık oluşturmak, sonra son elemanı patlatmak ve ofset 1'de tekrar dikmek. 4,4Örnekte count($r=range($a,$b))>1?...:$r=[$a,$b];, biraz ekleyen ve maalesef eklemek zorunda kaldım.array_splice() bana birkaç tane daha vuracak olan referans olarak geldi. bayt ($r= and a ; ). Hepsi bu "kenar davası" yüzünden, lol.

Neyse tadını çıkar!


Bunun kod golf için doğru bir yaklaşım olduğunu sanmıyorum. function t($a,$b){$o=array($a,$b);for($i=$a+1;$i<$b;$i++)$o[]=$i;print_r($o);}
Şunu

Ya da böyle bir şeyfunction t($a,$b){echo $a.$b;for($i=$a+1;$i<$b;$i++)echo $i};
th3pirat3

1
Bir fonksiyon olmalı ve bir dizi çıkarmalı. Daha iyi bir cevabınız varsa, daha sonra gönderebilirsiniz.
ArtistikPhoenix

Düzenledim, bu geçerli bir başvuru mu? Yeni bir cevap mı vereyim mi yoksa?
th3pirat3

Bu tamamen size kalmış, sadece bir döngü olmadan yapmak istemiştim ... lol
ArtisticPhoenix

3

Clojure , 61 bayt

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

Giriş olarak 2 vektörü alan ve bir liste döndüren adsız bir işlev.

Çevrimiçi deneyin!

açıklama

(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

D , 85 bayt

T[]f(T)(T a,T b){T[]v=[a,b];T c=2*(b>a)-1;for(T i=a+c;a!=b&&b!=i;i+=c)v~=i;return v;}

Çevrimiçi deneyin!

@ HatsuPointerKun’un C ++ cevabının D.


3

TI-BASIC, 35 34 bayt

Misha Lavrov'dan -1 bayt

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

2
Ve 1-2(A>Bile değiştirerek bir bayt daha cos(π(A>B.
Misha Lavrov

@MishaLavrov seq(girişler için olmaz eser Ave Baynı maalesef :(
kamoroso94

Doğru - Ayrıca, bir argüman bıraktım seq(, bu yüzden artık daha küçük olduğuna ikna olmadım. Yine de, cos(numara yardım etmeli.
Misha Lavrov

2

Mangal kömürü , 15 bayt

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

Çevrimiçi deneyin!Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

IE²N

Girişleri ayrı satırlara yazdırın.

I…⊕θη

Varsa, artan aralığı yazdırın.

I⮌…⊕ηθ

Varsa, tersin artan ters aralığını yazdırın.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.