Napisz program, podając dane wejściowe n , wygeneruje wszystkie możliwe n-krotki przy użyciu liczb naturalnych.
n=1
(1),(2),(3),(4),(5),(6)...
n=2
(1,1),(1,2),(2,1),(2,2),(1,3),(3,1),(2,3),(3,2),(3,3)...
n=6
(1,1,1,1,1,1) (1,1,1,1,2,1) (1,1,1,2,1,1)...
- Dane wyjściowe mogą być w dowolnej kolejności, która nie łamie żadnych innych reguł.
- Program musi być napisany, aby działał wiecznie i teoretycznie wypisał wszystkie odpowiednie krotki dokładnie raz.
- W rzeczywistości Twój program osiągnie limit typu liczby całkowitej i zawiesi się. Jest to dopuszczalne, o ile program działałby nieskończenie długo, gdyby tylko liczba całkowita była nieograniczona.
- Każda poprawna krotka musi być wymieniona w skończonym czasie, jeśli tylko program mógł działać tak długo.
- Dane wyjściowe mogą, według twojego wyboru, zawierać zera oprócz liczb naturalnych.
- Możesz wybrać format wyjściowy programu dla swojej wygody, pod warunkiem, że separacja krotek i liczb w każdej krotce jest wyraźna i spójna. (Na przykład jedna krotka na linię.)
- Wejście (n) jest liczbą całkowitą od jednego do sześciu. Wymagane zachowanie jest niezdefiniowane dla danych wejściowych poza tym zakresem.
- Obowiązują zasady gry w golfa, wygrywa najkrótszy program.
Dzięki „Artemis Fowl” za opinie podczas fazy piaskownicy.
Odpowiedzi:
Łuska , 2 bajty
Wypróbuj online!
Wyjaśnienie
N
to nieskończona lista liczb naturalnych[1,2,3,4,..
.π
to potęga kartezjańska. Rezultatem jest nieskończona lista list. Każda lista pożądanej długości występuje dokładnie raz, ponieważπ
jest fajna. Dane wejściowe i wyjściowe są niejawne.źródło
n
- krotki są uzyskiwane przez pobranie iloczynu kartezjańskiego z oryginalnej listy i listyn-1
-tuple, w porządku rosnącym sumy indeksów.2,2,2
Przychodzi po4,1,2
i5,1,1
.N
. W przypadku 2-krotek bierzesz produkt kartezjański zN
uporządkowaną według sumy indeksów. Na obu listach każda liczban
ma indeks,n
więc dla długości 2 wynik jest uporządkowany według sumy. Aby otrzymać 3-krotki, bierzesz iloczyn kartezjańskiN
i listę 2-krotek uporządkowanych według sumy wskaźników elementów na tych listach. Nie patrzy na sumę krotki, patrzy na jej pozycję na liście krotek.Haskell , 62 bajty
Wypróbuj online!
n!s
generuje wszystkien
pary, które sumują sięs
.Zatem odpowiedź brzmi
([1..]>>=).(!)
, tj\n -> [t | s<-[1..], t<-n!s]
.Jest to funkcja mapująca liczbę całkowitą
n
na nieskończoną leniwą listę krotek (listy liczb całkowitych).źródło
Haskell , 50 bajtów
Wypróbuj online!
Listy
n
-tuki posortowane według sumy.mapM
wykonuje podnoszenie ciężarów w celu wygenerowania wszystkichn
liczb od 0 do k.<$f
Sztuką jest wyjaśnione tutaj .Haskell , 51 bajtów
Wypróbuj online!
Rekurencyjnie rozciąga wszystkie-
n-1
pary na wszystkie-n
pary, dzieląc pierwszą liczbęa
każdegon-1
-tuszy na dwie liczby,a-k,k
które sumują się na nią, w każdy możliwy sposób.źródło
Pyth - 9 bajtów
Dzięki @FryAmTheEggman za golfa
Pętle przechodzą przez wszystkie x i przyjmują [1..x] ^ n. Powoduje to tworzenie duplikatów, więc zachowuje tylko te, które są nowe w tym x, czyli w nich x. Formatowanie jest trochę dziwne, ale można je ujednolicić o jeszcze jeden bajt,
.V1j}#b^Sb
Wypróbuj online .
źródło
f}bT
->}#b
Ponadto liczba bajtów wydaje się w tej chwili niepoprawna?j(b)
. Dziękuję również za golfa.Brachylog (v2), 9 bajtów
Wypróbuj online!
Jest to nieskończony generator, który generuje wszystkie możliwe krotki. Łącze TIO ma nagłówek, który używa generatora do wygenerowania 1000 elementów i wydrukowania ich (ale generator mógłby kontynuować w nieskończoność, gdybym o to poprosił; liczby całkowite Brachylog są nieograniczone).
Wydaje się, że powinien istnieć bardziej zwięzły sposób, ale istnieje wiele ograniczeń i to jest najkrótsze, w jakim mogę je zmieścić w jednym programie.
Wyjaśnienie
Nawiasem mówiąc, wydaje mi się interesujące, jak różne są moje objaśnienia
≜
, pomimo tego, że robią dokładnie to samo z punktu widzenia Brachyloga. Pierwszy≜
to pierwszy niedeterministyczny predykat w programie, więc ustala kolejność wyników; w tym przypadku oblicza wszystkie możliwe jawne wartości dla sumy listy w kolejności 0, 1, 2, 3… i jest używany do zapewnienia, że listy są wyprowadzane w kolejności według ich sumy (zapewnia to, że każda możliwa lista pojawia się po skończonej ilości danych wyjściowych). Drugi≜
służy do obliczenia wszystkich jawnych możliwości listy (zamiast formułowania formuły określającej, w jaki sposób elementy listy odnoszą się do siebie).źródło
↰₁ẉ⊥
jest również dobrym nagłówkiem do drukowania w nieskończoność.ᶠ
lub⊥
w nagłówku.Perl 6 , 37 bajtów
Wypróbuj online!
Zasadniczo działa
polymod
z tyloma wpisami, ile potrzeba, gdzie moduł jest zawsze większy niż wejście, tj. 0. polimod (1,1,1), 1. polimod (2,2,2) itd. W ten sposób cyfra jest zawsze w zakresie Zakres. Perl6 nie pozwoli mi modulo infinity ...źródło
(0, 1, 0, 0)
nie ma jej na liście).Wolfram Language (Mathematica) , 62 bajty
Wypróbuj online!
-3 bajty z niespójną separacją (usuń
@#&
)Wypróbuj online!
źródło
C # (interaktywny kompilator Visual C #) , 148 bajtów
Wypróbuj online!
-3 bajty dzięki @ASCIIOnly!
źródło
Write
z np.'<literal tab>'
lub|
ma tę samą długość i zajmuje dużo mniej wierszy: PGalaretka , 10 (9?) Bajtów
9 jeśli możemy wyprowadzać dane przy użyciu niespójnej separacji (o którą pytałem) - usunięcie
€
.Wypróbuj online!
W jaki sposób?
źródło
€
jest wymagane, ale poczekajmy, co OP musi zrobić mówić.05AB1E ,
1511 bajtów-4 bajty, tworząc port odpowiedzi Pyth @Maltysen .
Wypróbuj online.
Wyjaśnienie:
źródło
MATL , 16 bajtów
Krotki są uporządkowane według rosnącej sumy, aw ramach danej sumy są uporządkowane leksykograficznie.
Wypróbuj online!
źródło
Python 2 ,
12611210610110083 bajtówWypróbuj online!
5 bajtów dzięki mypetlionowi ; 1 bajt z orła oka ArBo ; 17 bajtów od xnor !
Skonstruuj uporządkowane partycje
m
wn
przedziały dlam = 0,1,2,3,...
, wybierając liczby binarne za pomocąn-1
0
s im
1
s.źródło
if i==p:i=0;p*=2
możnai%=p;p<<=i<1
zapisać 5 bajtów.print b
nie jest potrzebne: Di+p
to, że po prostu zlicza 1, 2, 3 ... w zawiły sposób i może być tylko jedną zmienną.C # (.NET Core) ,
608 570567 bajtówWypróbuj online!
mój Boże, co ja zrobiłem (tyle pętli, to właśnie zrobiłem)
Powinno jednak działać!
Jeśli przesuniesz pętlę drukowania o jeden nawias, wyświetli się lista w takiej postaci, w jakiej jest budowana, za każdym razem, gdy się zapętla. (Jeśli tak, zalecam dodanie nowego wiersza lub czegoś, co pozwoli odróżnić każdą pętlę).
Szczerze mówiąc, dużo czasu spędziłem na walce z językiem ... brak ładnych tablic, różne zachowania == ...
Mam nadzieję, że ta wersja jest łatwiejsza do odczytania.
źródło
Perl 6 , 50 bajtów
Wypróbuj online!
Anonimowy blok kodu, który zwraca leniwą nieskończoną listę. Wykorzystuje tę samą strategię, co odpowiedź Chasa Browna .
Wyjaśnienie:
źródło
VDM-SL , 51 bajtów
Zrozumienie zestawu rekurencyjnego z konkatenacją sekwencji.
Nie w TIO, możesz uruchomić w programie (jeśli włączysz limity dla nat lub nie zakończy się):
Uwzględnia opcjonalne 0 w odpowiedzi, w przeciwnym razie byłoby to wiązanie 52 bajtów na nat1
źródło
Wolfram Language (Mathematica) , 131 bajtów
Wypróbuj online!
źródło
perl -M5.010 122 bajty
Dodano kilka nowych wierszy ze względu na czytelność (nie liczone w liczbie bajtów)
źródło
Python 2 , 120 bajtów
Wypróbuj online!
Trochę dłużej niż większość innych odpowiedzi, ale podobał mi się pomysł.
źródło
Stax , 6 bajtów
Uruchom i debuguj
n
Procedura wprowadzania danych jest z grubszaźródło
JavaScript (V8) , 98 bajtów
Wypróbuj online!
Brawo! W końcu mam poniżej 100 :) Zasadniczo port mojej odpowiedzi w języku C # .
źródło