Побудуйте цю піраміду


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 включно; всі ці значення є унікальними 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 , переходячи до потрібного шару. А-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?
Міша Лавров

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 з усіма координатами піраміди і повертає різні записи списку для кожного введення.

Спробуйте в Інтернеті!


Ласкаво просимо на сайт і приємне перше повідомлення! Є багато гольфістів Python, які бажають спробувати пограти в гольф, і я сподіваюся, що вам сподобається PPCG!
caird coinheringaahing

Ви могли б скоротити a**2до a*aзберегти байти.
Лука

Нічого собі, це просто. Спасибі.
PattuX


3

С 89 , 87 , 82 , 71 байт

Взяв рішення Python xnor і видалив лінію лінії

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-індексованій версії.
Тит

@Titus Я не бачу чому, він відповідає питанню ОП, як це
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&#.

Досить простий переклад методу Джелі на індексацію J. Використовує 0. Площа верхньої піраміди - перша. Правий нижній кут основи - останній.

Більшість кодів є котловиною для створення потрійного індексованого списку як константи. Пошук правильного елемента в цьому списку на основі вводу двох елементів - це просто питання перекладу з бази 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.