Existe um teorema bem conhecido de que qualquer permutação pode ser decomposta em um conjunto de ciclos . Seu trabalho é escrever o programa mais curto possível para isso.
Entrada:
Duas linhas. O primeiro contém um número N
, o segundo contém N
números inteiros distintos no intervalo, [0,N-1]
separados por espaços. Esses números inteiros representam uma permutação de N
elementos.
Resultado:
Uma linha para cada ciclo na permutação. Cada linha deve ser uma lista separada por espaços de números inteiros em ordem de ciclo.
Os ciclos podem ser emitidos em qualquer ordem e cada ciclo pode ser iniciado a partir de qualquer posição.
Exemplo 1:
8
2 3 4 5 6 7 0 1
Esta entrada codifica a permutação 0-> 2, 1-> 3, 2-> 4, 3-> 5, 4-> 6, 5-> 7, 6-> 0, 7-> 1. Isso se decompõe em ciclos como este:
0 2 4 6
1 3 5 7
Uma saída igualmente válida seria
5 7 1 3
2 4 6 0
Exemplo 2:
8
0 1 3 4 5 6 7 2
saída válida:
0
1
4 5 6 7 2 3
fonte
>C.
Respostas:
C
145134 caractereshttp://www.ideone.com/BrWJT
fonte
int
?gets(&i)
ideia de me livrar dessa primeira linha inútil, mas isso claramente não funcionaria em sistemas de 16 bits se mais de 10 elementos fossem passados. Mas, mais uma vez, se as regras estiverem "encontrando pelo menos um programa que afirma ser um compilador C que cria um executável, em que pelo menos um caso parece - pelo menos para mim - dar uma resposta válida", isso é uma melhoria: )Python 131 chars
a nova linha final não é necessária
fonte
Haskell, 131 caracteres
>=
tornou-se>
, eliminou duastail
chamadas através de correspondência de padrões e pré-aplicação dea!!
.fonte
C (tipo de), 139 caracteres
A nova linha final não está incluída.
Eu disse "mais ou menos" porque o AFAIK, por exemplo
int
não pode ser omitido para declaração de variável (não encontrei onde é dito que pode ser omitido e a declaração implícita de tipo é descrita apenas para funções. A especificação gramatical no padrão é basicamente inútil, pois aceita muito mais do que declarações C válidas, por exemplodouble double void volatile x;
)mas o código acima compilado com
gcc -ocycles cycles.c
aparentemente funciona de qualquer maneira.fonte
scanf
sem#include <stdio.h>
mesmo se os parâmetros estiverem corretos e não exigirem conversões ):<<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 (entre 2 e 32)
Não sou muito claro quanto ao formato de E / S, mas acho que
C.
seria bom se a seguinte saída fosse aceita:(Parece melhor no terminal J.)
Se precisar ser uma função nomeada que atenda ao meu melhor entendimento do formato de E / S, seriam 32 caracteres, dos quais 30 são para conversão de formato de saída ...
Em ação:
Explicação:
J é executado da direita para a esquerda (praticamente).
@
é uma 'função' (não tecnicamente uma função, mas que é próxima o suficiente) para combinar funções.i.&LF
- encontre o primeiro índice deLF
, uma variável predefinida que contém o número de caracteres ASCII 10, o avanço de linha.>:
- encontre o primeiroLF
e aumente seu índice em um. Na verdade, não queremos o avanço de linha, queremos a matriz que o segue.}.~
- Seleciona a parte da entrada que queremos.".
- Como o formato de entrada é J ( * \ õ / * ) válido , podemos apenas usar oeval
verbo (sei que na verdade não é chamadoeval
.) Para transformá-lo em uma matrizC.
- Pura magia. Eu realmente não tenho idéia do que isso faz, mas parece funcionar!":L:0
- representação. Transforma a saída deC.
em uma sequência de seqüências de caixa>
- Unbox. A saída real é na verdade uma matriz de cadeias de caracteres (há espaços atrás do primeiro nos números do exemplo).fonte
Clojure, 145
Um pouco não-destruído e dividido em uma função (a entrada deve ser um vetor, que é o que produz (vec (leitura repetida)) acima):
(Uau, acabei de perceber que esse desafio tem mais de 3 anos. Ah, bem, me diverti fazendo isso de qualquer maneira!)
fonte