Первое, последнее и все, что между

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]
TFeld
источник
Я думаю, мы не можем принять входные данные в предзаказанном порядке?
Кевин Круйссен
@KevinCruijssen, нет, порядок вывода зависит от порядка ввода
TFeld
@StewieGriffin, порядок вывода должен быть таким же, как и у ввода
TFeld
Является ли этот формат вывода приемлемым? Обратите внимание на новую строку
Луис Мендо
2
@KevinCruijssen Любой разумный ввод / вывод приемлем.
TFeld

Ответы:

14

R , 39 33 30 байт

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

Попробуйте онлайн!

Спасибо за сохраненные байты пользователю 2390246 и J. Doe.

Кирилл Л.
источник
Вы можете сохранить несколько байтов , взяв входные данные как вектор, а не как два отдельных целых числа.
user2390246
Да, это разумно, и на самом деле это становится еще короче, чем полная программа, а не функция.
Кирилл Л.
Вы можете злоупотреблять тем фактом, что :оператор использует первый элемент обоих аргументов для 30 байтов
J.Doe
12

Python 3 , 52 48 47 42 41 байт

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

Попробуйте онлайн!


Комбинированные прежние реализации.

cobaltp
источник
2
Вы можете удалить пробел в, or-1чтобы сохранить байт.
Кевин Круйссен,
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:]. Хорошее решение
Йонас Аусявичюс
8

Perl 6 , 26 22 байта

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

Попробуйте онлайн!

объяснение

{                    }
 |@_,   # Slip args a,b into result
      [...^](@_)  # Reduce args a,b with ...^ operator, same as a...^b
                .skip  # Skip first element
     |  # Slip into result
nwellnhof
источник
7

Python 2 , 40 байт

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

Попробуйте онлайн!

Эрик Outgolfer
источник
Очень нравится -(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.
Эрик Outgolfer
Это серьезно круто и очень умно. Если бы я мог дважды поднять голос, я бы сделал это. Большое спасибо за объяснение.
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 спасибо
Йонас Аусявичюс
Питон 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
Arnauld
источник
6

Python 2 , 47 41 40 байт

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

Попробуйте онлайн!

Вот мой, теперь, когда было опубликовано много других ответов Python

-6 байт, благодаря ГБ

TFeld
источник
Использование пустого диапазона, когда он недействителен, является разумным способом работы со списками вперед или назад. Я мог видеть, что быть очень полезным и это хороший трюк, чтобы знать, существует.
Акози
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). :) Забыл обновить его после добавления ответов List и String, теперь нужно исправить. Спасибо.
Кевин Круйссен
5

APL (Dyalog Extended) , 5 байт

Анонимная инфиксная функция.

,,…~,

Попробуйте онлайн!

, первый и последний (лит. объединение аргументов)

, и (Лит. соединены с)

 диапазон

~ без

, первый и последний (лит. объединение аргументов)

Адам
источник
Хорошо, так что я полагаю, что теперь ты будешь использовать это для всего своего гольфа?
Zacharý
@ Zacharý Вероятно, только если код значительно короче или проще.
Адам
4

Haskell, 34 байта

a#b=a:b:[a+1..b-1]++[a-1,a-2..b+1]

Попробуйте онлайн!

Ними
источник
Это не работает. GHC интерпретирует b-1как b $ (-1). Используйте b- 1вместо этого.
Schuelermine
@MarkNeu: это работает. Смотрите ссылку TIO.
Ними,
Ой, извини! Я имел NegativeLiteralsна.
Schuelermine
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 лет, но я устал.
Иона
@ Иона Спасибо! Кстати, решение FrownyFrog намного лучше моего, поэтому я не собираюсь играть в него дальше.
Гален Иванов
4

Октава , 45 байт

@(a,b)[a b linspace(a,b,(t=abs(a-b))+1)(2:t)]

Попробуйте онлайн!

Луис Мендо
источник
Если первый больше, чем второй, диапазон должен быть нисходящим
TFeld
О, чувак, я не умею читать
Луис Мендо
Я закончил тем, что изменил язык
Луис Мендо
4

J , 13 байт

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

Попробуйте онлайн!

     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
FrownyFrog
источник
Отличное решение! Я совершенно забыл i.с отрицательным аргументом.
Гален Иванов
1
это великолепно!
Иона
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
Sok
источник
Использование Fвместо .*двухэлементных списков - блестящий трюк, который я обязательно буду использовать с этого момента.
hakr14
3

Рубин , 33 40 байт

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

Попробуйте онлайн!

Временное исправление, пытаясь найти лучшую идею

гигабайт
источник
3
За [4,4]это дает только один[4]
Кирилл Л.
Вы правы, я это исправил.
ГБ
3

Python 2 , 52 47 41 байт

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

Попробуйте онлайн!

-5 благодаря @JoKing

-6 путем нарезания первого элемента из диапазона (идея украдена у @TFeld и с благодарностью)

Не лямбда-версия ...

Python 2 , 51 49 47 байт

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

Попробуйте онлайн!

-2 благодаря @JoKing

ElPedro
источник
3

APL (Dyalog Classic) , 29 байт

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

Попробуйте онлайн!

Порт моего Jрешения

Гален Иванов
источник
Вау, я удивлен, что это так долго для казалось бы простой задачи.
Quintec
@ 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 ;). Все из-за этого "крайнего случая", лол.

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

ArtisticPhoenix
источник
Я не думаю, что это правильный подход для кода гольф. Проверьте это 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
TheGreatGeek
источник
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
kamoroso94
источник
2
И еще один байт, заменив 1-2(A>Bна cos(π(A>B.
Миша Лавров
@MishaLavrov seq(не будет работать для входов, где Aи Bто же самое, к сожалению :(
kamoroso94
Верно - также, я пропустил аргумент seq(, поэтому я больше не убежден, что он даже меньше. Тем не менее, cos(хитрость должна помочь.
Миша Лавров
2

Древесный уголь , 15 байт

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

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

IE²N

Напечатайте входные данные в отдельных строках.

I…⊕θη

Напечатайте возрастающий диапазон, если есть.

I⮌…⊕ηθ

Выведите обратный восходящий обратный диапазон, если есть.

Нил
источник