Постройте эту пирамиду


21

Твоя пирамида

Пирамида, которую я хочу, чтобы ты построил, целиком состоит из кубов. Он имеет 24 слоя, а N- й слой сверху содержит N 2 кубов, расположенных в квадрате N на N. Пирамида выглядит так:

Пирамида

Чтобы построить пирамиду, вам понадобится запас кубиков. Вам дают 4900 кубов, расположенных в квадрате 70 на 70, который выглядит следующим образом:

Квадрат

(Хорошо, я признаю, что изображение квадрата совершенно не нужно.)

Так как 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должен быть слой, считающий сверху (между 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Ŀ.

объяснение

Построение списка

Мы начнем с числа 24, которое интерпретируется как диапазон от 1 до 24 включительно (потому что мы пытаемся использовать его как список). Затем мы перебираем это; это то, что делает последний в программе. Для каждого элемента n списка:

  • Построим список пар x , y, где каждый элемент происходит от 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 включительно; все эти значения являются уникальными модулями 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 , спускаясь до нужного слоя. А-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!
Caird Coneheringaahing

Вы могли бы сократить a**2до a*aсохранить байты.
Лука

Вау, это просто. Спасибо.
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);}

Я думаю, что это должно быть z / y + 1 в 1-индексированной версии.
Тит

@ Титус Я не понимаю, почему, он отвечает на вопрос ОП как есть
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 элементов - это просто вопрос перевода с базы 70 с70&#.

Попробуйте онлайн!


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

@FrownyFrog Спасибо. Как часто случается со мной в J, я использовал этот трюк раньше и забыл об этом в этом случае. Кстати, вас может заинтересовать этот вопрос , который был вдохновлен этой проблемой.
Иона

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.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.