Перше, останнє і все між собою


33

Дано два цілих числа, виведіть два цілих числа, а потім діапазон між ними (виключаючи обидва).

Порядок діапазону повинен бути таким же, як і вхідний.

Приклади:

 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 Будь-який розумний введення-виведення є прийнятним.
TFeld

Відповіді:


14

R , 39 33 30 байт

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

Спробуйте в Інтернеті!

Дякуємо за збережені байти користувачам2390246 та J.Doe.


Ви можете зберегти кілька байт , взявши вклад як вектор, а не як два окремих числа.
користувач2390246

Так, це розумно, і воно фактично стає ще коротшим, ніж повноцінна програма, а не функція.
Кирило Л.

Ви можете зловживати тим, що :оператор використовує перший елемент обох аргументів на 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:]

Дякуємо @JonasAusevicius за порт CPython!

Спробуйте в Інтернеті!


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. дуже круто, але я не можу зрозуміти, чому це працює! Ви можете пояснити це?
ElPedro

2
@ElPedro В основному y<xперевіряє, чи yстрого менше x, і повертає, Trueякщо є, Falseінакше. Після цього -до нього застосовується одинар , який перетворюється Trueна -1та Falseв 0. Останній крок - це побіт АБО це число за допомогою 1. Це, очевидно, залишає 1( 0b1) непорушеним, а також залишає -1( -0b1) непорушеним (біт знака -1встановлено, тому він зберігається як такий). Тим НЕ менше, це не зверненої 0до 1, так що rangeне скаржиться мені використовуючи stepз 0.
Ерік Аутгольфер

Це серйозно круто і дуже розумно. Якби я міг підняти два рази, я би. Велике спасибі за пояснення.
ElPedro

6

Python 3, 64 62 51 байт

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

Спробуйте в Інтернеті!

Python 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 дякую
Йонас Аусевічус

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

Python 2 , 47 41 40 байт

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

Спробуйте в Інтернеті!

Ось моя, тепер, коли було розміщено багато інших відповідей Python

-6 байт, завдяки ГБ


Скористатись порожнім діапазоном, коли він недійсний - це розумний спосіб поводитися зі списками вперед або назад. Я бачив, що бути дуже корисним і це приємна хитрість знати.
акозі

2
41 байт з використанням одного діапазону: діапазон (a, b, (a <b) * 2-1)
GB

a<b or-1коротший для параметра 3-го діапазону. Найкоротший у мене був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;}

-7 байт завдяки @nwellnhof .

Спробуйте в Інтернеті.

Пояснення:

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 байт)
Кевін Круїйсен

Це Java 8 чи Java 10? Через "вар" ^^ '
Нейт

1
@Neyt Ах, виправлено. Моя початкова версія з масивом нижче не використовувала var, тому я зазвичай ставлю такі на 8, і ті, які використовують varяк 10 (а ті, що використовують String.repeatяк 11). :) Забули оновити його після додавання списку та рядкових відповідей, його слід виправити зараз. Спасибі.
Кевін Кройсейсен

5

APL (Dyalog Extended) , 5 байт

Функція анонімного вставки.

,,…~,

Спробуйте в Інтернеті!

, перше і останнє (освітлене об'єднання аргументів)

, і (літ. приєднаний до)

 асортимент

~ без

, перше і останнє (освітлене об'єднання аргументів)


Добре, тож я припускаю, що ти зараз будеш використовувати це для всього свого гольфу?
Zacharý

@ 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 байтів і жодного спеціального корпусу для відносного впорядкування аргументів (скоріше: це приховано всередині синума *). я відчуваю, що це могло зійти під 20, але я втомився.
Йона

@Jonah Дякую! Рішення 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

Виведіть два цілих числа.

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

Спробуйте як висхідний, так і низхідний діапазони.

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

Петля за включеним діапазоном.

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

Виключіть цілі числа.

echo %%i

Виведіть поточне значення.


3

Pyth , 5 байт

+QtrF

Введення є списком з двох елементів, [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

Використання 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 ;). Все через той "крайній випадок", lol

Ну все одно насолоджуйтесь!


Я не думаю, що це правильний підхід для кодового гольфу. Перевірте це 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 байт

-1 байт від Міші Лаврова

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

2
І ще один байт, замінивши 1-2(A>Bна cos(π(A>B.
Міша Лавров

@MishaLavrov seq(не працюватиме на входах , де Aі Bті ж, на жаль :(
kamoroso94

Правда - також я залишив аргумент seq(, тому я вже не переконаний, що він навіть менший. Все-таки cos(хитрість повинна допомогти.
Міша Лавров

2

Вугілля деревне , 15 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

IE²N

Роздрукуйте введення окремими рядками.

I…⊕θη

Роздрукуйте діапазон зростання, якщо такий є.

I⮌…⊕ηθ

Роздрукуйте зворотний діапазон з урахуванням зростаючого, якщо такий є.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.