Композиція 465


24

Ось виклик. Напишіть код, щоб вивести всі цілі числа в діапазоні. Звучить легко, але ось складна частина. Почнеться з найменшого числа, потім найвищого. Тоді найменше число, яке ще немає в масиві. Тоді найвищої, яка ще не існує.

Приклад:

Давайте візьмемо від 1 до 5 як наш старт

Числа [1, 2, 3, 4, 5].

Беремо перше, так [1]. Залишилися числа [2, 3, 4, 5]. Візьмемо останній, новий масив - [1, 5]. Залишилися числа [2, 3, 4]. Візьмемо перший, новий масив - [1, 5, 2]. Залишилися числа [3, 4]. Візьмемо останній, новий масив - [1, 5, 2, 4]. Залишилися числа [3]. Візьмемо перший, новий масив - [1, 5, 2, 4, 3]. Жодних номерів немає, ми закінчили. Вихід [1, 5, 2, 4, 3]

Правила:

  • Це код гольфу, пишіть його в найменші байти, будь-якою мовою.
  • Немає стандартних лазівки
  • Посилання на онлайн-перекладача, будь ласка? (Наприклад, https://tio.run/ )
  • Два входи, обидва цілих числа. Низький кінець діапазону і високий кінець діапазону.
  • Я не заперечую, який тип даних є результатом, але він повинен показувати числа у правильному порядку.

Приклади

Низький: 4 Високий: 6 Результат: 4 6 5


Низький: 1 Високий: 5 Результат: 1 5 2 4 3


Низький: -1 Високий: 1 Результат: -1 1 0


Низький: -1 високий: 2 Результат: -1 2 0 1


Низький: -50 Високий: 50 Результат: -50 50 -49 49 -48 48 -47 47 -46 46 -45 45 -44 44 -43 43 -42 42 -41 41 -40 40 -39 39 -38 38 -37 37 -36 36 -35 35 -34 34 -33 33 -32 32 -31 31 -30 30 -29 29 -28 28 -27 27 -26 26 -25 25 -24 24 -23 23 -22 22 -21 21 - 20 20 -19 19 -18 18 -17 17 -16 16 -15 15 -14 14 -13 13 -12 12 -11 11 -10 10 -9 9 -8 8 -7 7 -6 6 -5 5 -4 4 -3 3 -2 2 -1 1 0


Щасливого гольфу!


2
Практично повторюваний (різниця в тому, що для з’єднання потрібна друга половина перед об'єднанням).
Пітер Тейлор

чи вхід завжди буде в порядку низького, високого кінця?
Sumner18

1
@ Sumner18 так. Спільнота тут налаштована проти перевірки вводу, і я не просив ввести зворотній порядок, тому можна припустити, що вона завжди буде низькою - високою.
AJFaraday

1
@ Sumner18 Як зазвичай працюють ці виклики, це те, що нам не байдуже, як обробляються недійсні дані. Ваш код вважається успішним лише тим, як він має справу з дійсними входами (тобто обидва цілі числа, перше нижче другого)
AJFaraday

1
@AJFaraday: слід додати примітку до головної публікації із зазначенням, що X завжди буде строго нижчим, ніж Y (тобто X! = Y), я пропустив цей коментар;)
digEmAll

Відповіді:


15

R , 38 37 36 байт

function(a,b)rbind(a:b,b:a)[a:b-a+1]

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

  • -1 байт завдяки @ user2390246
  • -1 байт завдяки @Kirill L.

Використання факту, що R зберігає матриці в стовпцях


Використання rbindнабагато краще, ніж мій підхід, але ви можете зберегти 1 байт, використовуючи [seq(a:b)]замість unique.
користувач2390246

Ви маєте рацію, я пропустив коментар, де було вказано, що a <b (ніколи не дорівнює), тому ми можемо використовуватиseq(a:b)
digEmAll

@digEmAll Моїм рішенням було по суті буквальне тлумачення головоломки, я ніколи навіть не подумав би зробити щось подібне. Вражаючи, майте нагоду!
Sumner18



8

R , 65 64 61 60 байт

-1 байт завдяки Роберту С.

Ще -4 завдяки digEmAll

x=scan();z=x:x[2];while(sum(z|1)){cat(z[1],"");z=rev(z[-1])}

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


Ви можете замінити length(z)з , sum(z|1)щоб зберегти 1 байт :)
Robert S.

Я не розумію, як це працює, але я думаю, що це так. sum (z | 1) здається, що він завжди оцінюється як мінімум до 1, що призведе до того, що цикл while безперервно циклічить. але, мабуть, ні
Sumner18

4
z - вектор. кожен елемент цього вектора |відредагований з 1. Що завжди дорівнює 1. Коли ви берете суму, у вас є вектор, заповнений TRUEs, тому результат дорівнює довжині вектора. Якщо вектор порожній, вам не до чого, |тому вихідний вектор є logical(0). Коли ви берете цю суму, це 0
OganM



5

PowerShell , 59 48 байт

param($a,$b)(($z=0..($b-$a))|%{$a+$_;$b-$_})[$z]

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

(Здається довго ...)

Бере вхід $aі $b, будує діапазон 0 .. ($b-$a), зберігає його в $z, а потім проходить цикл через цей діапазон. Проведення циклу через цей діапазон просто використовується як лічильник, щоб забезпечити достатню кількість ітерацій. Кожну ітерацію ми ставимо $aі $bпо трубопроводу з додаванням / відніманням. Це дає нам щось подібне, 1,5,2,4,3,3,4,2,5,1тому нам потрібно розрізати на це від 0до $b-$a(тобто підрахунку) вихідного масиву, тому нам залишаються лише відповідні елементи. Це залишилося на конвеєрі, і вихід неявний.

-11 байт завдяки мазі.



@mazzy Ах, мені подобається цей $b-$aтрюк - це розумно!
AdmBorkBork

5

05AB1E , 6 байт

ŸDvć,R

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

Пояснення

Ÿ        # push range [min ... max]
 D       # duplicate
  v      # for each element in the copy
   ć,    # extract and print the head of the original list
     R   # and then reverse it

Ä2ä`R.ι не ітераційний, використовуючи перемежування, але це все ще набагато краще.
Чарівний восьминога Урна

1
@MagicOctopusUrn: Спершу я спробував неітераційне рішення, але це було ще гірше, оскільки про це я не знав ;)
Emigna

Подібно до того, що я мав на увазі, так очевидний +1 від мене. Мені подобається ваш альтернативний 7-байтний також через @MagicOctopusUrn. :)
Кевін Круїссен

1
@ KristianWilliams: Здається, це працює для мене.
Емінья

1
@KevinCruijssen: Я замість цього перейшов на пару, тому що все
одно



4

R , 51 байт

function(x,y,z=x:y)matrix(c(z,rev(z)),2,,T)[seq(z)]

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

Пояснення: Для послідовності x:yдовжини Nстворіть матрицю на два N, що складається з послідовності x: y у верхньому рядку та y: x у нижньому рядку matrix(c(z,rev(z)),2,,T). Якщо ми виберемо перші Nелементи матриці [seq(z)], вони будуть вибиратися стовпчиком, даючи необхідний вихід.

Перевершив digEmAll


1
Я щойно опублікував дуже подібний підхід за 30 секунд до вас: D
digEmAll

@digEmAll Так, але ваш набагато краще!
користувач2390246

4

cQuents , 19 байт

#|B-A+1&A+k-1,B-k+1

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

Зауважте, що він не працює в TIO зараз, оскільки перекладач TIO не в курсі.

Пояснення

#|B-A+1&A+k-1,B-k+1
                      A is the first input, B is the second input
#|B-A+1               n = B - A + 1
       &              Print the first n terms of the sequence
                      k starts at 1 and increments whenever we return to the first term
        A+k-1,         Terms alternate between A + k - 1 and
              B-k+1     B - k + 1
                       increment k



4

Байт-код JVM (OpenJDK asmtools JASM), 449 байт

enum b{const #1=Method java/io/PrintStream.print:(I)V;static Method a:(II)V stack 2 locals 4{getstatic java/lang/System.out:"Ljava/io/PrintStream;";astore 3;ldc 0;istore 2;l:iload 2;ldc 1;if_icmpeq t;aload 3;iload 0;invokevirtual #1;iinc 0,1;iinc 2,1;goto c;t:aload 3;iload 1;invokevirtual #1;iinc 1,-1;iinc 2,-1;c:aload 3;ldc 32;i2c;invokevirtual java/io/PrintStream.print:(C)V;iload 0;iload 1;if_icmpne l;aload 3;iload 0;invokevirtual #1;return;}}

Безумовні (і трохи чистіші)

 enum b {    
    public static Method "a":(II)V stack 5 locals 4 {
        getstatic "java/lang/System"."out":"Ljava/io/PrintStream;";
        astore 3;
        ldc 0;
        istore 2;
    loop:
        iload 2;
        ldc 1;
        if_icmpeq true;
    false:
        aload 3;
        iload 0;
        invokevirtual "java/io/PrintStream"."print":"(I)V";
        iinc 0,1;
        iinc 2,1;
        goto cond;
    true:
        aload 3;
        iload 1;
        invokevirtual "java/io/PrintStream"."print":"(I)V";
        iinc 1,-1;
        iinc 2,-1;
        goto cond;
    cond:
        iload 0;
        iload 1;
        if_icmpne loop;
        aload 3;
        iload 0;
        invokevirtual "java/io/PrintStream"."print":"(I)V";
        return;
    }
}

Автономну функцію, потрібно викликати з Java як b.a(num1,num2).

Пояснення

Цей код використовує параметри методу як змінні, а також булеве значення в локальній №3, що визначає, яке число вивести. Кожна ітерація циклу виводиться або зліва, або з правого боку, і це число збільшується для лівого або зменшується для правого. Цикл продовжується до тих пір, поки обидва числа не будуть рівними, тоді це число виводиться.

... У мене є чітке відчуття, що я масово перевершився на кількість байтів


4

Мова Вольфрама (Mathematica) , 56 54 байти

Це мій перший гольф!

f[a_,b_]:=(c=a~Range~b;Drop[c~Riffle~Reverse@c,a-b-1])

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

Збережено 2 байти за допомогою інфіксації.

Пояснення:

f[a_,b_]:=                                   \function of two variables
c=a~Range~b;                                 \list of integers from a to b 
                           Reverse@c         \same list in reverse
                  c~Riffle~Reverse@c         \interleave the two lists
             Drop[c~Riffle~Reverse@c,a-b-1]  \drop last |a-b-1| elements (note a-b-1 < 0)

Крім того, ми могли б використати Take[...,b-a+1]для того ж результату.

Тести:

f[4, 6]
f[1, 5]
f[-1, 1]
f[-1, 2]

Вихід:

{4, 6, 5}
{1, 5, 2, 4, 3}
{-1, 1, 0}
{-1, 2, 0, 1}

Посилання "Спробуйте в Інтернеті" повертає 403. "Вибачте, у вас немає дозволу на доступ до цього елемента".
Rohit Namjoshi

@RohitNamjoshi Я оновив посилання
Кай

зауважте, що в TIO ви можете розмістити код заголовка і колонтитула в текстових полях над і під фактичним полем коду. Це робить код більш чистим, а також дозволяє скористатися форматів відповідей PPCG (esc-sg). Спробуйте в Інтернеті!
Джо Кінг

@JoKing дуже цінував, я ніколи не використовував його раніше!
Кай





3

Четвертий (gforth) , 52 байти

: f 2dup - 1+ 0 do dup . i 2 mod 2* 1- - swap loop ;

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

Пояснення

Цикл від 0 до (Кінець - Початок). Помістіть кінець і починайте зверху стека.

Кожна ітерація:

  • Виведіть поточне число
  • Додайте (або відніміть) 1 від поточного числа
  • Переключити поточне число на інше число

Пояснення коду

: f           \ start new word definition
  2dup -      \ get the size of the range (total number of integers)
  1+ 0        \ add 1 to the size because forth loops are [Inclusive, Exclusive) 
  do          \ start counted loop from 0 to size+1
    dup .     \ output the current top of the stack
    i 2 mod   \ get the index of the loop modulus 2
    2* 1-     \ convert from 0,1 to -1,1
    -         \ subtract result from top of stack (adds 1 to lower bound and subtracts 1 from upper)
    swap      \ swap the top two stack numbers 
  loop        \ end the counted loop
;             \ end the word definition


3

Haskell, 30 байт

l%h=l:take(h-l)(h:(l+1)%(h-1))

Використання: 3%7дає `[3,7,4,6,5]

Для входів l, hфункція викликає рекурсивно з входами l+1, h-1і додає l,hдо початку. Замість будь-якої умови зупинки код використовує take(h-l)для скорочення послідовності до потрібної довжини (що інакше було б нескінченною послідовністю збільшення та зменшення чисел).


3

Брахілог , 15 байт

⟦₂{∅|b↔↰T&hg,T}

Введення - це 2-елементний список [lo, hi]. Зауважте, що підкреслення використовується для від’ємних чисел. Спробуйте в Інтернеті!

Пояснення

⟦₂               2-argument inclusive range: [1,5] -> [1,2,3,4,5]
  {           }  Call this recursive predicate to calculate the output:
   ∅               Base case: the input is empty list; nothing to do
    |              Otherwise (recursive case):      [1,2,3,4,5]
     b             Behead the input list            [2,3,4,5]
      ↔            Reverse                          [5,4,3,2]
       ↰           Call the predicate recursively   [5,2,4,3]
        T          Label the result T
         &         Also, with the input list,
          h        Take the head                    1
           g       Wrap it in a list                [1]
            ,T     Append T from earlier            [1,5,2,4,3]

3

MathGolf , 6 байт

↨_x^─▀

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

Пояснення с (1, 5)

↨        inclusive range from a to b    [1, 2, 3, 4, 5]
 _       duplicate TOS                  [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]
  x      reverse int/array/string       [1, 2, 3, 4, 5], [5, 4, 3, 2, 1]
   ^     zip top two elements on stack  [[1, 5], [2, 4], [3, 3], [4, 2], [5, 1]]
    ─    flatten array                  [1, 5, 2, 4, 3, 3, 4, 2, 5, 1]
     ▀   unique elements of string/list [1, 5, 2, 4, 3]

Причина, по якій це працює, пов'язана з тим, що всі елементи на виході повинні бути унікальними, тому оператор унікальних елементів відфільтрує другу половину масиву, видаючи правильний вихід.






2

Кубікс, 16 байт

;w(.II>sO-?@;)^/

Спробуйте тут

Кубіфікований

    ; w
    ( .
I I > s O - ? @
; ) ^ / . . . .
    . .
    . .

Пояснення

В основному, це рухає дві межі ближче один крок за часом, поки вони не зустрінуться. Кожен раз, коли через цикл ми промальовуємо sмежі, Oвиводимо, приймаємо різницю та приріст з )або зменшення (на основі ознаки.


2

Pyth, 10 8 байт

{.iF_B}F

Спробуйте тут

Пояснення

{.iF_B}F
      }FQ  Generate the range between the (implicit) inputs.
 .iF_B     Interleave it with its reverse.
{          Deduplicate.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.