이 피라미드를 건설


21

당신의 피라미드

내가 만들고 싶은 피라미드는 전적으로 큐브로 만들어졌습니다. 여기에는 24 개의 레이어 가 있으며 상단 의 N 번째 레이어에는 N x N 정사각형으로 배열 된 N 2 큐브 가 있습니다 . 피라미드는 다음과 같습니다.

피라미드

피라미드를 만들려면 큐브가 필요합니다. 다음과 같은 70 x 70 정사각형으로 배열 된 4900 개의 큐브가 제공됩니다.

광장

(좋아, 나는 사각형의 그림이 완전히 불필요하다는 것을 인정한다.)

1 2 + 2 2 + 3 2 + ... + 24 2 = 70 2 이므로 피라미드를 만들기에 올바른 수의 큐브가 있습니다. 각 큐브가 어디로 가야하는지 알려 주기만하면됩니다.

당신의 작업

정사각형의 큐브와 피라미드의 큐브 사이에서 임의의 제거를 선택해야합니다. (당신의 대답이 당신이 사용하는 4900! 다른 bijections 중 어느 것이라고 말하면 좋을 것입니다.)

그런 다음 다음을 수행하는 함수 또는 프로그램을 작성하십시오.

  • (좌표 값의 쌍으로 70 제곱하여 70 큐브의 위치 감안 (X,Y))
  • 피라미드에서의 위치를 ​​세 번의 좌표로 출력합니다 (A,B,C).

입력 및 출력 좌표는 모두 0 인덱싱되거나 1 인덱싱 될 수 있습니다. 1- 색인으로 가정하면 입력 (X,Y)은 1과 70 사이의 정수 쌍이 (A,B,C)됩니다. 출력 은 3 배의 정수가됩니다. A위에서부터 계산하는 레이어 여야하고 (1과 24 사이) (B,C)해당 레이어 내에서 해당 큐브의 좌표 (1과 사이) 여야합니다 A.

예를 들면 다음과 같습니다.

  • 피라미드의 상단 큐브에는 좌표가 (1,1,1)있습니다.
  • 피라미드의 바닥의 네 모서리가 좌표 (24,1,1), (24,1,24), (24,24,1),와 (24,24,24).
  • 피라미드의 모서리에 사각형의 모서리를 배치하기로 결정하면 입력시 (70,1)출력을 줄 수 있습니다 (24,24,1).

(X,Y)입력으로 유효한 좌표 만 제공한다고 가정 할 수 있습니다 . 정확성은 전적으로 다음 규칙에 의해 결정됩니다. 두 개의 다른 유효한 입력은 항상 두 개의 다른 유효한 입력을 제공해야합니다.

이것은 : 가장 짧은 코드가 승리합니다.

답변:


7

젤리 , 15 14 바이트

24p;€$€Ẏ
ḅ70ị¢

온라인으로 사용해보십시오!

이것은 매우 간단합니다. 피라미드 내의 큐브 좌표 목록을 실제 목록으로 구성합니다. 그런 다음 사각형 내에서 입력 좌표를 목록 내 인덱스에 넣는 것만으로도 기본 변환을 통해 수행하기가 쉽지 않습니다.

이 제출은 전체 프로그램 ( [x, y]첫 번째 명령 행 인수 를 통해 좌표를 가져 오고 표준 출력으로 출력) 또는 내재적으로 이름이 지정된 함수로 작동 2Ŀ합니다.

설명

리스트 구성

우리는 number로 시작합니다 24. 이것은 1에서 24까지의 범위로 해석됩니다 (목록처럼 사용하려고하기 때문에). 그런 다음 반복합니다. 그것이 프로그램 에서 마지막 으로하는 일입니다. 목록의 각 요소 n 에 대해 :

  • 각 요소가 1에서 오는 x , y 쌍의 목록을 구성합니다 . n ; p는 두 개의 요소 집합이 주어진 쌍의 목록을 구성하며 여기에서 하나의 값만 사용할 수 있기 때문에 ( n ) 두 집합 모두에 대해 암시 적으로 사용되므로 둘 다 1의 목록이됩니다. n .
  • 우리는 추가 N (다시, 우리가 사용할 수있는 유일한 값)리스트의 각 요소에 ( ;€).
  • 두 번째로 두 연산을 각각의 n에 적용 하기 위해 (즉, 두 개의 명령어를 포함하는 루프를 만들기 위해) $두 명령어를 하나로 그룹화하는 데 사용 합니다.

마지막으로, 모든 좌표를 순서대로 포함하는 목록을 얻기 위해 목록을 한 단계 씩 평탄화하는 데 사용 합니다. 다음과 같이 시작됩니다.

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

[24, 24, 24]로 끝납니다.

리스트 인덱싱

입력 좌표를 기본 70 정수 (integer70)로 해석하여 입력 좌표를 숫자로 변환합니다. 이는 71에서 4970 사이의 값을 제공합니다. 이 모든 값은 고유 한 mod 4900 입니다.리스트의 길이를리스트 모듈로 색인합니다. 따라서 [1, 1]71 번째 요소, [1, 2]72 번째 요소, [70, 70]70 번째 요소 (예 : [1, 1]). 마지막으로 ¢색인을 생성 할 목록을 알려 주기만 하면 됩니다 (이 경우 이전 줄에서 지정한 목록입니다. 즉 ¢, 인수없이 이전 줄을 실행합니다).



6

PHP, 75 82 78 바이트

0 인덱스 :

P = X * 70 + Y로 설정 한 다음 올바른 레이어로 내려 가면서 P를 A 2 만큼 줄 입니다. A-1; 아빠; P % A-완료

(역전 : A를 올바른 레이어로 증가시키면서 : P = P + A 2 , 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;

로 실행 php -nr '<code>' <X> <Y>; A_B_C를 인쇄합니다.

1- 인덱스, 82 바이트 :

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

1
대신 P를 X * 70 + Y로 설정하면 안됩니까?
Misha Lavrov

4

파이썬, 80 73 72 바이트

첫 제출, 너무 가혹하지 마십시오 q :

0 인덱스

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

모든 피라미드 좌표를 사용하여 길이가 4900 인 목록을 만들고 각 입력에 대해 다른 목록 항목을 반환합니다.

온라인으로 사용해보십시오!


사이트와 멋진 첫 게시물에 오신 것을 환영합니다! 여러분의 솔루션을 여기에 기꺼이 시도해 보려는 파이썬 골퍼들이 많이 있습니다. PPCG를 즐기시기 바랍니다!
caird coinheringaahing

당신은 단축 할 수 a**2하는 a*a바이트를 저장합니다.
Luke

와, 간단합니다. 감사.
PattuX


3

기음 89 , 87 , 82 , 71 바이트

xnor의 Python 솔루션을 사용하여 줄 바꿈을 제거했습니다.

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 인덱스

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- 색인

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

1 인덱스 버전에서는 z / y + 1이어야한다고 생각합니다.
Titus

@Titus 이유를 모르겠습니다. OP의 질문을 그대로 준수합니다.
PrincePolka

2

배치, 103 바이트

@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입니다. 위에서부터 각 레이어를 통해 작동합니다.


2

J, 37 바이트

FrownyFrog 덕분에 -4 바이트

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

Jelly 메소드를 J로 매우 간단하게 변환합니다. 0 인덱싱을 사용합니다. 상단 피라미드 광장이 첫 번째입니다. 베이스의 오른쪽 하단이 마지막입니다.

코드의 대부분은 삼중 색인 목록을 상수로 생성하는 상용구입니다. 2 개의 요소 입력을 기반으로 해당 목록 내에서 올바른 요소를 찾는 것은 단순히 기본 70에서70&#.

온라인으로 사용해보십시오!


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

@FrownyFrog 감사합니다. J에서 자주 발생하는 것처럼 이전에는 그 트릭을 사용 했으며이 경우 잊어 버렸습니다. Btw, 이 질문에 관심 있을 수 있습니다. 이 질문 에서 영감을 얻었습니다.
요나

1

껍질 , 13 바이트

!foEG▲π3Π4B70

온라인으로 사용해보십시오! 지수는 1부터 시작합니다.

설명

다른 답변과 마찬가지로 피라미드 좌표의 전체 목록을 구성하고 간단히 색인으로 만듭니다. 나는 [A,B,C]숫자가 1에서 24 사이에있는 모든 트리플을 나열하고 (바이트를 절약하기 위해 4!로 표현됨) 및를 유지 하여이 작업을 수행합니다 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.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.