Засуджені перестановки


14

Ваше завдання полягає в тому, щоб написати комп'ютерну програму таким чином, що коли вона буде розрізана на рядки (розділити на символ нового рядка), кожне розташування рядків видаватиме різну кількість між 1 і n! (де n - загальна кількість рядків). Жодне число не повинно виводитись двома різними схемами, і кожна композиція повинна виводити число в цьому діапазоні. Оскільки є n! способи впорядкування рядків програми, це означає, що кожне число повинно виводитися за допомогою однієї перестановки.

Наприклад, програма python

print 1;"""
print 2;"""

Має дві домовленості

print 1;"""
print 2;"""

і

print 2;"""
print 1;"""

Перші виходи 1 і другий виходи 2.

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

Оцінка балів

Ваш бал становитиме кількість рядків у вашій програмі, чим більший бал буде кращим. Якщо ви хочете, ви можете виводити числа від 0 до n! -1 .


3
Як щодо відповідей, які представляють конструкції, які працюють для будь-якого n? Чи всі вони зв'язані з рахунком ∞?
Мартін Ендер

@MartinEnder Так. ∞ - хороший бал. Якщо ви знайдете таке будівництво, то ви виграєте.
Пост Рок-Гарф Мисливець

@AdmBorkBork Так, кожна домовленість повинна виводити одне число. Чи може це бути зрозуміліше?
Опублікувати Rock Garf Hunter

1
@totallyhuman Стандартні правила виводу для будь-якої мови, якою ви користуєтесь. Я оновлю питання, щоб було повністю зрозуміло з цього приводу.
Опублікувати Rock Garf Hunter

1
@EriktheOutgolfer Немає краватки. Мартін, можливо, знайшов спосіб оцінити нескінченність в CJam, але є багато інших мов, щоб спробувати.
Опублікувати Rock Garf Hunter

Відповіді:


7

CJam , оцінка: ∞

Кожен рядок має форму

];Lx+:L{__(f<0+:+\,,(;1+:**\(;}h]:+

де xчисло від 0до n-1. Результат знаходиться в діапазоні 0доn!-1 .

Спробуйте в Інтернеті! (Для n=3.)

Кредити jimmy23013 для коду , який обчислює фактичний індекс перестановки. Я лише замінив біт, який зчитує вхід, з ];Lx+:Lякого відкидає результат з попереднього рядка, а потім додає індекс поточного рядка до змінної L(яка спочатку є порожнім масивом).


О, я це написав. Але це не виглядає гофровано (наприклад, 0+:+) Я думаю, що ви можете отримати набагато більш коротку версію, використовуючи ,m!#.
jimmy23013

4

Perl: ∞

$z.="-1,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}
$z.="-2,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}
$z.="-3,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}

Розширити на будь-яку потрібну вам довжину

Швидко закінчиться пам'ять, оскільки використання пам'яті подібно до O (n ^ n). Однак було б легко замінити індексатор перестановки кодом O (n) трохи довше. Я просто ілюструю те, як ви можете використовувати END{}для цього завдання в perl. Усі END{}блоки працюють під час виходу, але тільки перший, який буде викликаний (останній у коді), виведе щось із-за /A/тесту, який відповідає лише один раз

Зауважте, що $mлічильник повинен рахуватися як рядок, тому що як число воно переповниться (пізніше кінця Всесвіту, але цей принцип рахується). З цієї ж причини я "підраховую" кількість рядків, будуючи рядок зA s замість реального лічильника, хоча це переповнення відбудеться навіть пізніше.

Ще один спосіб зробити це в perl:

@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"1".!($a.=A),
@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"2".!($a.=A),
@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"3".!($a.=A),

При цьому використовується той факт, що в foo = bar barвиконується після foo. Ця версія, до речі, не божевільна у часі та просторі, але це робить код довшим

Ще одна ідея - використовувати те, DESTROYщо має перевагу в тому, що буде виконаний лише один із них. Я не збираюся повторювати код індексації перестановки, про який я вже наводив два приклади.

push@F,"1";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }
push@F,"2";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }
push@F,"3";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }

Або використовуючи BEGIN:

BEGIN{push@F,"1"} print"Work out permutation index of @F\n"; exit;
BEGIN{push@F,"2"} print"Work out permutation index of @F\n"; exit;
BEGIN{push@F,"3"} print"Work out permutation index of @F\n"; exit;

3

Желе , ∞

;3ÇQŒ¿$⁼Q$?
;2ÇQŒ¿$⁼Q$?
;1ÇQŒ¿$⁼Q$?

(Приклад з n=3.)

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

23 13 11 байт на рядок.

Для програми з nрядками рядки матимуть формат

; <i> ÇQŒ¿$⁼Q$?

де <i>представляє число буквально, iі кожен рядок має різне значення для iдіапазону від 1до n. (Значення для iнасправді не повинні бути цими конкретними числами, вони просто повинні мати унікальні додатні значення.) Ця програма більше не використовується nв структурі рядків.

Як?

  • Без аргументу Джеллі починається з 0 .
  • ;1додає 1до 0чи активного списку.
  • ⁼Q$- умовна монада для оператора if ( ?), який перевіряє, чи унікальні елементи списку. Якщо вони є, посилання вище називається ( Ç), а інший номер додається до списку. Якщо вони не є унікальними, це означає, що ми завернулися до першого посилання. Повторний елемент видаляється зі списку ( Q), а індекс перестановки знайдено ( Œ¿). Зауважте, що 0на початку списку Œ¿є час, коли він зроблений, але це не впливає на вихід, оскільки значення для "" " iє позитивними.

Нова особливість желе

З нещодавно доданим Ƒшвидким, ми можемо зменшити ⁼Q$до , економивши байт.

10 байт / рядок (для однозначних цифр)

;1ÇQŒ¿$QƑ?

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


2

Мозг-Флак , 3

(({}){})
({}())
(()(){([()()]{})()(){[()()](<{}>)}}{})

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

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

Пояснення

Починаємо з базової програми

(({}){})
({}())

Цей бал отримує 2 самостійно. Для того, щоб перейти на наступний рівень, я хочу додати новий рядок. Моя початкова здогадка була

(()(){[()()]{}(<()>)}{})

Це встановлює TOS, 2якщо він дорівнює нулю, і нічого іншого не робить. Це насправді хороший старт. За допомогою двох інших рядків ми можемо отримати всі числа, 1за 6винятком 4, тому що є 2способи виведення 2:

({}())
(({}){})
(()(){[()()]{}(<()>)}{})

і

({}())
(()(){[()()]{}(<()>)}{})
(({}){})

Для того щоб виправити це ми робимо нашу лінію також встановити , 2щоб бути 4. Це можна зробити за допомогою

(()(){([()()]{})()(){[()()](<{}>)}}{})

Для наочності це в основному реалізує функцію Haskell

f 0 = 2
f 2 = 4
f x = x

Це вирішує нашу проблему, оскільки одна з програм, яка раніше виводилась, 2виводить дані, 4не змінюючи жодної програми.


2

Java 7, оцінка: ∞

public class DerangedRearrangements implements B{public void a(){System.out.println("0");}public static void main(String[]a)throws Exception{java.util.regex.Pattern p=java.util.regex.Pattern.compile("^(?:public )?class ([\\w]+).*");java.io.BufferedReader r=new java.io.BufferedReader(new java.io.FileReader("./DerangedRearrangements.java"));String line; while((line=r.readLine())!=null){java.util.regex.Matcher m=p.matcher(line);if(m.matches()){((B)Class.forName(m.group(1)).getDeclaredConstructor().newInstance()).a();}}}}interface B{void a();}
class b1 implements B{public void a(){System.out.println(getClass().getName().substring(1));}}

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

Це може роздрукувати від 0 до n! -1 . Додаткові рядки мають такий формат (де INDEX - це число від 1 до n! -1 ):

class b<INDEX> implements B{public void a(){System.out.println(getClass().getName().substring(1));}}

Цей метод працює, читаючи власне джерело, щоб визначити, що в ньому перераховані класи порядку. На жаль, не було способу кулера, який я міг би знайти, розбираючи скомпільований файл або створюючи користувальницький ClassLoader завдяки тому, як java компілює JIT. Я гадаю, що я міг би мати кожен додатковий клас просто роздрукувати статично визначене число, але це здалося веселішим. Це також зробило б це, щоб я міг видалити Bінтерфейс, але оцінка не базується на байтах, тому я залишу це для задоволення.

Як це працює (високий рівень):

Читає власний вихідний код за рядком. Оскільки кожен рядок оголошує новий клас, ми використовуємо роздуми, щоб створити екземпляр нового класу та викликати його aметод, який він повинен мати, оскільки він реалізує Bінтерфейс.


1

Рубі , оцінка: ∞

(a||=[])<<2;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))
(a||=[])<<1;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))
(a||=[])<<3;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))

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

Ця програма має 61 байт на рядок (для n <10). Він має той самий базовий формат, що і розчин дилнан ; перше число у кожному рядку буде різним значенням між 1та n, а друге число у кожному рядку буде n.

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



0

05AB1E , оцінка: 1,114,112

0ˆ¯JD{œsk
1ˆ¯JD{œsk
2ˆ¯JD{œsk

Спробуйте в Інтернеті! 0-індексований. ˆ на початку кожного рядка виштовхує різні символи до глобального масиву. Решта коду марно виконується за винятком останнього рядка, де він об'єднує значення в рядок, а потім знаходить свій перестановочний індекс. 1,114,112 - це кількість можливих символів Unicode під час написання (кодові пункти 48-57 є найпростішими для демонстрації, звичайно).

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