Дайте перестановку без двох послідовних цілих чисел поруч


18

Виклик

З огляду на ціле число n ≥ 4 , виведіть перестановку цілих чисел [0, n-1] із властивістю, що жодні два послідовних цілих числа (цілі числа з абсолютною різницею 1) не знаходяться поруч.

Приклади

  • 4[1, 3, 0, 2]
  • 5[0, 2, 4, 1, 3]
  • 6[0, 2, 4, 1, 3, 5]
  • 7[0, 2, 4, 1, 5, 3, 6]

Ви можете використовувати замість [0, n-1] цілі числа [1, n ] ).

Ваш код повинен працювати в поліномі на n , тому ви не можете спробувати всі перестановки та перевірити кожну.


Коли ви говорите "вивести перестановку", ви маєте на увазі як список? Чи можемо ми створити функцію, яка реалізує перестановку перестановки самостійно?
xnor

@xnor Він повинен виводитися у формі, зрозумілій для людини. Мені все одно, як саме.
Ануш

Буде [[1,3],[0,2]]прийнятним вихідний формат?
Кудлатий

@Shaggy Це не здорово. Це означає 1,3,0,2?
Ануш

Відповіді:


31

Желе , 3 2 байти

ḂÞ

Сортуйте цілі числа в [1, ..., n] за їх LSB.

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


Оце Так! Це чудово.
Ануш

2
"Сортувати за LSB" означає, що кожен другий рухається до початку, але чи потрібно визначення Jelly, щоб цифри в кожній половині залишалися у своєму початковому порядку? Якщо ні, 100 (4) може бути поряд із 101 (5) і все ще бути "відсортовано за LSB". Не помилка вашого коду, але, можливо, описуючий коментар не завершений?
WGroleau

1
@WGroleau Так, Þстабільний сорт, оскільки він реалізований за допомогою sortedфункції Python , яка гарантовано стабільна .
користувач202729

3
Алгоритм для мене більш вражаючий, ніж невеликий розмір, своєю кмітливістю. Ви також можете, я думаю, змінити порядок бітів, сортувати та повернути назад.
WGroleau

4
Тут може бути лише 65536 різних двох байтових програм Jelly. Це дивно , що багато хто з тих , хто виявляються відповіді на ppcg виклики.
Ануш




6

Хаскелл, 22 байти

f - функція n, яка повертає відповідно упорядкований список. Я використовую варіант 1-індексації.

f n=[2,4..n]++[1,3..n]

6

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

@(x)[2:2:x,1:2:x]

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

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


1
Чи не є 3і 2поруч один з одним f(4)?
pajonk

На жаль ... виправлено. Кількість байтів :-)
Стюі Гріффін

5

JavaScript (ES6), 40 байт

f=
n=>[...Array(i=n)].map(_=>(i+--i)%(n|1))
<input type=number min=4 oninput=o.textContent=f(+this.value).join`\n`><pre id=o>

Редагувати: Збережено 1 байт завдяки @Arnauld.


5

Гая , 2 байти

r∫

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

Це просто (стійко) ORTS цілих чисел в діапазоні [1,] вхідні їх ра г Ity.


Той самий коментар, що і для Jelly: чи алгоритм чи визначення мови гарантують, що обидві половинки залишаються у своєму початковому порядку?
WGroleau

@WGroleau Так, у Gaia мета-оператор сортування стабільний.
Містер Xcoder

5

R , 39 36 35 байт

function(x)c(seq(2,x,2),seq(1,x,2))

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


Існує кінцевий NA для непарних чисел.
JayCe


Вина дружини. Нам довелося їхати на нашому велосипеді, перш ніж я зміг це виправити. Але ти також поголив кілька байтів.
ngm

Так, мені стало погано просити вас додати байти, тому мені довелося знайти спосіб видалити деякі ... це спрацювало добре.
JayCe



4

Japt, 4 байти

Можна також замінити uз , vщоб отримати інший замовлення.

õ ñu

Спробуй це

Або, якщо ми можемо витіснити масив з 2 масивів:

õ ó

Спробуй це


Технічно другий виводить список чисел, розділених комами ;-) Обидва виходять з ладу, на 4жаль; Ви можете встановити перший, змінивши uв vабо oна õ.
ETHproductions

3

Mathematica, 50 -> 47 -> 42 байти

p = Join[Range[2, #, 2], Range[1, #, 2]] &

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

Завдяки user202729 за вказівку на подвійний потенціал оптимізації Приєднайтесь до [], відчувши Flatten [] та використовуючи чисті функції.

Я хотів би додати два зауваження.

1) Досить просто побудувати конкретну перестановку без спадаючої або зростаючої послідовності при n> = 4, як вимагається n ОП.

Він складається з двох послідовних списків.

Для парних n це:
list1 = (2,4, ..., n / 2)
list2 = (1,3, ..., n / 2-1)

Для непарних n маємо:
list1 = (2,4, ..., поверх [n / 2])
list2 = (1,3, ..., поверх [n / 2])

Для цього "алгоритму" потрібно прийняти лише одне рішення (n парне чи непарне), решта - лише записування n чисел.

Можливе рішення Mathematica надано вгорі.

2) Пов'язане питання - скільки таких перестановок існує як функція n.

Математика, 124 байти

a[0] = a[1] = 1; a[2] = a[3] = 0;
a[n_] := a[n] = (n + 1)*a[n - 1] - (n - 2)*a[n - 2] - (n - 5)*a[n - 3] + (n - 3)*a[n - 4]

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

Приклад:

a[#] & /@ Range[4, 12]

{2, 14, 90, 646, 5242, 47622, ​​479306, 5296790, 63779034}

Підрахунок кількості таких перестановок є стандартною проблемою.

Для n = 4 є 2: {{2,4,1,3}, {3,1,4,2}}

Для n = 5 є 14: {{1,3,5,2,4}, {1,4,2,5,3}, {2,4,1,3,5}, {2,4, 1,5,3}, {2,5,3,1,4}, {3,1,4,2,5}, {3,1,5,2,4}, {3,5,1, 4,2}, {3,5,2,4,1}, {4,1,3,5,2}, {4,2,5,1,3}, {4,2,5,3, 1}, {5,2,4,1,3}, {5,3,1,4,2}}

Кількість a (n) цих перестановок швидко зростає: 2, 14, 90, 646, 5242, 47622, ​​479306, 5296790, 63779034, ...

Для великих n відношення a (n) / n! Здається, наближається до межі 1 / e ^ 2 = 0,135335 ... Я не маю суворих доказів, але це лише припущення з числових доказів. Ви можете перевірити це, спробувавши запустити програму в Інтернеті.

Програма вище (на основі наведеної нижче посилання) обчислює ці числа.

Додаткову інформацію можна знайти у відповідній послідовності на OEIS: A002464 . Проблема Герцпрунга: способи розташування n королів, що не атакують, на n X n дошці, по 1 у кожному рядку та стовпці. Також кількість перестановок довжиною n без послідовностей підйому чи падіння.


@ Stewie Griffin Оскільки я новачок тут, будь ласка, поясніть більш детально, що ви маєте на увазі. У своєму першому зауваженні я запропонував алгоритм і код, який вирішує задачу в поліноміальний час. Отже, це слід вважати вирішенням проблеми. Друга частина розширює цікаву проблему. Тому його слід розглядати як коментар.
Доктор Вольфганг Гінце

Я зважився трохи змінити ваше подання, щоб ваш код Mathematica знаходився вгорі. При проблемах з кодовим гольфом обов'язково потрібно надати фактичний код (найкоротше). Те, як я її відформатував, стає відповіддю Mathematica, як ви, напевно, мали намір це зробити, і все ще має своє оригінальне пояснення під ним. Якщо ви відчуваєте, що чогось не вистачає, або я неправильно відредагував вашу первинну відповідь, сміливо відредагуйте її ще раз. Ласкаво просимо до PPCG! :)
Кевін Круїссен

@ Kevin Cruijssen Дуже дякую за теплий прийом та редагування мого наївного подання. Зараз я додав програму Mathematica для другого зауваження. Що, швидше за все, не lege artis. Я більше не знаю, як створити приємне посилання "спробуйте онлайн".
Доктор Вольфганг Гінце

Будь-яке посилання можна створити за допомогою [some text](the_link). Що стосується посилання "Спробуйте в Інтернеті", зокрема, веб-сайт https://tio.run/ , який розміщує наш власний @Dennis, містить посилання на всі види мов програмування. Мова Вольфрам (Mathematica) - одна з них. Угорі ви можете натиснути кнопку відтворення, щоб запустити код, або кнопку гіперпосилання, щоб скопіювати "Спробуйте в Інтернеті". (розмітка-) посилання. І ви можете розділити свій код на фактичний "Код" (ваше подання), за допомогою додаткового заголовка / нижнього колонтитулу для (симпатичного) друку однієї або декількох тестових скринь.
Кевін Круїссен

Вибачте за мій дещо тугий коментар та відсутність відповіді після цього! Відповідь з’явилася у черзі на огляд, і я не помітив коду через форматування. Не рідкість нові користувачі публікують "цікаві спостереження" за викликами, не надаючи на це фактичної відповіді. Хоча це робиться добросовісно, ​​це не те, про що йдеться на сайті. Я думав, що це така відповідь. Я повинен був відповісти на ваш коментар, але я поспішав і не зміг написати новий коментар, тому замість цього я просто видалив старий. Вибачте! І ласкаво просимо на сайт! Я сподіваюся, що ви будете триматися :)
Стюі Гріффін



2

Пробіл , 161 байт

Ось офіційне, без коментарів повідомлення: Спробуйте в Інтернеті!

push_0   
read_n	
		push_0   
retreive_n			push_1  		
subtract	   dup_and_out[ 
 	
 	]label_s'
   
'push_2  		 
subtract	   dup[ 
 ]jump_next_if_neg:
		  
:dup_and_out[ 
 	
 	]else_jump_back:
 
 
:label_ss'
    
'push_0   
retreive_n			push_2  		 
subtract	   dup_and_out[ 
 	
 	]dup[ 
 ]jump_next:
 
    
:label_ssss'
      
'push_2  		 
subtract	   dup[ 
 ]jump_end_if_neg:
		   
:dup_and_out[ 
 	
 	]else_jump_back:
 
    
:label_sss'
     
'end



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

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

Повне пояснення байтів:

[Space][Space][Space][N]                   Push a 0 on the stack
[Tab][Tab][N][Tab][Tab][Tab][Tab]          Read input value and store in heap
[Space][Space][Space][N]                   Push a 0 on the stack again
[Tab][Tab][Tab]                            Retrieve the value from the heap
[Space][Space][Tab][Tab][N]                Push a -1 on the stack
[Tab][Space][Space][Space]                 Add -1 to value
[Space][N][Space]                          Duplicate 
[Tab][N][Space][Tab]                       Output
[N][Space][Space][Space][N]                Set First Label
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 Subtract 2 from value
[Space][N][Space]                          Duplicate
[N][Tab][Tab][Space][Space][N]             If negative, jump to second label
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[N][Space][N][Space][N]                    Jump back to first label
[N][Space][Space][Space][Space][N]         Set Second Label
[Space][Space][Space][N]                   Push a 0 on the stack
[Tab][Tab][Tab]                            Retrieve input value from heap again
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 This time, Add a -2 to the value
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[Space][N][Space]                          Duplicate
[N][Space][N][Space][Tab][N]               Jump to third label
[N][Space][Space][Space][Tab][N]           Set third label
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 Subtract 2 from value
[Space][N][Space]                          Duplicate
[N][Tab][Tab][Space][Space][Space][N]      Jump to end if negative
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[N][Space][N][Space][Tab][N]               Jump back to third label
[N][Space][Space][Space][Space][Space][N]  Set fourth label/end
[N][N][N]                                  Terminate

Деякі речі для гольфу: push_0, read_STDIN_as_int, push_0, retrieveможна push_0, duplicate_0, read_STDIN_as_int, retrieveзберегти байт. І перша мітка може бути порожньою, NSSNа не NSSSN(і тоді друга мітка може бути NSSSN; третя NSSTN; і четверта NSSSSN). Це також має заощадити 8 байт. Також ви можете видалити перший, Jump_to_third_labelтому що ви вже маєте Set_third_labelправо під ним. Всього: 140 байт ; (або з коментарями: спробуйте в Інтернеті .) -3 байти, якщо ви видалите NNNвихід.
Кевін Круїссен


1

Gol> <> , 14 байт

FL:2%Z}:3=?$|B

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

Приклад повної програми та як вона працює

1AGIE;GDlR~
FL:2%Z}:3=?$|B

1AG          Register row 1 as function G
   IE;       Take number input; halt on EOF
      GD     Call G and print the stack
        lR~  Empty the stack
             Repeat indefinitely

F           |   Repeat n times...
 L              Push loop counter (0..n-1)
  :2%Z}         If even, move to bottom of the stack
       :3=?$    If top == 3, swap top two
                  This is activated only once to make [2 0 3 1]
             B  Return


1

Java 8, 56 байт

n->{for(int i=n;i>0;)System.out.println((i+--i)%(n|1));}

Порт @Neil JavaScript (ES6) відповідь «s .

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


Відповідь на старі 66 байт:

n->{String[]r={"",""};for(;n-->0;)r[n%2]+=n+" ";return r[0]+r[1];}

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

Пояснення:

n->{                  // Method with integer parameter and String return-type
  String[]r={"",""};  //  Result-Strings, both starting empty
  for(;n-->0;)        //  Loop in the range (n, 0]
    r[i%2]+=i+" ";    //   Append `i` and a space to one of the two result-Strings,
                      //   depending on if it is even (first) or odd (second)
  return r[0]+r[1];}  //  Return the two result-Strings appended to each other

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