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


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.


Вы можете сохранить несколько байтов , взяв входные данные как вектор, а не как два отдельных целых числа.
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:]

Спасибо @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.
Эрик 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

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). :) Забыл обновить его после добавления ответов List и String, теперь нужно исправить. Спасибо.
Кевин Круйссен

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

@ Иона Спасибо! Кстати, решение FrownyFrog намного лучше моего, поэтому я не собираюсь играть в него дальше.
Гален Иванов


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

Отличное решение! Я совершенно забыл 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

Использование Fвместо .*двухэлементных списков - блестящий трюк, который я обязательно буду использовать с этого момента.
hakr14




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


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 ;). Все из-за этого "крайнего случая", лол.

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


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