Суперпермутації


26

Вступ

Ви злочинець, якому доручено викрасти таємні плани у нового технічного старту Dejavu. Ви підкрадаєтеся до задньої стінки, але знаходите двері, для її відкриття потрібна шпилька. Ви розпізнаєте марку блокування і знаєте, що потрібно 5-значний штифт, використовуючи всі цифри від 0 до 4. Після кожної введеної цифри блокування перевіряє останні 5 введених цифр і відкривається, якщо код правильний. Ви повинні пройти цей замок, і швидко.

Суперпермутації в горішці

Перестановка - це всі можливі комбінації певного набору цифр. наприклад, усі перестановки цифр 0, 1, 2:

012, 021, 102, 120, 201 та 210.

Якщо ми об'єднаємо всі ці перестановки разом, отримаємо суперпермутацію:

012021102120201210

ця суперпермутація містить усі перестановки 0, 1, 2, але можна зробити одну коротшу за цю. Я збираюся трохи пропустити тут, але найкоротша суперпермутація цих цифр:

012010210

Для наших намірів і цілей це, по суті, найкоротший рядок цифр, який містить усі можливі перестановки цих цифр, тобто суперпермутацію.

Завдання

Ваше завдання трохи складніше, ніж приклад суперпермутації, як показано вище, тому що ви маєте турбуватися ще про дві цифри. - Якщо ви ще не читали про суперпермутації, або мій приклад вище був трохи незрозумілим, я настійно пропоную вам прочитати цю чудову статтю Патріка Гоннера на цю тему (цей виклик був дуже сильно натхненний його статтею, тому кудо йому:) https://www.quantamagazine.org/unscrambling-the-hidden-secrets-of-superpermutations-20190116/ . Ваша мета - написати найкоротшу можливу програму, яка генерує суперпермутацію цифр від 0 до 4.

Оцінка балів

Ваша програма не приймає жодного вводу будь-якого виду і виробляє надвиміщення цифр від 0 до 4. Ця результуюча суперпермутація повинна бути надрукована на консоль або видимо відображена користувачеві в межах, передбачених вашою мовою на вибір. Це не повинно бути найкоротшою можливою перестановкою, вона повинна бути дійсною суперпермутацією. Через це мета полягає в тому, щоб написати найкоротшу програму з найкоротшим суперпермутацією, тож слід обчислити свій бал так:

розмір файлу (байти) * згенерована довжина суперпермутації (цифри)

Наприклад, якщо я мав програму на 40 байт, і моя суперпермутація становить 153 цифри, моя оцінка буде такою:

40 * 153 = 6120

як завжди, мета полягає в тому, щоб цей показник був максимально низьким.

Шаблон

Ось як слід опублікувати свою відповідь:

Мова | Оцінка

посилання на код у робочому середовищі (якщо можливо)

code snippet

пояснення коду тощо.

Фінали

Це одне з моїх перших питань на цьому сайті. Тож будь ласка, скажіть мені, якщо я щось пропускаю, або розділ мого виклику незрозумілий. Дякую, і весело гольфу!


Чи можемо ми знати довжину найкоротшого суперпермутації, щоб отримати уявлення про найнижчий бал?
Фаталізувати

1
@Fatalize 153 є найкоротшим
TFeld

1
@Fatalize Дивіться A180632 .
Арнольд

1
На перший погляд це виглядає так, що це просто запитує послідовність де Бруйна; однак критерій оцінювання робить цей виклик цікавим. Молодці!
Ерік Аутгольфер

3
@EriktheOutgolfer Це не просто бальна різниця: суперпермутація включає всі перестановки деякої довжини, тоді як послідовність де Бруйна включає всі рядки деякої довжини.
Anders Kaseorg

Відповіді:


6

05AB1E , оцінка = 1673 (7 байт · 239)

žBœ∊{3ý

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

Як це працює

žB          push 1024
  œ         permutations: ["1024", "1042", …, "4201"]
   ∊        vertically mirror: ["1024", "1042", …, "4201", "4201", …, "1042", "1024"]
    {       sort: ["0124", "0124", "0142", "0142", …, "4210", "4210"]
     3      push 3
      ý     join: "01243012430142301423…3421034210"

Pyth , оцінка = 1944 (9 байт · 216)

s+R+4d.p4

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

Як це працює

 +R   .p4   append to each permutation d of [0, 1, 2, 3]:
   +4d        [4] + d
s           concatenate

1
vy3yJрятує байт
Емінья

1
У коді Pyth, m+d-> +Rзберігає байт.
isaacg

8
Чи не було б краще розмістити це як два роздільних відповіді, оскільки підходи та мови програмування обидва різні?
Кевін Крейссен

@KevinCruijssen Meh, вони обидві варіанти на тему з’єднання перестановок 4 елементів з рештою елементом; моя відповідь 05AB1E насправді має приблизно стільки ж спільного з моєю відповіддю Pyth, скільки це стосується різних версій. Тому я не хотів просити вдвічі більше грошей, а саме за перемикання мов.
Андерс Касеорг

3

Брахілог , оцінка = 2907 (19 байт × 153)

4⟦pᶠP∧~l.g;Pz{sᵈ}ᵐ∧

Занадто повільно, щоб побачити що-небудь, але якщо ви змінилися 4, 2можете перевірити це: Спробуйте в Інтернеті!

Це знаходить найкоротшу суперпермутацію як таку:

4⟦                   The range [0,1,2,3,4]
  pᶠP                P is the list of all permutations of this range
     ∧
      ~l.            Try increasing lengths for the output
         g;Pz        Zip the output with P
             {sᵈ}ᵐ   For each permutation, it must be a substring of the output
                  ∧

2

JavaScript (ES6), 26975 (325 * 83 байт)

У цій системі підрахунків мало місця для "жорсткого коду оптимальної супермутації" та "просто використовувати короткий вбудований модуль для об'єднання всіх перестановок" , принаймні в не-езолангах.

Ось спроба все одно.

f=(a=[0,1,2,3,4],p=r='')=>a.map((v,i)=>f(a.filter(_=>i--),p+v))|~r.search(p)?r:r+=p

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

Він генерує рядок з 325 байт:

012340124301324013420142301432021340214302314023410241302431031240314203214032410341203421
041230413204213042310431204321102341024310324103421042310432201342014320314203412041320431
210342104330124301423021430241304123042131024310423201432041321044012340132402134023140312
4032141023410324201342031421034301243021431024320143210

У вас є дійсний пункт, я скажу, що я трохи переживав за систему балів. Надалі я спробую бути більш уважним і забивати так, щоб це дозволило отримати найрізноманітніші методи. : D
Ісаак C

Якщо ви зможете повернути рядок менш 23 байтових 26975/153-153>23
панелей, жорстке

@Sanchises Нам потрібно 5 байтових котлів для рядка або 4 для BigInt .
Арнольд

@Sanchises Ми можемо трохи стиснути струну: Спробуйте в Інтернеті! (або менше, якщо ви не рахуєте за замовчуванням nсуфікс, який console.logвиводиться)
Ніл


2

05AB1E , оцінка: 5355 2160 (216 * 10 байт )

3ÝœJε4yJ}J

Порт відповіді Pyth @AndersKaseorg , тому не забудьте підтримати його!

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

Пояснення:

3Ý           # Push a list in the range [0,3]: [0,1,2,3]
  œ          # Get all possible permutations of this list
   J         # Join each inner list together to a single string
    ε        # Map each string `y` to:
             #  (Push string `y` implicitly)
     4       #  Push 4
      y      #  Push string `y` again
       J     #  Join all three together
        }J   # After the map: Join all strings together to a single string
             # (and output it implicitly as result)

2

Октава , 27 х 442 = 11934

'01234'(perms(1:5)'(4:445))

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

Отже, виявляється, наївно генерувати всі перестановки, а потім підрізати до найкоротшого підрядка, який все ще є дійсною суперпермутацією, коротший, ніж генерувати найкоротшу суперпермутацію. На жаль, цього разу оцінка не є паліндром.

Октава , 97 х 153 = 14841

a=sym(9);while i<120
i=0;a+=1;q='01234';for t=q(perms(1:5))'
i+=any(regexp(char(a),t'));end
end
a

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

Запис оновлено для кількох речей

  • a++ не реалізовано для символічних чисел.
  • contains()не реалізовано в Octave. Замінено на any(regexp()).
  • У онлайн-посиланні я вручну ввів aдуже близьку до суперпермутації довжиною 153. Це дозволяє перевірити рішення.

2

CJam (6 * 240 = 1440)

5e!72>

Інтернет демо , перевірка (виводить індекс , при якому кожна перестановка 0..4може бути знайдена, вона повинна вирівнюватися вихід , так як оригінальна програма дає відповідний вихід на стандартний висновок , але то , що він поміщає в стік не можуть безпосередньо використовуватися).

Підхід викрадено у Sanchises , хоча порядок перестановки CJam різний, надаючи іншу підрядку.


CJam (22 * 207 = 4554)

0a4{)W@+W+1$)ew\a*W-}/

Інтернет демо , перевірка .

Розсічення

Для цього використовується проста рекурсивна конструкція.

0a       e# Start with a superpermutation of one element, [0]
4{       e# for x = 0 to 3:
  )      e#   increment it: n = x+1
  W@+W+  e#   wrap the smaller superpermutation in [-1 ... -1]
  1$)ew  e#   split into chunks of length n+1
  \a*    e#   insert an n between each chunk
  W-     e#   remove the -1s from the ends
}/


1

Вугілля деревне , 29 байт, довжина виводу 153, оцінка 4437

”)⊞⧴�r3⁼H⁴↓¦σ✳LïpWS [T↑ZωÞ”‖O

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення: Як і @TFeld, я просто надруковую половину суперпермутації та дзеркально відображаю її. Я розраховував суперпермутацію, використовуючи наступний код:

Push(u, w);
for (u) {
    Assign(Plus(Plus(i, Length(i)), i), h);
    Assign(Ternary(i, Join(Split(w, i), h), h), w);
    Assign(Incremented(Length(i)), z);
    if (Less(z, 5)) for (z) Push(u, Slice(h, k, Plus(k, z));
}
Print(w);

Це означає 45-байтову програму у вугільному вугіллі, тому вона набрала б 6885.




0

Perl 6 , 7191 (153 * 47 байт)

say first *.comb(permutations(5).all.join),0..*

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

Знаходить перше число, яке містить усі перестановки цифр від 0 до 4. Виконання цього потребуватиме багато часу, але ви можете перевірити його за допомогою перших двох перестановок 0і0,1


0

Мова Вольфрама (Mathematica) , 153 * 95 байт, 14535

Nest[Flatten[Join[#,{Max@#+1},#]&/@Partition[#,Max@#+1,1]]//.{b__,a__,a__,c__}:>{b,a,c}&,{0},4]

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





Приємно! Я просто хотів опублікувати 153 рішення. Якщо ви хочете, ви можете опублікувати нову відповідь
J42161217

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