Istnieje dobrze znane twierdzenie, że dowolną permutację można rozłożyć na zbiór cykli . Twoim zadaniem jest napisanie możliwie najkrótszego programu.
Wejście:
Dwie linie. Pierwszy zawiera liczbę N
, drugi zawiera N
wyraźne liczby całkowite w zakresie [0,N-1]
oddzielone spacjami. Te liczby całkowite reprezentują permutację N
elementów.
Wynik:
Jedna linia dla każdego cyklu w permutacji. Każdy wiersz powinien być oddzieloną spacjami listą liczb całkowitych w kolejności cyklicznej.
Cykle mogą być wyprowadzane w dowolnej kolejności, a każdy cykl może być generowany od dowolnej pozycji.
Przykład 1:
8
2 3 4 5 6 7 0 1
To wejście koduje permutację 0-> 2, 1-> 3, 2-> 4, 3-> 5, 4-> 6, 5-> 7, 6-> 0, 7-> 1. Rozkłada się to na takie cykle:
0 2 4 6
1 3 5 7
Równie poprawne wyjście byłoby
5 7 1 3
2 4 6 0
Przykład 2:
8
0 1 3 4 5 6 7 2
prawidłowe wyjście:
0
1
4 5 6 7 2 3
code-golf
math
combinatorics
permutations
Keith Randall
źródło
źródło
>C.
Odpowiedzi:
C
145134 znakówhttp://www.ideone.com/BrWJT
źródło
int
?gets(&i)
pomysł, aby pozbyć się tej bezużytecznej pierwszej linii, jednak najwyraźniej nie działałoby to w systemach 16-bitowych, jeśli przejdzie więcej niż 10 elementów. Ale jeszcze raz, jeśli reguły „znajdują co najmniej program, który twierdzi, że jest kompilatorem C, który tworzy plik wykonywalny, w którym przynajmniej w jednym przypadku wydaje się - przynajmniej dla mnie - dać prawidłową odpowiedź”, to jest to poprawa: - )Python 131 znaków
końcowy znak nowej linii nie jest potrzebny
źródło
Haskell, 131 znaków
>=
stało się>
, wyeliminowano dwatail
wywołania poprzez dopasowanie wzorca i wstępne zastosowaniea!!
.źródło
C (w pewnym sensie), 139 znaków
Ostateczna nowa linia nie jest uwzględniona.
Powiedziałem „sort-of”, bo na przykład AFAIK
int
nie można pominąć w deklaracji zmiennej (nie znalazłem miejsca, w którym powiedziano, że można ją pominąć, a niejawna deklaracja typu jest opisana tylko dla funkcji. Specyfikacja gramatyki w standardzie jest w zasadzie bezużyteczna, ponieważ akceptuje na przykład znacznie więcej niż prawidłowe deklaracje C.double double void volatile x;
)ale powyższy kod skompilowany z
gcc -ocycles cycles.c
najwyraźniej i tak działa.źródło
scanf
bez,#include <stdio.h>
nawet jeśli parametry są prawidłowe i nie wymagają konwersji ):<<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 (od 2 do 32)
Nie do końca rozumiem format we / wy, ale myślę,
C.
że tak, gdyby zaakceptowano następujące dane wyjściowe:(Wygląda lepiej w terminalu J.)
Jeśli musi to być funkcja nazwana, która odpowiada mojemu najlepszemu zrozumieniu formatu we / wy, będzie to 32 znaki, z czego 30 to konwersja formatu wyjściowego ...
W akcji:
Wyjaśnienie:
J jest wykonywany od prawej do lewej (praktycznie).
@
to „funkcja” (technicznie nie jest to funkcja, ale wystarczająco blisko) do łączenia funkcji.i.&LF
- znajdź pierwszy indeksLF
predefiniowanej zmiennej zawierającej znak ASCII o numerze 10, znak nowej linii.>:
- znajdź pierwszyLF
i zwiększ jego indeks o jeden. W rzeczywistości nie chcemy podawania linii, chcemy tablicy, która za nią podąża.}.~
- Wybiera tę część wejścia, którą chcemy.".
- Ponieważ format wejściowy jest prawidłowy J ( * \ õ / * ), możemy po prostu użyćeval
czasownika (wiem, że tak naprawdę nie jest wywoływanyeval
.), Aby przekształcić go w tablicęC.
- Czysta magia. Naprawdę nie mam pojęcia, co to działa, ale wydaje się, że działa!":L:0
- reprezentacja. Zamienia dane wyjścioweC.
w sekwencję ciągów w ramkach>
- Rozpakuj. Rzeczywistym wyjściem jest w rzeczywistości tablica ciągów (za pierwszymi liczbami w przykładzie znajdują się spacje).źródło
Clojure, 145
Trochę niepoznany i podzielony na funkcję (wejście musi być wektorem, co jest tym, co (vec (wielokrotnie (czytaj) czytaj)) z powyższego):
(Wow, właśnie zauważyłem, że to wyzwanie ma ponad 3 lata. No cóż, i tak dobrze się bawiłem!)
źródło