Baue diese Pyramide


21

Deine Pyramide

Die Pyramide, die Sie bauen sollen, besteht ausschließlich aus Würfeln. Es hat 24 Schichten, und die N- te Schicht von oben enthält N 2 Würfel, die in einem Quadrat von N mal N angeordnet sind. Die Pyramide sieht so aus:

Die Pyramide

Um die Pyramide zu bauen, benötigen Sie einen Vorrat an Würfeln. Sie erhalten 4900 Würfel, die in einem Quadrat von 70 mal 70 so angeordnet sind:

Das Quadrat

(Okay, ich gebe zu, dass das Bild des Platzes völlig unnötig ist.)

Da 1 2 + 2 2 + 3 2 + ... + 24 2 = 70 2 , haben Sie genau die richtige Anzahl von Würfeln, um die Pyramide zu bauen. Alles, was Sie tun müssen, ist mir zu sagen, wohin jeder Würfel gehen soll.

Deine Aufgabe

Sie sollten eine beliebige Bijektion zwischen den Würfeln im Quadrat und den Würfeln in der Pyramide auswählen. (Es wäre schön, wenn Ihre Antwort sagen würde, welche der 4900! Verschiedenen Bijektionen Sie verwenden.)

Schreiben Sie dann eine Funktion oder ein Programm, das Folgendes ausführt:

  • Angesichts der Position eines Würfels im Quadrat 70 x 70 (als Koordinatenpaar (X,Y))
  • Geben Sie die Position in der Pyramide aus (als Dreifachkoordinaten (A,B,C)).

Die Eingabe- und Ausgabekoordinaten können alle entweder 0-indiziert oder 1-indiziert sein. Angenommen, Ihre Eingabe (X,Y)ist ein Paar von ganzen Zahlen zwischen 1 und 70. Ihre Ausgabe (A,B,C)ist ein Dreifach von ganzen Zahlen. Asollte die Schicht sein, die von oben gezählt wird (zwischen 1 und 24) und (B,C)sollte die Koordinaten dieses Würfels innerhalb dieser Schicht sein (zwischen 1 und A).

Beispielsweise:

  • Der oberste Würfel der Pyramide hat Koordinaten (1,1,1).
  • Die vier Ecken der Basis der Pyramide haben Koordinaten (24,1,1), (24,1,24), (24,24,1)und (24,24,24).
  • Wenn Sie die Ecken des Quadrats an den Ecken der Pyramide platzieren möchten, können (70,1)Sie bei der Eingabe die Ausgabe angeben (24,24,1).

Sie können davon ausgehen, dass Sie nur gültige Koordinaten (X,Y)als Eingabe erhalten. Die Korrektheit wird vollständig durch die folgende Regel bestimmt: Zwei verschiedene gültige Eingaben sollten immer zwei verschiedene gültige Eingaben ergeben.

Das ist : Der kürzeste Code gewinnt.

Antworten:


7

Jelly , 15 bis 14 Bytes

24p;€$€Ẏ
ḅ70ị¢

Probieren Sie es online!

Das ist ziemlich einfach: Wir konstruieren die Liste der Koordinaten von Würfeln innerhalb der Pyramide als eine tatsächliche Liste. Dann müssen wir nur die Eingabekoordinaten innerhalb des Quadrats in einen Index innerhalb der Liste bijektieren, was über die Basiskonvertierung trivial ist.

Diese Übermittlung funktioniert entweder als vollständiges Programm (die Koordinaten werden [x, y]über das erste Befehlszeilenargument übernommen und auf der Standardausgabe ausgegeben) oder als implizit benannte Funktion 2Ŀ.

Erläuterung

Liste erstellen

Wir beginnen mit der Zahl 24, die als Bereich von 1 bis einschließlich 24 interpretiert wird (weil wir versuchen, sie als Liste zu verwenden). Dann wiederholen wir es; das ist es, was der Letzte im Programm macht. Für jedes Element n der Liste:

  • Wir konstruieren die Liste der Paare x , y, wobei jedes Element von 1 .. n stammt ; pKonstruiert eine Liste von Paaren mit zwei Mengen von Elementen. Da hier ( n ) nur ein Wert verfügbar ist , wird dieser implizit für beide Mengen verwendet. Beide werden daher zu einer Liste von 1 .. n .
  • Wir hängen an jedes Element der Liste ( ) n an (dies ist wiederum der einzige verfügbare Wert ;€).
  • Damit die zweite Operation beide Operationen auf jedes n anwendet (dh eine Schleife mit zwei Befehlen erstellt), werden $die beiden Befehle zu einer zusammengefasst.

Zum Schluss reduzieren wir die Liste um eine Stufe, um eine Liste zu erhalten, die einfach alle Koordinaten in der richtigen Reihenfolge enthält. Es beginnt so:

[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],…

und endet mit [24, 24, 24].

Indizierung der Liste

Wir beginnen mit der Konvertierung der Eingabekoordinaten in eine Zahl, indem wir sie als Ganzzahl zur Basis 70 interpretieren: ḅ70. Dies gibt uns einen Wert im Bereich von 71 bis einschließlich 4970; alle diese werte sind eindeutig mod 4900. indiziert die liste modulo die länge der liste, [1, 1]gibt uns also das 71. element, [1, 2]das 72. element, bis zu [70, 70]dem gibt uns das 70. element (dh das element vor der antwort auf [1, 1]). Schließlich müssen wir nur noch ¢angeben, welche Liste indiziert werden soll (in diesem Fall ist es die Liste, die in der vorherigen Zeile angegeben ist; ¢führen Sie die vorherige Zeile ohne Argumente aus).



6

PHP, 75 82 78 Bytes

0-indiziert :

setze P = X * 70 + Y und reduziere P um A 2, während du zur richtigen Ebene gehst. A-1; P / A; P% A - erledigt.

(Umgekehrt: während A auf die richtige Ebene erhöht wird: P = P + A 2, dann 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;

Laufen mit php -nr '<code>' <X> <Y>; druckt A_B_C.

1-indiziert, 82 Bytes :

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

1
Sollten Sie P nicht stattdessen auf X * 70 + Y setzen?
Mischa Lawrow

4

Python, 80 73 72 Bytes

Erste Einreichung, sei nicht zu hart q:

0-indiziert

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

Erstellt eine Liste der Länge 4900 mit allen Pyramind-Koordinaten und gibt für jede Eingabe einen anderen Listeneintrag zurück.

Probieren Sie es online!


Willkommen auf der Seite und schönen ersten Beitrag! Es gibt viele Python-Golfer, die bereit sind, Ihre Lösung hier unten zu testen, und ich hoffe, Sie genießen PPCG!
Caird Coinheringaahing

Sie könnten verkürzen , a**2um a*aein Byte zu speichern.
Luke

Wow, das ist einfach. Vielen Dank.
PattuX


3

C 89 , 87 , 82 71 Bytes

Nahm die Python-Lösung von xnor und entfernte den Zeilenumbruch

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-indiziert

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-indiziert

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);}

Ich denke, es sollte z / y + 1 in der 1-indizierten Version sein.
Titus

@ Titus Ich verstehe nicht warum, es entspricht der Frage von OP wie sie ist
PrincePolka

2

Batch, 103 Bytes

@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-indiziert. Arbeitet sich durch jede Ebene ab der Spitze.


2

J, 37 Bytes

-4 Bytes dank FrownyFrog

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

Ziemlich einfache Übersetzung der Jelly-Methode in J. Verwendet die Indexierung 0. Das oberste Pyramidenquadrat ist das erste. Die untere rechte Ecke der Basis ist die letzte.

Der größte Teil des Codes ist Boilerplate, um die dreifach indizierte Liste als Konstante zu erzeugen. Das Finden des richtigen Elements in dieser Liste basierend auf der Eingabe von 2 Elementen ist einfach eine Frage der Übersetzung von der Basis 70 mit70&#.

Probieren Sie es online!


(#~~:&a:)->a:-.~
FrownyFrog

@FrownyFrog Danke. Wie es mir in J oft passiert, habe ich diesen Trick schon einmal benutzt und in diesem Fall vergessen. Übrigens könnte Sie diese Frage interessieren , die von diesem Problem inspiriert wurde.
Jonah

1

Schale , 13 Bytes

!foEG▲π3Π4B70

Probieren Sie es online! Indizes beginnen ab 1.

Erläuterung

Wie einige andere Antworten konstruiere ich die vollständige Liste der Pyramidenkoordinaten und indiziere sie einfach. Ich führe dazu alle Tripel auf, bei [A,B,C]denen die Zahlen zwischen 1 und 24 liegen (ausgedrückt als 4!, Um ein Byte zu speichern), und behalte diejenigen, für die 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.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.