Twoim zadaniem jest napisanie programu komputerowego, który po podzieleniu na linie (podział na znak nowego wiersza) w każdym układzie wierszy wyświetli inną liczbę od 1 do n! (gdzie n jest całkowitą liczbą linii). Żadne liczby nie powinny być wyprowadzane przez dwa różne układy, a każdy układ powinien wypisywać liczbę w tym zakresie. Ponieważ istnieje n! sposoby ułożenia linii programu oznacza, że każda liczba powinna być wyprowadzana przez jedną zmianę układu.
Na przykład program python
print 1;"""
print 2;"""
Ma dwa ustalenia
print 1;"""
print 2;"""
i
print 2;"""
print 1;"""
Pierwsze wyjścia 1
i drugie wyjścia 2
.
Możesz używać formatów wyjściowych standardowych w języku, którego używasz. Nie możesz zakładać żadnego rodzaju bojlera. Myślę, że to wyzwanie jest bardziej interesujące, jeśli musisz obejść formaty, na które nalega ten język.
Punktacja
Twój wynik będzie liczbą linii w twoim programie, przy czym wyższy wynik będzie lepszy. Możesz wybrać wyświetlanie liczb od 0 do n! -1, jeśli chcesz.
źródło
n
? Czy wszystkie są powiązane z wynikiem ∞?Odpowiedzi:
CJam , wynik: ∞
Każda linia ma formę
gdzie
x
jest liczba od0
don-1
. Wynik mieści się w zakresie0
odn!-1
.Wypróbuj online! (Dla
n=3
.)Podziękowania dla jimmy23013 dla kodu, który oblicza aktualny indeks permutacji. Zastąpiłem tylko bit, który odczytuje dane wejściowe,
];Lx+:L
które odrzucają wynik z poprzedniego wiersza, a następnie dodaje indeks bieżącego wiersza do zmiennejL
(która początkowo jest pustą tablicą).źródło
0+:+
) Myślę, że możesz uzyskać znacznie krótszą wersję,m!#
.Perl: ∞
Rozciągnij na dowolną długość
Szybko zabraknie pamięci, ponieważ użycie pamięci jest jak O (n ^ n). Łatwo byłoby jednak zastąpić indeksator permutacji kodem O (n), tylko dłużej. Właśnie ilustruję sposób, w jaki możesz użyć
END{}
tego zadania w Perlu. WszystkieEND{}
bloki działają w momencie wyjścia, ale tylko pierwszy, który zostanie wywołany (ostatni w kodzie), wyświetli cokolwiek z powodu/A/
testu, który jest prawdziwy tylko razZauważ, że
$m
licznik musi się liczyć jako ciąg, ponieważ jako liczba przelałaby się (później niż koniec wszechświata, ale liczy się zasada). Z tego samego powodu „liczę” liczbę wierszy, konstruując ciągA
s zamiast prawdziwego licznika, chociaż to przepełnienie nastąpiłoby nawet później.Inny sposób, aby to zrobić w Perlu:
Wykorzystuje to fakt, że in
foo = bar
bar
jest wykonywany późniejfoo
. Nawiasem mówiąc, ta wersja nie oszaleje w czasie i przestrzeni, ale wydłuża kodJeszcze innym pomysłem jest użycie,
DESTROY
które ma tę zaletę, że tylko jeden z nich zostanie wykonany. Nie zamierzam powtarzać kodu indeksującego permutację, którego już podałem dwa przykłady.Lub używając
BEGIN
:źródło
Galaretka , ∞
(Przykład z
n=3
.)Wypróbuj online!
231311 bajtów na linię.W przypadku programu z
n
liniami linie będą miały format;
<i>
ÇQŒ¿$⁼Q$?
gdzie
<i>
reprezentuje literał liczbowy,i
a każda linia ma inną wartość wi
zakresie od1
don
. (Wartości dlai
rzeczywistości nie muszą być tymi konkretnymi liczbami, muszą po prostu mieć unikalne wartości dodatnie.) Ten program nie używa jużn
w strukturze linii.W jaki sposób?
0
.;1
dołącza1
do0
lub aktywnej listy.⁼Q$
jest monadą warunkową dla instrukcji if (?
), która sprawdza, czy elementy listy są unikalne. Jeśli tak, powyższy link nazywa się (Ç
), a do listy dołączany jest inny numer. Jeśli nie są unikalne, oznacza to, że obejrzeliśmy pierwszy link. Powtarzany element jest usuwany z list (Q
) i znajduje się indeks permutacji (Œ¿
). Zauważ, że0
kiedyŒ¿
jest pobierana, na początku listy znajduje się, ale nie wpływa to na wynik, ponieważ wszystkie wartościi
są dodatnie.Nowa funkcja galaretki
Dzięki nowo dodanemu
Ƒ
szybkiemu możemy zredukować⁼Q$
doQƑ
, oszczędzając bajt.10 bajtów / linię (dla pojedynczych cyfr)
Wypróbuj online!
źródło
Brain-Flak , 3
Wypróbuj online!
Wcześniej opublikowałem to na czacie, ale mam nadzieję, że zamieszczając je tutaj, ludzie mogą to wykorzystać.
Wyjaśnienie
Zaczynamy od programu podstawowego
To samo daje 2 punkty. Aby przejść do następnego poziomu, chcę dodać nową linię. Moje początkowe przypuszczenie było
To ustawia TOS na,
2
jeśli wynosi zero i nie robi nic innego. To właściwie dobry początek. Za pomocą dwóch pozostałych linii możemy uzyskać wszystkie liczby od1
do6
oprócz4
, ponieważ istnieją2
sposoby na wyjście2
:i
Aby temu zaradzić, ustawiamy również naszą linię
2
być4
. Można to zrobić za pomocąDla przejrzystości w zasadzie implementuje ona funkcję Haskell
To rozwiązuje nasz problem, ponieważ jeden z programów, który poprzednio wyświetlał dane
2
wyjściowe, teraz wyświetla wyjście4
bez zmiany innych programów.źródło
Java 7, wynik: ∞
Wypróbuj online!
Można to wydrukować od 0 do n! -1 . Dodatkowe wiersze mają następujący format (gdzie INDEKS jest liczbą od 1 do n! -1 ):
Ta metoda działa poprzez czytanie własnego źródła w celu ustalenia, że klasy zamówień są w nim wymienione. Niestety nie było fajniejszej metody, którą mogłem znaleźć, analizując skompilowany plik lub tworząc niestandardowy ClassLoader dzięki temu, jak Java kompiluje JIT. Przypuszczam, że mógłbym kazać każdej dodatkowej klasie wydrukować statycznie określoną liczbę, ale wydawało się to bardziej zabawne. To również sprawiłoby, żebym mógł usunąć
B
interfejs, ale ocena nie jest oparta na bajtach, więc zostawię to dla zabawy.Jak to działa (wysoki poziom):
Czyta swój własny kod źródłowy wiersz po wierszu. Ponieważ każda linia deklaruje nową klasę, używamy refleksji, aby utworzyć instancję nowej klasy i wywołać jej
a
metodę, którą musi mieć, ponieważ implementujeB
interfejs.źródło
Ruby , wynik: ∞
Wypróbuj online!
Ten program ma 61 bajtów na linię (dla n <10). Ma ten sam podstawowy format, co rozwiązanie dylnana ; pierwsza liczba w każdym wierszu będzie miała inną wartość między
1
in
, a druga liczba w każdym wierszu będzien
.Miałem nadzieję znaleźć sposób na uniknięcie włączenia
n
do programu, ale nie mogłem go znaleźć.źródło
Brain-Flak , 2 (z
-d
)Wypróbuj online!
źródło
2
można użyć({}())
i(({}){})
.05AB1E , wynik: 1114112
Wypróbuj online! 0-indeksowane. ˆ na początku każdej linii wypycha różne znaki do globalnej tablicy. Reszta kodu jest bezużytecznie wykonywana, z wyjątkiem ostatniego wiersza, w którym konkatenuje wartości w łańcuch, a następnie znajduje swój indeks permutacji. 1114112 to liczba możliwych znaków Unicode w momencie pisania (oczywiście punkty kodowe 48-57 są najłatwiejsze do wykazania).
źródło