建立这座金字塔


21

你的金字塔

我要您建造的金字塔完全由立方体组成。它有24层,从顶部开始的 N 层包含以N×N正方形排列的N 2个立方体。金字塔看起来像这样:

金字塔

要建造金字塔,您将需要大量的多维数据集。您将得到4900个立方体,它们以70 x 70的正方形排列,如下所示:

广场

(好的,我承认正方形的图片完全没有必要。)

由于1 2 + 2 2 + 3 2 + ... + 24 2 = 70 2,因此您拥有正确数量的立方体来构建金字塔。您所要做的就是告诉我每个多维数据集应该放在哪里。

你的任务

您应该在正方形的立方体和金字塔的立方体之间选择任意双射。(如果您的回答说出您使用的是哪种4900,那就太好了。)

然后,编写执行以下操作的函数或程序:

  • 给定一个立方体在70 x 70平方中的位置(作为一对坐标(X,Y)),
  • 输出其在金字塔中的位置(作为三坐标(A,B,C))。

输入和输出坐标都可以是0索引或1索引。假设索引为1,则您的输入(X,Y)将是一对1到70之间(A,B,C)的整数。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)作为输入。正确性完全由以下规则决定:两个不同的有效输入应始终给出两个不同的有效输出。

这是:最短的代码获胜。

Answers:


7

果冻15 14字节

24p;€$€Ẏ
ḅ70ị¢

在线尝试!

这非常简单:我们将金字塔内的多维数据集的坐标列表构造为实际列表。然后,我们需要做的就是将正方形内的输入坐标平分到列表中的索引中,这通过基数转换很简单。

该提交可以作为完整程序([x, y]通过第一个命令行参数获取坐标并在标准输出上输出)或作为隐式命名的函数2Ŀ

说明

构造清单

我们从数字开始,该数字24被解释为1到24之间的范围(包括1和24)(因为我们试图像使用列表一样使用它)。然后我们遍历它;那就是程序中的最后一个。对于列表中的每个元素n

  • 我们构造了xy对的列表,其中每个元素都来自1 .. 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为底的整数:ḅ70,将其转换为数字。这样我们得到的值在71到4970之间(含)。所有这些值都是唯一的mod4900。以列表的长度为模,对列表进行索引,因此[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吗?
Misha Lavrov

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]

创建一个具有所有pyramind坐标的长度为4900的列表,并为每个输入返回一个不同的列表条目。

在线尝试!


欢迎来到该网站,并发表第一篇好文章!有很多Python高尔夫球手愿意在这里打高尔夫球,希望您喜欢PPCG!
caird coinheringaahing

您可以缩短a**2a*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。
泰特斯

@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个字节

-4字节归功于FrownyFrog

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

将Jelly方法转换为J相当简单。使用0索引。顶部的金字塔广场是第一个。底座的右下角是最后一个。

大部分代码都是样板代码,可将三索引列表生成为常量。根据2元素输入在该列表中找到正确的元素只是从base 70转换为70&#.

在线尝试!


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

@FrownyFrog谢谢。正如我在J语言中经常发生的那样,在这种情况下,我曾经使用过这种技巧,却忘了它。顺便说一句,您可能对此问题感兴趣,该问题是受此问题启发的。
约拿(Jonah)

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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.