このピラミッドを構築する


21

あなたのピラミッド

構築してほしいピラミッドは、すべてキューブで構成されています。これには24層があり、上からN 番目の層には、N x Nの正方形に配置されたN 2個の立方体が含まれています。ピラミッドは次のようになります。

ピラミッド

ピラミッドを構築するには、キューブの供給が必要になります。次のような70 x 70の正方形に配置された4900個のキューブが与えられます。

広場

(さて、私は正方形の絵は全く不要であることを認めます。)

1 2 + 2 2 + 3 2 + ... + 24 2 = 70 2なので、ピラミッドを構築するのに正確な数のキューブがあります。あなたがしなければならないのは、各キューブがどこに行くべきかを教えてくれます。

あなたのタスク

正方形のキューブとピラミッドのキューブの間の任意の全単射を選択する必要があります。(答えは、使用している4900!異なる全単射のどれかと言ったらいいと思います。)

次に、以下を行う関数またはプログラムを作成します。

  • 70×70の正方形内の立方体の位置を(座標のペアとして(X,Y))指定すると、
  • ピラミッド内の位置を出力します(座標のトリプルとして (A,B,C))。

入力および出力座標はすべて、0インデックスまたは1インデックスのいずれかです。インデックスが1であると仮定すると、入力(X,Y)は1〜70の整数のペアになります。出力(A,B,C)は整数のトリプルになります。Aは、上から数え(B,C)たレイヤー(1〜24)であり、そのレイヤー内のそのキューブの座標(1〜24 )でなければなりませんA

例えば:

  • ピラミッドの一番上の立方体には座標があり(1,1,1)ます。
  • ピラミッドの基部の四隅には、座標を有する(24,1,1)(24,1,24)(24,24,1)、および(24,24,24)
  • 四角の角をピラミッドの角に配置する(70,1)ことにした場合、入力時に出力が得られます(24,24,1)

有効な座標のみが与えられると仮定することができます (X,Y)入力として。正確性は、次のルールによって完全に決定されます。2つの異なる有効な入力は、常に2つの異なる有効なスループットを提供する必要があります。

これはです:最短のコードが勝ちます。

回答:


7

ゼリー15 14バイト

24p;€$€Ẏ
ḅ70ị¢

オンラインでお試しください!

これは非常に簡単です。ピラミッド内のキューブの座標のリストを実際のリストとして作成します。次に、必要なのは、正方形内の入力座標をリスト内のインデックスにバイジェクトすることです。これは、ベース変換を介して行うのは簡単です。

この[x, y]送信は、完全なプログラム(最初のコマンドライン引数を介して座標を取得し、標準出力に出力する)として、または暗黙的に2Ŀ

説明

リストを作成する

numberから始めます24。これは、1から24までの範囲として解釈されます(リストのように使用しようとしているため)。次に、それについて繰り返します。それがプログラムの最後の処理です。リストの各要素nについて:

  • 各要素が1 .. nからなるペアxyのリストを作成します。二組の要素についてのペアのリストを構築し、唯一つの値(ここでは利用可能であるので、N)、それは暗黙的に両方は、したがって1からリストになる両方のセット、..のために使われているNp
  • リスト()の各要素にn(ここでも使用可能な唯一の値)を追加します;€
  • 2番目の操作でこれらの両方の操作を各nに適用する(つまり、2つの命令を含むループを作成する)ため$に、2つの命令を1つにグループ化します。

最後に、単純にすべての座標を順番に含むリストを取得するために、1段階でリストをフラット化するために使用します。次のように始まります。

[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整数として解釈することにより数値に変換することから始めます:ḅ70。これにより、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; 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に設定すべきではありませんか?
ミシャラヴロフ

4

Python、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のリストを作成し、入力ごとに異なるリストエントリを返します。

オンラインでお試しください!


このサイトへようこそ、最初の投稿です!この辺りであなたのソリューションをゴルフしようとするPythonゴルファーはたくさんいます。PPCGを楽しんでください。
共産主義者のケアリング

あなたは短縮できたa**2ためにa*aバイトを保存します。
ルーク

うわー、それは簡単なものです。ありがとう。
PattuX


3

C 898782 、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である必要があります。
タイタス

@タイタス理由はわかりませんが、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でよくあることですが、私は以前にそのトリックを使用し、この場合はそれを忘れていました。ところで、この問題に触発されたこの質問に興味があるかもしれません。
ジョナ

1

、13バイト

!foEG▲π3Π4B70

オンラインでお試しください! インデックスは1から始まります。

説明

他のいくつかの答えと同様に、私はピラミッド座標の完全なリストを構築し、単純にそれにインデックスを付けます。これを行うに[A,B,C]は、数字が1から24(バイトを節約するために4!と表現される)の間のすべてのトリプルをリストし、whichを保持し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.