Zbuduj tę piramidę

21

Twoja piramida

Piramida, którą chcę zbudować, jest zbudowana w całości z kostek. Ma 24 warstwy, a N- ta warstwa od góry zawiera N 2 kostki ułożone w kwadracie N na N. Piramida wygląda następująco:

Piramida

Aby zbudować piramidę, potrzebujesz zapasów kostek. Otrzymujesz 4900 kostek ułożonych w kwadrat 70 na 70, który wygląda następująco:

Plac

(Dobra, przyznaję, że obraz kwadratu jest zupełnie niepotrzebny).

Ponieważ 1 2 + 2 2 + 3 2 + ... + 24 2 = 70 2 , masz dokładnie odpowiednią liczbę kostek, aby zbudować piramidę. Wszystko, co musisz zrobić, to powiedzieć mi, gdzie powinna iść każda kostka.

Twoje zadanie

Powinieneś wybrać dowolny biject pomiędzy sześcianami na kwadracie a sześcianami w piramidzie. (Byłoby miło, gdybyś w swojej odpowiedzi powiedział, którego z 4900! Różnych bijectów używasz.)

Następnie napisz funkcję lub program, który wykonuje następujące czynności:

  • Biorąc pod uwagę położenie sześcianu w kwadracie 70 na 70 (jako para współrzędnych (X,Y)),
  • Umieść swoje położenie w piramidzie (jako potrójny układ współrzędnych (A,B,C)).

Współrzędne wejściowe i wyjściowe mogą być indeksowane 0 lub indeksowane 1. Zakładając, że 1-indeksowany, twoja wartość wejściowa (X,Y)będzie parą liczb całkowitych od 1 do 70. Twój wynik (A,B,C)będzie potrójną liczbą całkowitą; Apowinna być warstwą liczącą od góry (od 1 do 24) i (B,C)powinna być współrzędnymi tego sześcianu w tej warstwie (od 1 do A).

Na przykład:

  • górny sześcian piramidy ma współrzędne (1,1,1).
  • Cztery narożniki podstawy piramidy mają współrzędne (24,1,1), (24,1,24), (24,24,1), i (24,24,24).
  • Jeśli zdecydujesz się umieścić rogi kwadratu w rogach piramidy, wtedy na wejściu (70,1)możesz podać wynik (24,24,1).

Możesz założyć, że (X,Y)jako dane wejściowe otrzymasz prawidłowe współrzędne . Prawidłowość jest całkowicie determinowana przez następującą zasadę: dwa różne ważne dane wejściowe powinny zawsze dawać dwa różne ważne dane wejściowe.

To jest : wygrywa najkrótszy kod.

Misza Ławrow
źródło

Odpowiedzi:

7

Galaretka , 15 14 bajtów

24p;€$€Ẏ
ḅ70ị¢

Wypróbuj online!

Jest to dość proste: konstruujemy listę współrzędnych sześcianów w piramidzie jako rzeczywistą listę. Następnie wystarczy przesunąć współrzędne wejściowe z kwadratu na indeks na liście, co jest trywialne poprzez konwersję bazy.

To przesłanie działa albo jako pełny program (przyjmując współrzędne jak [x, y]za pomocą pierwszego argumentu wiersza poleceń i wypisując na standardowe wyjście), albo jako funkcja, domyślnie nazwana 2Ŀ.

Wyjaśnienie

Konstruowanie listy

Zaczynamy od liczby 24, która jest interpretowana jako zakres od 1 do 24 włącznie (ponieważ próbujemy użyć jej tak, jakby to była lista). Następnie iterujemy nad tym; to właśnie robi ostatni w programie. Dla każdego elementu n listy:

  • Konstruujemy listę par x , y, z których każdy element pochodzi od 1 .. n ; pkonstruuje listę par z dwoma zestawami elementów, a ponieważ tutaj dostępna jest tylko jedna wartość ( n ), jest ona domyślnie używana dla obu zbiorów, które w związku z tym stają się listą od 1 .. n .
  • Do każdego elementu listy ( ) dodajemy n (ponownie jedyną dostępną wartością ;€).
  • Aby drugie zastosować obie te operacje do każdego n (tj. Aby utworzyć pętlę zawierającą dwie instrukcje), używamy $do grupowania dwóch instrukcji w jedną.

Na koniec używamy do spłaszczenia listy o jeden etap, aby uzyskać listę, która po prostu zawiera wszystkie współrzędne w kolejności. Zaczyna się tak:

[1, 1, 1], [1, 1, 2], [1, 2, 2], [2, 1, 2], [2, 2, 2], [1, 1, 3], [1 , 2, 3], [1, 3, 3], [2, 1, 3], [2, 2, 3], [2, 3, 3], [3, 1, 3], [3, 2 , 3], [3, 3, 3], [1, 1, 4], [1, 2, 4], [1, 3, 4], [1, 4, 4], [2, 1, 4 ], [2, 2, 4], [2, 3, 4], [2, 4, 4], [3, 1, 4], [3, 2, 4], [3, 3, 4], [3, 4, 4], [4, 1, 4], [4, 2, 4], [4, 3, 4], [4, 4, 4],…

i kończy się na [24, 24, 24].

Indeksowanie listy

Zaczynamy od konwersji współrzędnych wejściowych na liczbę, interpretując je jako liczbę całkowitą podstawową 70: ḅ70. To daje nam wartość z zakresu od 71 do 4970 włącznie; wszystkie te wartości są unikalne mod 4900. indeksuje do listy modulo długość listy, więc [1, 1]da nam 71. element, [1, 2]72. element, aż do [70, 70]70. elementu (tj. element przed odpowiedzią na [1, 1]). Na koniec potrzebujemy tylko ¢powiedzieć nam, którą listę do zindeksowania (w tym przypadku jest to lista określona przez poprzednią linię; tak się ¢dzieje, uruchom poprzednią linię bez argumentów).

Cairney Coheringaahing
źródło
14 bajtów
caird coinheringaahing
6

PHP, 75 82 78 bajtów

0-indeksowane :

zbioru P = X + Y * 70 następnie zmniejszyć przez A P 2 idąc w dół do odpowiedniej warstwy. A-1; ROCZNIE; P% A - gotowe.

(odwrócony: podczas zwiększania A do właściwej warstwy: P = P + A 2, a następnie P = P + A * B + C -> X = P / 70, Y = P% 70)

for($p=$argv[1]*70+$argv[2];$p>=++$a**2;$p-=$a**2);echo$a-1,_,$p/$a|0,_,$p%$a;

Uruchom z php -nr '<code>' <X> <Y>; drukuje A_B_C.

1 indeksowany, 82 bajty :

for($p=$argv[1]*70+$argv[2]-71;$p>++$a**2;$p-=$a**2);echo$a,_,$p/$a+1|0,_,$p%$a+1;
Tytus
źródło
1
Czy zamiast tego nie powinieneś ustawić P na X * 70 + Y?
Misza Ławrow
4

Python, 80 73 72 bajty

Pierwsze zgłoszenie, nie bądź zbyt surowy q:

0-indeksowane

lambda x,y:[(a-1,b//a,b%a)for a in range(25)for b in range(a*a)][70*x+y]

Tworzy listę długości 4900 ze wszystkimi współrzędnymi piramidy i zwraca inną pozycję listy dla każdego wejścia.

Wypróbuj online!

PattuX
źródło
Witamy na stronie i fajny pierwszy post! Jest tu wielu golfistów Python, którzy zechcą spróbować zagrać w golfa w tym miejscu i mam nadzieję, że spodoba ci się PPCG!
caird coinheringaahing
Można skrócić a**2do a*azapisania bajt.
Łukasz
Wow, to proste. Dzięki.
PattuX,
3

Python 2 , 64 bajty

x,y=input()
n=-70*x-y
i=1
while n<0:i+=1;n+=i*i
print~-i,n/i,n%i

Wypróbuj online!

xnor
źródło
To zadziałało również dla C, dzięki
PrincePolka
3

do 89 , 87 , 82 , 71 bajtów

Wziąłem rozwiązanie Xnor w języku Python i usunąłem łamanie wiersza

p(x,y){for(x=-70*y-x,y=1;x<0;x+=++y*y);printf("%d %d %d",~-y,x/y,x%y);}

0-indeksowane

z;p(x,y){for(x+=y*70+1,y=z=0;z<x;z+=++y*y);z-=x;printf("%d %d %d\n",y-1,z/y,z%y);}

1-indeksowany

z;p(x,y){for(x+=~-y*70,y=z=1;z<x;z+=++y*y);z-=x-y;printf("%d %d %d\n",y,z/y,z%y+1);}
PrincePolka
źródło
Myślę, że powinno to być z / y + 1 w wersji z indeksowaniem 1.
Tytus
@Titus Nie rozumiem dlaczego, jest zgodny z pytaniem OP, jak jest
PrincePolka
2

Partia, 103 bajty

@set/an=%1*70+%2,i=0
:l
@set/an-=i*i,j=i,i+=1,k=n%%i,l=n/i
@if %l% geq %i% goto l
@echo %j% %k% %l%

0-indeksowane. Działa przez każdą warstwę, zaczynając od góry.

Neil
źródło
2

J, 37 bajtów

-4 bajty dzięki FrownyFrog

(a:-.~,(<:,&.>{@;~&i.)"0 i.25){~70&#.

Dość proste tłumaczenie metody Jelly na J. Wykorzystuje indeksowanie 0. Najwyższy kwadrat piramidy jest pierwszy. Dolny prawy róg podstawy jest ostatnim.

Większość kodu to podstawa do utworzenia potrójnie indeksowanej listy jako stałej. Znalezienie odpowiedniego elementu na tej liście na podstawie danych wejściowych z 2 elementów jest po prostu kwestią tłumaczenia z bazy 70 za pomocą70&#.

Wypróbuj online!

Jonasz
źródło
(#~~:&a:)->a:-.~
FrownyFrog,
@FrownyFrog Dzięki. Jak często zdarza mi się w J, wcześniej użyłem tej sztuczki i w tym przypadku o niej zapomniałem. Przy okazji, możesz być zainteresowany tym pytaniem , które zostało zainspirowane tym problemem.
Jonasz
1

Łuska , 13 bajtów

!foEG▲π3Π4B70

Wypróbuj online! Indeksy zaczynają się od 1.

Wyjaśnienie

Podobnie jak niektóre inne odpowiedzi, tworzę pełną listę współrzędnych piramidy i po prostu indeksuję. Robię to, wymieniając wszystkie tróje, w [A,B,C]których liczby wynoszą od 1 do 24 (wyrażone jako 4 !, aby zachować bajt) i zachowując te, dla których A >= max(B,C).

!foEG▲π3Π4B70  Implicit input: a list of two numbers.
          B70  Interpret in base 70.
!              Modular index into the following list:
        Π4      Factorial of 4: 24
      π3        Take range and 3-fold Cartesian power: [[1,1,1],[1,1,2],..,[24,24,24]]
 f              Filter by
  oE            all values are equal
    G▲          in cumulative reduce by maximum.
Zgarb
źródło