Хорошо известна теорема о том, что любая перестановка может быть разложена на множество циклов . Ваша задача - написать максимально короткую программу для этого.
Входные данные:
Две строчки Первый содержит число N
, второй содержит N
различные целые числа в диапазоне, [0,N-1]
разделенные пробелами. Эти целые числа представляют перестановку N
элементов.
Выход:
Одна строка для каждого цикла в перестановке. Каждая строка должна быть разделенным пробелами списком целых чисел в порядке цикла.
Циклы могут выводиться в любом порядке, и каждый цикл может выводиться, начиная с любой позиции.
Пример 1:
8
2 3 4 5 6 7 0 1
Этот вход кодирует перестановку 0-> 2, 1-> 3, 2-> 4, 3-> 5, 4-> 6, 5-> 7, 6-> 0, 7-> 1. Это разлагается на циклы, как это:
0 2 4 6
1 3 5 7
В равной степени действительный результат будет
5 7 1 3
2 4 6 0
Пример 2:
8
0 1 3 4 5 6 7 2
действительный вывод:
0
1
4 5 6 7 2 3
code-golf
math
combinatorics
permutations
Кит Рэндалл
источник
источник
>C.
Ответы:
C
145134 символовhttp://www.ideone.com/BrWJT
источник
int
?gets(&i)
идея избавиться от этой бесполезной первой строки, однако это явно не сработает на 16-битных системах, если передано более 10 элементов. Но еще раз, если правила «находят, по крайней мере, программу, которая претендует на то, чтобы быть компилятором C, которая создает исполняемый файл, где, по крайней мере, в одном случае кажется - по крайней мере, мне - дать правильный ответ», тогда это улучшение: )Python 131 символ
окончание новой строки не требуется
источник
Хаскель, 131 персонаж
>=
стал>
, устранены дваtail
вызова, хотя сопоставление с образцом и предварительное применениеa!!
.источник
С (вроде), 139 символов
Финальный перевод строки не включен.
Я сказал "вроде", потому что AFAIK, например,
int
не может быть опущено для объявления переменной (я не нашел, где сказано, что это может быть опущено, и неявное объявление типа описано только для функций. Спецификация грамматики в стандарте в основном бесполезна, так как принимает намного больше, чем допустимые объявления C, напримерdouble double void volatile x;
)но приведенный выше код, скомпилированный с, по-
gcc -ocycles cycles.c
видимому, работает в любом случае.источник
scanf
без нее,#include <stdio.h>
даже если параметры верны и не требуют преобразований ):<<If the function is defined with a type that includes a prototype, and the types of the arguments after promotion are not compatible with the types of the parameters, or if the prototype ends with an ellipsis ( ", ..." ), the behavior is undefined.>>
J (от 2 до 32)
Я не совсем ясно о формате ввода /
C.
вывода , но я думаю, что будет, если будет принят следующий вывод:(В терминале J выглядит лучше.)
Если это должна быть именованная функция, которая соответствует моему лучшему пониманию формата ввода-вывода, то это будет 32 символа, из которых 30 для преобразования выходного формата ...
В бою:
Объяснение:
J выполняется справа налево (практически).
@
это «функция» (технически не функция, но это достаточно близко) для объединения функций.i.&LF
- найти первый индексLF
, предопределенную переменную, содержащую символ ASCII номер 10, перевод строки.>:
- найти первоеLF
и увеличить его индекс на единицу. На самом деле нам не нужен перевод строки, нам нужен массив, следующий за ним.}.~
- Выбирает ту часть ввода, которую мы хотим.".
- Поскольку формат ввода действителен J ( * \ х / * ), мы можем просто использоватьeval
глагол (я знаю, что он на самом деле не вызываетсяeval
.), Чтобы превратить его в массивC.
- Чистая магия. Я действительно понятия не имею, что это делает, но, похоже, работает!":L:0
- Представление. Превращает выводC.
в упакованную последовательность строк>
- Распаковать. Фактический вывод - это строковый массив (за первым номером стоят пробелы).источник
Clojure, 145
В некоторой степени не разобрано и разбито на функцию (вход должен быть вектором, который и производит (vec (многократно (читается))) сверху):
(Ух ты, только что заметил, что этому заданию уже более 3 лет. Ну да ладно, в любом случае было весело!)
источник