Rozważ standardowy trójkąt równoboczny, z węzłami oznaczonymi za pomocą współrzędnych barycentrycznych :
Możemy przekształcić ten trójkąt z 3 węzłami w trójkąt z 6 węzłami, dodając nową linię 3 wierzchołków (o jeden więcej niż z boku oryginalnego trójkąta z 3 węzłami), usuń wszelkie wewnętrzne krawędzie (ale nie wewnętrzne węzły) i ponownie znormalizować współrzędne:
Powtarzając proces przejścia z trójkąta 6-węzłowego do trójkąta 10-węzłowego, dodaj linię 4 wierzchołków (ponownie, o jeden więcej niż na boku oryginalnego trójkąta 6-węzłowego), usuń wszelkie wewnętrzne krawędzie (ale nie wewnętrzne węzły ) i ponownie znormalizować współrzędne:
Proces ten można powtarzać w nieskończoność. Celem tego wyzwania jest liczba całkowita N
reprezentująca, ile razy ten proces został wykonany, wyprowadzenie wszystkich węzłów dla powiązanego trójkąta we współrzędnych barycentrycznych.
Wejście
Twój program / funkcja powinna przyjąć jako dane wejściowe jedną nieujemną liczbę całkowitą N
reprezentującą ile razy ten proces został zastosowany. Zauważ, że dla N=0
powinieneś wygenerować oryginalny trójkąt z 3 węzłami.
Dane wejściowe mogą pochodzić z dowolnego źródła (parametr funkcji, stdio itp.).
Wynik
Twój program / funkcja powinna wypisywać wszystkie węzły w znormalizowanych współrzędnych barocentrycznych. Kolejność węzłów nie ma znaczenia. Liczbę można określić jako ułamek (redukcja ułamka nie jest wymagana) lub liczbę zmiennoprzecinkową. Możesz również wyprowadzać „skalowane” wektory, aby określić węzeł. Na przykład wszystkie 3 z następujących danych wyjściowych są równoważne i dozwolone:
0.5,0.5,0
1/2,2/4,0
[1,1,0]/2
Jeśli używasz wyjścia zmiennoprzecinkowego, twój wynik powinien być dokładny z dokładnością do 1%. Dane wyjściowe mogą być do dowolnego pożądanego ujścia (standard, wartość zwracana, parametr powrotu itp.). Zauważ, że chociaż współrzędne barycentryczne są jednoznacznie określone tylko przez 2 liczby na węzeł, powinieneś wyprowadzić wszystkie 3 liczby na węzeł.
Przykłady
Przykładowe przypadki są sformatowane jako:
N
x0,y0,z0
x1,y1,z1
x2,y2,z2
...
gdzie pierwszy wiersz jest wejściem N
, a wszystkie kolejne wiersze tworzą węzeł, x,y,z
który powinien znajdować się na wyjściu dokładnie raz. Wszystkie liczby podano jako przybliżone liczby zmiennoprzecinkowe.
0
1,0,0
0,1,0
0,0,1
1
1,0,0
0,1,0
0,0,1
0.5,0,0.5
0.5,0.5,0
0,0.5,0.5
2
1,0,0
0,1,0
0,0,1
0.667,0,0.333
0.667,0.333,0
0.333,0,0.667
0.333,0.333,0.333
0.333,0.667,0
0,0.333,0.667
0,0.667,0.333
3
1,0,0
0.75,0,0.25
0.75,0.25,0
0.5,0,0.5
0.5,0.25,0.25
0.5,0.5,0
0.25,0,0.75
0.25,0.25,0.5
0.25,0.5,0.25
0.25,0.75,0
0,0,1
0,0.25,0.75
0,0.5,0.5
0,0.75,0.25
0,1,0
Punktacja
To jest kod golfowy; najkrótszy kod w bajtach wygrywa. Obowiązują standardowe luki. Możesz użyć dowolnych wbudowanych funkcji.
[1,2,3]/6
?Odpowiedzi:
CJam (22 bajty)
Jest to anonimowy blok (funkcja), który przyjmuje
N
stos i pozostawia tablicę tablic podwójnych na stosie. Demo onlineSekcja
źródło
Haskell, 53 bajty
źródło
Python 3, 87 bajtów
To rzeczywiście powinien być komentarz do rozwiązania TheBikingViking, ale nie mam wystarczającej reputacji do komentowania.
Można zaoszczędzić kilka bajtów, tylko iterując zmienne
i,j
i wykorzystując fakt, że z trzecim sumują sięn+1
.źródło
Mathematica,
4443 bajtyJest to funkcja bez nazwy, która przyjmuje pojedynczy argument liczby całkowitej. Dane wyjściowe to lista list dokładnych (zredukowanych) ułamków.
Generuje wszystkie 3-krotności wielokrotności od
1/(N+1)
0 do 1 włącznie, a następnie wybiera te, których suma wynosi 1 (zgodnie ze współrzędnymi barycentrycznymi).źródło
05AB1E , 10 bajtów
Wyjaśnienie
Wypróbuj online
źródło
¤
pochłania tablicę, dlaczego/
dzieli tablicę przez to? Czy „pamięta” tę ostatnią wyskakującą wartość i używa jej w razie potrzeby?¤
jest jednym z niewielu poleceń, które nie wyskakują i nie zużywają się ze stosu. Pcha ostatni element listy, pozostawiając listę na stosie.MATL , 17 bajtów
Wypróbuj online!
Wyjaśnienie
Podejście jest takie samo jak w innych odpowiedziach:
[0, 1/(n+1), 2/(n+1), ..., 1]
, gdzien
jest wejście;1
.Dokładniej:
źródło
Meduza ,
3733 bajtówDzięki Zgarbowi za oszczędność 4 bajtów.
Wypróbuj online!
Podobnie jak moje odpowiedzi Mathematica i Peter CJam, generuje zestaw krotek kandydujących, a następnie wybiera tylko te, które sumują się do 1. Nie jestem jeszcze całkowicie zadowolony z układu i zastanawiam się, czy mogę zapisać niektóre bajty za pomocą haków lub widelców, ale będę musiał to sprawdzić później.
źródło
Perl 6:
5040 bajtówZwraca sekwencję 3-elementowych list (dokładnych) liczb wymiernych.
Wyjaśnienie:
$_
Deklarowany niejawnie parametr lambda.
0, 1/($_ + 1) ... 1
Używa operatora sekwencji
...
do skonstruowania sekwencji arytmetycznej, która odpowiada możliwym wartościom współrzędnych.[X] EXPR xx 3
Pobiera kartezjański produkt trzech kopii EXPR, tj. Generuje wszystkie możliwe 3-krotki.
grep *.sum == 1, EXPR
Filtruj krotki o sumie 1.
źródło
Ruby, 62
Byłbym zaskoczony, gdyby nie można tego poprawić:
Biorąc pod uwagę porady ukryte w układance, oblicza to opcje drugiego węzła na podstawie pierwszego i trzeciego węzła, odejmując pierwsze dwa.
źródło
Brachylog , 24 bajty
Wypróbuj online!
źródło
Python 3, 106 bajtów
Funkcja pobiera dane wejściowe przez argument i wypisuje listę list liczb zmiennoprzecinkowych do STDOUT.
Python nie jest dobry w kartezjańskich produktach ...
Jak to działa
Wypróbuj na Ideone
źródło
Właściwie 15 bajtów
Wykorzystuje algorytm podobny do tego w odpowiedzi Pythona w TheBikingViking . Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!
Nie golfowany:
źródło
Ruby,
7774 bajtówInna odpowiedź wykorzystująca algorytm w pythonowej odpowiedzi TheBikingViking . Sugestie dotyczące gry w golfa mile widziane.
Kolejny 74-bajtowy algorytm oparty na odpowiedzi Ruby Charlesa .
źródło
JavaScript (Firefox 30-57),
8881 bajtówZwraca tablicę tablic liczb zmiennoprzecinkowych. Edycja: Zapisano 7 bajtów, obliczając bezpośrednio trzecią współrzędną. Próbowałem wyeliminować
if
, obliczający
bezpośrednio zasięg, ale kosztowało to dodatkowy bajt:źródło
[x/n,y/n/z/n]
, zapomniałeś przecinka?