Ненормальные перестановки

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 Да, каждая организация должна выводить одно число. Может ли это быть яснее?
Пост Рок Гарф Хантер
1
@totallyhuman Стандартные правила вывода для любого языка, который вы используете. Я уточню вопрос, чтобы прояснить это.
Пост Рок Гарф Хантер
1
@EriktheOutgolfer Нет разрыва связи. Мартин, возможно, нашел способ набрать бесконечность в CJam, но есть много других языков, которые можно примерить.
Пост Рок Гарф Хантер

Ответы:

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счетчик должен считаться строкой, потому что как число он будет переполнен (позже, чем конец юниверса, но учитывается принцип). По той же причине я «подсчитываю» количество строк, создавая строку As вместо использования реального счетчика, хотя это переполнение произойдет даже позже.

Еще один способ сделать это в 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Ƒ?

Попробуйте онлайн!

dylnan
источник
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в программу, но не смог найти.

benj2240
источник
0

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

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

Попробуйте онлайн! 0 индексированные. Символ at в начале каждой строки помещает отдельные символы в глобальный массив. Остальной код выполняется бесполезно, за исключением последней строки, где он объединяет значения в строку, а затем находит свой индекс перестановки. 1,114,112 - это количество возможных символов Unicode на момент написания (конечно, проще всего продемонстрировать кодовые точки 48-57).

Нил
источник