Codegolf - Визуализируйте Теорему Никомаха

  • Автор темы MisterM
  • Обновлено
  • 22, Oct 2024
  • #1

Теорема Никомаха связывает квадрат суммы с суммой кубов:

codegolf - Визуализируйте теорему Никомаха

и имеет красивую геометрическую визуализацию:

codegolf - Визуализируйте теорему Никомаха

Задача: создать 2-ю часть этой визуализации в ascii.

Вам необходимо убедиться, что все визуальные разграничения поддерживаются вашей диаграммой. Проще всего это сделать с четырьмя «цветами», хотя можно добиться и только с тремя (см. последний пример ниже). При наличии четырех цветов вы используете два, чтобы различать области внутри «полосы» (т. е. разные части, составляющие один куб), и два, чтобы различать соседние полосы. Если хотите, вы также можете использовать более четырех цветов. Если что-то из этого сбивает с толку, приведенный ниже пример должен прояснить ситуацию.

Ввод/вывод

Входные данные — одно целое число больше 0. Выходные данные — это сетка ascii, аналогичная приведенным ниже примерам, соответствующая сплющенной сетке для этого входного числа на изображении выше. Ведущие и конечные пробелы в порядке.

Это кодекс гольфа со стандартными правилами.

Примеры результатов

Н = 1

 
 
 
 
 
 #oo+++oooo
o##+++oooo
o##+++####
+++ooo####
+++ooo####
+++ooo####
oo####++++
oo####++++
oo####++++
oo####++++
 

Н = 2

#oo+++oooo+++++ o@@+++oooo+++++ o@@+++@@@@+++++ +++###@@@@+++++ +++###@@@@+++++ +++###@@@@##### oo@@@@oooo##### oo@@@@oooo##### oo@@@@oooo##### oo@@@@oooo##### +++++#####+++++ +++++#####+++++ +++++#####+++++ +++++#####+++++ +++++#####+++++

Н = 3

#oo+++oooo o@@+++oooo o@@+++@@@@ +++###@@@@ +++###@@@@ +++###@@@@ oo@@@@oooo oo@@@@oooo oo@@@@oooo oo@@@@oooo

Н = 4

#oo+++ o@@+++ o@@+++ +++### +++### +++###

Н = 5

#oo o@@ o@@

Трехцветная версия для N = 4, спасибо @BruceForte:

#

#код-гольф #ascii-art

MisterM


Рег
02 Jun, 2007

Тем
71

Постов
193

Баллов
568
  • 26, Oct 2024
  • #2

МАТЛ, 30 28 27 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 n=input()
R,J=range,''.join;r=[]
for i in R(n+1):

S=sum(R(i));c='AxBo'[i%2::2]

for j in R(S):r[~j]+=c[j/i%2]*i

r+=[J(c[-j/i%2]for j in R(S+i,0,-1))]*i
for l in r:print J(l)
 

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

Бонусные возможности:

  • Для 26 байт, следующая модифицированная версия создает графический вывод:

    function(n){l=w=sum(1:n) m=matrix(,l,l) for(i in n:1){m[l:1,l:1]=outer(x<-(1:l-1)%/%i,x,`+`)+i l=l-i} write(m%%4,"",w,,"")}

    Попробуйте это в МАТЛ Онлайн!

  • Изображение просит немного цвет, и он занимает всего 7 байт:

    c(x,y,n) = c(x-n,y-n,n-1) if x >= n and y >= n = (x div n + y div n + n) mod 3 otherwise

    Попробуйте это в МАТЛ Онлайн!

  • Или используйте более длинную версию (37 байт), чтобы увидеть, как устроена матрица символов. постепенно строился:

    000111 000111 000111 111220 111220 111001

    Попробуйте это в МАТЛ Онлайн!

Примеры результатов

Для ввода f(n,m,i,x,y,k){for(m=n*-~n/2,i=m*m;i--;printf("\n%d"+!!(~i%m),(x/k+y/k+k)%3))for(x=i%m,y=i/m,k=n;x>=k&y>=k;x-=k--)y-=k;} , the following shows the basic version, graphical output, and colour graphical output.

Объяснение

Общая процедура

Числовая матрица строится от внешнего слоя к внутреннему. l steps, where F⮌…·¹N«≔÷×ι⁺¹ι²θF⁺¹÷鲫F§#+@⁺ικ«UO⁻θ×ικθλUOθ⁻θ×ικλ F « Loop over …·¹ Inclusive range from 1 to N Input as a number ⮌ Reversed ι⁺¹ Add 1 to current index × ι Multiply by current index ÷ ² Divide by 2 ≔ θ Assign to q F « Loop over Implicit range from 0 to ÷ι² Half the current index ⁺¹ Plus 1 F « Loop over #+@ Literal string § Circularly indexed by ⁺ικ Sum of outer and inner index ×ικ Multiply outer and inner index ⁻θ Subtract from q UO θλ Draw an oblong (q-ik, q) using that character UOθ⁻θ×ικλ Draw an oblong (q, q-ik) using that character это вход. Каждый шаг перезаписывает внутреннюю (верхнюю левую) часть предыдущей матрицы. В конце цифры в полученной матрице заменяются символами.

Пример

Для ввода F⮌…·¹N«≔⊘×ι⊕ιθF⊕⊘ι«F§#+@⁺ικ«UO⁻θ×ικθλUOθ⁻θ×ικλ the first matrix is

g=lambda y:y>1and[l+y*f(y,i)for i,l in enumerate(g(y-1))]+y*[''.join(f(y,i)for i in range(y*-~y/2))]or['#'] f=lambda y,i:'0@+#'[(y*~-y/2%y+i)/y%2+y%2*2]

На втором этапе матрица

t % Implicitly input N. Duplicate. The first copy of N serves as the % initial state of the "accumulated" matrix (size 1×1). This will be % extended to size N*(N+1)/2 × N*(N+1)/2 in the first iteration :P % Range and flip: generates vector [N, N-1, ..., 1] " % For each k in that vector @: % Push vector [1, 2, ..., k] s % Sum of this vector. This gives 1+2+···+k = k*(k+1)/2 : % Range: gives vector [1, 2, ..., k*(k+1)/2] @/ % Divide each entry by k Xk % Round up &+ % Add vector to itself transposed, element-wise with broadcast. Gives % a square matrix of size k*(k+1)/2 × k*(k+1)/2 @+ % Add k to each entry of the this matrix. This is the flipped % intermediate matrix 8M % Push vector [1, 2, ..., k*(k+1)/2] again Pt % Flip and duplicate. The two resulting, equal vectors are the row and % column indices where the generated matrix will be written. Note that % flipping the indices has the same effect as flipping the matrix % horizontally and vertically (but it's shorter) &( % Write the (flipped) intermediate matrix into the upper-left % corner of the accumulated matrix, as given by the two (flipped) % index vectors ] % End 30+ % Add 30 to each entry of the final accumulated matrix c % Convert to char. Implicitly display

перезаписывается в верхнюю половину последнего. Затем то же самое делается с

k=N

и, наконец, с

6 6 6 6 7 7 7 7 8 8 6 6 6 6 7 7 7 7 8 8 6 6 6 6 7 7 7 7 8 8 6 6 6 6 7 7 7 7 8 8 7 7 7 7 8 8 8 8 9 9 7 7 7 7 8 8 8 8 9 9 7 7 7 7 8 8 8 8 9 9 7 7 7 7 8 8 8 8 9 9 8 8 8 8 9 9 9 9 10 10 8 8 8 8 9 9 9 9 10 10

Результирующая матрица

k=4

Наконец, k is added to each entry and the resulting numbers are interpreted as codepoints and converted to characters (thus starting at 1 1 1 2 2 2 , соответствующий k ).

Построение промежуточных матриц

Для ввода k=3 , consider decreasing values of 1 1 1 1 2 2 2 2 3 3 от k к k=4 . Для каждого k , a vector of integers from k*(k+1) to 1 is generated, and then each entry is divided by k и округлил в большую сторону. В качестве примера для 1 this gives (all blocks have size N кроме последнего):

k

тогда как для N the result would be (all blocks have size ! ):

33

Этот вектор добавляется поэлементно с помощью трансляции к своей транспонированной копии; а потом 30 is added to each entry. For 3 5 5 6 6 6 8 8 8 8 5 4 4 6 6 6 8 8 8 8 5 4 4 6 6 6 7 7 7 7 6 6 6 5 5 5 7 7 7 7 6 6 6 5 5 5 7 7 7 7 6 6 6 5 5 5 7 7 7 7 8 8 7 7 7 7 6 6 6 6 8 8 7 7 7 7 6 6 6 6 8 8 7 7 7 7 6 6 6 6 8 8 7 7 7 7 6 6 6 6 это дает

3

Это одна из промежуточных матриц, показанных выше, за исключением того, что она перевернута по горизонтали и вертикали. Итак, все, что остается, это перевернуть эту матрицу и записать ее в верхний левый угол «накопленной» матрицы, инициализируя ее первой пустой матрицей ( 6 5 5 5 4 4 5 4 4 ) step.

Код

7 7 7 6 6 6 7 7 7 6 6 6 7 7 7 6 6 6 6 6 6 5 5 5 6 6 6 5 5 5 6 6 6 5 5 5 ||answer||

Питон 2, 187 178 164 162 152 байт

-8 байт благодаря Mr.Xcoder
-1 байт благодаря Стивену
-10 байт благодаря Джонатану Фречу

10 10 9 9 9 9 8 8 8 8 10 10 9 9 9 9 8 8 8 8 9 9 8 8 8 8 7 7 7 7 9 9 8 8 8 8 7 7 7 7 9 9 8 8 8 8 7 7 7 7 9 9 8 8 8 8 7 7 7 7 8 8 7 7 7 7 6 6 6 6 8 8 7 7 7 7 6 6 6 6 8 8 7 7 7 7 6 6 6 6 8 8 7 7 7 7 6 6 6 6

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

 

Sem1


Рег
06 Jul, 2006

Тем
70

Постов
238

Баллов
608
  • 26, Oct 2024
  • #3

Древесный уголь, 50 46 байт

4

Попробуйте онлайн! Ссылка на подробную версию кода. Предыдущая 50-байтовая версия с пояснением: Попробуйте онлайн!

N

Примечание. Я перебираю символ, а не пытаюсь назначить его непосредственно N because you can't directly assign the result of indexing a string to a variable as it's an ambiguous construct in Charcoal. Fortunately the byte count is the same.

 

Olzpzag


Рег
28 Oct, 2015

Тем
104

Постов
219

Баллов
759
  • 26, Oct 2024
  • #4

С (ГКК), 135 128 120 байт

8

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

Использует всего три цвета.

Концептуально, работает на сетке, повернутой на 180 градусов:

t:P"@:s:@/Xk&+@+8MPt&(t30+cD9&Xx]30+c

И вычисляет цвета по формуле:

t:P"@:s:@/Xk&+@+8MPt&(]1YG59Y02ZG ||answer||

Р, 131 126 123 байт

Сэкономлено 3 байта благодаря @Giuseppe

t:P"@:s:@/Xk&+@+8MPt&(]1YG

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

Здесь используется тот же алгоритм, что и у @LuisMendo. MATL-ответ. Единственное отличие состоит в том, что вместо преобразования в символы матрица выводится со всеми значениями mod4, чтобы гарантировать, что каждый элемент представляет собой один символ ascii.

 

Nopp2554


Рег
07 Feb, 2011

Тем
72

Постов
179

Баллов
559
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно