Construye esta pirámide


21

Tu piramide

La pirámide que quiero que construyas está hecha completamente de cubos. Cuenta con 24 capas, y la N º capa de la parte superior contiene N 2 cubos dispuestos en una N por cuadrado N. La pirámide se ve así:

La pirámide

Para construir la pirámide, necesitará un suministro de cubos. Te dan 4900 cubos dispuestos en un cuadrado de 70 por 70 que se ve así:

La plaza

(Bien, admito que la imagen del cuadrado es completamente innecesaria).

Como 1 2 + 2 2 + 3 2 + ... + 24 2 = 70 2 , tienes exactamente el número correcto de cubos para construir la pirámide. Todo lo que tienes que hacer es decirme a dónde debe ir cada cubo.

Tu tarea

Debe elegir una biyección arbitraria entre los cubos en el cuadrado y los cubos en la pirámide. (¡Sería bueno que tu respuesta dijera cuál de las 4900 diferentes biyecciones que estás usando!

Luego, escriba una función o programa que haga lo siguiente:

  • Dada la ubicación de un cubo en el cuadrado 70 por 70 (como un par de coordenadas (X,Y)),
  • Salida de su ubicación en la pirámide (como un triple de coordenadas (A,B,C)).

Las coordenadas de entrada y salida pueden estar indexadas a 0 o indexadas a 1. Suponiendo que 1 indexado, su entrada (X,Y)será un par de enteros entre 1 y 70. Su salida (A,B,C)será un triple de enteros; Adebe ser la capa que cuenta desde la parte superior (entre 1 y 24) y (B,C)debe ser las coordenadas de ese cubo dentro de esa capa (entre 1 y A).

Por ejemplo:

  • El cubo superior de la pirámide tiene coordenadas (1,1,1).
  • Las cuatro esquinas de la base de la pirámide tienen coordenadas (24,1,1), (24,1,24), (24,24,1), y (24,24,24).
  • Si decide colocar las esquinas del cuadrado en las esquinas de la pirámide, en la entrada (70,1)puede dar la salida (24,24,1).

Puede suponer que solo se le darán coordenadas válidas (X,Y)como entrada. La corrección está completamente determinada por la siguiente regla: dos entradas válidas diferentes siempre deben dar dos entradas válidas diferentes.

Este es el : el código más corto gana.

Respuestas:


7

Jalea , 15 14 bytes

24p;€$€Ẏ
ḅ70ị¢

Pruébalo en línea!

Esto es bastante simple: construimos la lista de coordenadas de cubos dentro de la pirámide como una lista real. Entonces, todo lo que tenemos que hacer es biject las coordenadas de entrada dentro del cuadrado en un índice dentro de la lista, que es trivial hacer mediante la conversión de base.

Este envío funciona como un programa completo (tomando las coordenadas como a [x, y]través del primer argumento de línea de comando y emitiendo en la salida estándar), o como una función, nombrada implícitamente 2Ŀ.

Explicación

Construyendo la lista

Comenzamos con el número 24, que se interpreta como un rango de 1 a 24 inclusive (porque estamos tratando de usarlo como si fuera una lista). Luego iteramos sobre él; eso es lo que hace el último en el programa. Para cada elemento n de la lista:

  • Construimos la lista de pares x , y de donde proviene cada elemento 1 .. n ; pconstruye una lista de pares dados dos conjuntos de elementos, y debido a que solo un valor está disponible aquí ( n ), se usa implícitamente para ambos conjuntos, que por lo tanto ambos se convierten en una lista de 1 .. n .
  • Agregamos n (nuevamente, el único valor que tenemos disponible) a cada elemento de la lista ( ;€).
  • Para hacer que el segundo aplique ambas operaciones a cada n (es decir, para crear un bucle que contenga dos instrucciones), usamos $para agrupar las dos instrucciones en una.

Finalmente, usamos para aplanar la lista en una etapa, para obtener una lista que simplemente contenga todas las coordenadas en orden. Comienza así:

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

y termina con [24, 24, 24].

Indexando la lista

Comenzamos convirtiendo las coordenadas de entrada en un número interpretándolas como un entero base 70: ḅ70. Esto nos da un valor en el rango de 71 a 4970 inclusive; todos estos valores son únicos mod 4900. indexa en el módulo de la lista la longitud de la lista, por [1, 1]lo que nos dará el elemento 71, [1, 2]el elemento 72, todo el camino hasta el [70, 70]que nos da el elemento 70 (es decir, el elemento antes de la respuesta para [1, 1]) Finalmente, solo necesitamos un ¢para decirnos qué lista indexar (en este caso, es la lista especificada por la línea anterior; eso es lo que ¢hace, ejecuta la línea anterior sin argumentos).



6

PHP, 75 82 78 bytes

0 indexado :

ajuste P = X * 70 + Y luego reduzca P en A 2 mientras camina hacia la capa correcta. A-1; PENSILVANIA; P% A - hecho.

(invertido: mientras se incrementa A a la capa correcta: P = P + A 2 luego 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;

Correr con php -nr '<code>' <X> <Y>; imprime A_B_C.

1 indexado, 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
¿No deberías configurar P en X * 70 + Y en su lugar?
Misha Lavrov

4

Python, 80 73 72 bytes

Primera presentación, no seas demasiado duro q:

0 indexado

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

Crea una lista de longitud 4900 con todas las coordenadas de pyramind y devuelve una entrada de lista diferente para cada entrada.

Pruébalo en línea!


¡Bienvenido al sitio y buen primer post! ¡Hay muchos golfistas de Python que estarían dispuestos a probar su solución aquí, y espero que disfruten de PPCG!
caird coinheringaahing

Se podría acortar a**2a a*aahorrar un byte.
Lucas

Wow, esa es una simple. Gracias.
PattuX


3

do 89 , 87 , 82 71 bytes

Tomó la solución Python de xnor y eliminó el salto de línea

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 indexado

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 indexado

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

Creo que debería ser z / y + 1 en la versión indexada 1.
Tito

@Titus No veo por qué, cumple con la pregunta de OP tal como está
PrincePolka

2

Lote, 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 indexado. Funciona a través de cada capa desde la parte superior.


2

J, 37 bytes

-4 bytes gracias a FrownyFrog

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

Traducción bastante sencilla del método Jelly en J. Utiliza 0 indexación. El cuadrado superior de la pirámide es el primero. La esquina inferior derecha de la base es la última.

La mayoría del código es repetitivo para producir la lista indexada triple como una constante. Encontrar el elemento correcto dentro de esa lista basado en la entrada de 2 elementos es simplemente una cuestión de traducir desde la base 70 con70&#.

Pruébalo en línea!


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

@FrownyFrog Gracias. Como me sucede a menudo en J, he usado ese truco antes y me olvidé de él en este caso. Por cierto, puede interesarle esta pregunta , que se inspiró en este problema.
Jonás

1

Casco , 13 bytes

!foEG▲π3Π4B70

Pruébalo en línea! Los índices comienzan desde 1.

Explicación

Como algunas otras respuestas, construyo la lista completa de coordenadas piramidales y simplemente la indexo. Hago esto enumerando todos los triples [A,B,C]donde los números están entre 1 y 24 (¡expresados ​​como 4! Para guardar un byte) y manteniendo aquellos para los cuales 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.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.