Малювання кривої Пеано


13

Вступ

В геометрії крива Пеано є першим прикладом кривої заповнення простором, яку відкрив Джузеппе Пеано в 1890 році. Крива Пеано - сюрєктивна, безперервна функція від одиничного інтервалу до одиничної площі, однак вона не є ін’єктивною. Пеано був мотивований більш раннім результатом Георга Кантора, що ці два набори мають однакову кардинальність. Через цей приклад деякі автори використовують словосполучення "Крива Пеано" для позначення більш загальної кривої заповнення простору.

Виклик

Програма приймає введення, яке є цілим числом n, і виводить малюнок, що представляє nітерацію кривої Пеано, починаючи з боку 2, показаної в крайній лівій частині цього зображення: Три ітерації кривої Пеано

Вхідні дані

Ціле число, що nдає ітераційне число кривої Пеано. Необов'язково, додатковий вклад описано в розділі бонусів.

Вихідні дані

Креслення nкривої Пеано. Малюнок може бути як мистецтвом ASCII, так і «справжнім» малюнком, залежно від того, що є найпростішим або найкоротшим.

Правила

  • Введення та вихід можуть бути надані у будь-якому зручному форматі (виберіть найбільш відповідний формат для вашої мови / рішення).
  • Не потрібно обробляти негативні значення або недійсні дані
  • Прийнятна або повна програма, або функція.
  • Якщо можливо, додайте посилання на онлайн-тестувальне середовище, щоб інші люди могли спробувати ваш код!
  • Стандартні лазівки заборонені.
  • Це тому застосовуються всі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

Бонуси

Оскільки це не повинна бути прогулянка по парку (принаймні на більшості мов, що я можу придумати), бонусні бали присуджуються за наступне:

  • -100 байт, якщо ваш код генерує gif побудови кривих Peano до n.
  • -100 байт, якщо ваш код малює криву, що заповнює простір, для будь-якої прямокутної форми (очевидно, крива Peano працює лише для квадратів). Можна припустити, що тоді вхід набуває форми, n l wде nмає те саме значення, що і раніше (номер ітерації), але де lі wстають довжина і ширина прямокутника, в якому намалювати криву. Якщо l == wце стає звичайною кривою Пеано.

Негативні бали дозволені (але чи можливі вони ...).

Редагувати

Будь ласка, включіть у програму вихідну програму n == 3 (l == w == 1).


1
Ласкаво просимо до PPCG :) Це, на перший погляд, схоже на перший приємний виклик. Хоча це здається знайомим, я думаю, що проблема, про яку я можу подумати, була мистецтвом ASCII. Зауважте, що ми рішуче відмовляємо від бонусів і що існують мови для гри в гольф, які зможуть досягти цього менш ніж у 100 байт. Також, і найголовніше, що вам потрібен критерій виграшу. Зважаючи на те, що ваші бонуси віднімають байти від оцінки рішення, я підозрюю, що ви маєте намір це кодовий гольф .
Кудлатий

4
Так, я не думаю , що бонуси є хорошою ідеєю, тим більше , що принаймні дві анімації з підтримкою ASCII-арт зосереджені golflangs
ASCII-тільки

2
О, для чого б це nбуло використано, якщо lі wє також вхідними даними ??????????? І буде крива Пеано бути особливий випадок - це не тільки spacefilling крива, тому деякі алгоритми , можливо , доведеться specialcase це
ASCII-тільки

2
Крім того, що нікого не заважає робити тривіальну криву заповнення простору (просто зигзагу вперед і назад) для неквадратичних розмірів
лише для ASCII

7
Бонуси в гольф-коді - одна з найбільш узгоджених речей, яких слід уникати, коли пишеш завдання. Я пропоную вам зняти їх і вирішити, що має бути канонічною версією виклику.
lirtosiast

Відповіді:


6

Математика, оцінка 60 - 100 - 100 = -140

Graphics[PeanoCurve@a~Reverse~3~Scale~#2]~Animate~{a,1,#,1}&

Чиста функція. Приймає nта {l, w}(ширину та висоту) як вхід, і дає анімаційну графіку як вихід. Спочатку створюється крива Пеано n- го порядку PeanoCurve. Оскільки у випадку l = w все ще потрібно створити криву Пеано, ми перевернемо вираз на рівні 3, подібний до відповіді DavidC ; для lw ми просто Scaleкриву до прямокутника. Ця крива все ще буде заповнювати простір, задовольняючи другий бонус. Для першого бонусу ми просто Animateйого над усіма розмірами. Зауважимо, що ОП припустив, що це досить відрізняється від DavidC, щоб гарантувати власну відповідь. Результат при n = 3, l = w = 1 таке:


дуже хороша! (з правильною орієнтацією теж)
DavidC

13

GFA Basic 3,51 (Atari ST), 156 134 124 байт

Вручну відредагований список у форматі .LST Всі рядки закінчуються CR, включаючи останній.

PRO f(n)
DR "MA0,199"
p(n,90)
RET
PRO p(n,a)
I n
n=n-.5
DR "RT",a
p(n,-a)
DR "FD4"
p(n,a)
DR "FD4"
p(n,-a)
DR "LT",a
EN
RET

Розширено та прокоментовано

PROCEDURE f(n)      ! main procedure, taking the number 'n' of iterations
  DRAW "MA0,199"    !   move the pen to absolute position (0, 199)
  p(n,90)           !   initial call to 'p' with 'a' = +90
RETURN              ! end of procedure
PROCEDURE p(n,a)    ! recursive procedure taking 'n' and the angle 'a'
  IF n              !   if 'n' is not equal to 0:
    n=n-0.5         !     subtract 0.5 from 'n'
    DRAW "RT",a     !     right turn of 'a' degrees
    p(n,-a)         !     recursive call with '-a'
    DRAW "FD4"      !     move the pen 4 pixels forward
    p(n,a)          !     recursive call with 'a'
    DRAW "FD4"      !     move the pen 4 pixels forward
    p(n,-a)         !     recursive call with '-a'
    DRAW "LT",a     !     left turn of 'a' degrees
  ENDIF             !   end
RETURN              ! end of procedure

Приклад виведення

піано-гфа


10

Perl 6 , 117 байт

{map ->\y{|map {(((++$+y)%2+$++)%3**(y+$^v,*/3...*%3)??$^s[$++%2]!!'│')xx$_*3},<┌ ┐>,$_,<└ ┘>,1},^$_}o*R**3

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

0-індексований. Повертає двовимірний масив символів Unicode. Основна ідея полягає в тому, що для нижніх рядків вираз

(x + (x+y)%2) % (3 ** trailing_zeros_in_base3(3*(y+1)))

дає малюнок

|....||....||....||....||..  % 3
..||....||....||....||....|  % 3
|................||........  % 9
..||....||....||....||....|  % 3
|....||....||....||....||..  % 3
........||................|  % 9
|....||....||....||....||..  % 3
..||....||....||....||....|  % 3
|..........................  % 27

Для верхніх рядків вираз є

(x + (x+y+1)%2) % (3 ** trailing_zeros_in_base3(3*(y+3**n)))

Пояснення

{ ... }o*R**3  # Feed $_ = 3^n into block

map ->\y{ ... },^$_  # Map y = 0..3^n-1

|map { ... },<┌ ┐>,$_,<└ ┘>,1  # Map pairs (('┌','┐'),3^n) for upper rows
                               # and (('└','┘'),1) for lower rows.
                               # Block takes items as s and v

( ... )xx$_*3  # Evaluate 3^(n+1) times, returning a list

 (++$+y)%2  # (x+y+1)%2 for upper rows, (x+y)%2 for lower rows
(         +$++)  # Add x
                   (y+$^v,*/3...*%3)  # Count trailing zeros of 3*(y+v) in base 3
                3**  # nth power of 3
               %  # Modulo
??$^s[$++%2]  # If there's a remainder yield chars in s alternately
!!'│'         # otherwise yield '│'

6

К (нг / к) , 37 27 26 байт

{+y,(|'y:x,,~>+x),x}/1,&2*

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

повертає булева матриця

|'yє синтаксисом, характерним для ngn / k. інші діалекти вимагають, :щоб скласти кожне дієслово монадією:|:'y


1
Щоб зробити результат більш красивим, виділіть усі випадки (якщо він підтримується вашим браузером)
user202729

3
@ user202729 зроблено - у нижньому колонтитулі, щоб це не вплинуло на кількість байтів
ngn

5

Мова Wolfram 83 36 байт, (можливо, -48 байт з бонусом)

Станом на версію 11.1, PeanoCurveце вбудований.

Моє оригінальне незграбне подання витрачало багато байтів на GeometricTransformationтаReflectionTransform.

Цей значно скорочений варіант був запропонований алефалфа . Reverseпотрібно було правильно орієнтувати вихід.

Graphics[Reverse/@#&/@PeanoCurve@#]&

Приклад 36 байт

Graphics[Reverse/@#&/@PeanoCurve@#]&[3]

Крива піано


Бонус

Якщо це відповідає бонусу 100 пт, він важить в 52 - 100 = -48 Код [5]не враховувався, лише чиста функція.

Table[Graphics[Reverse/@#&/@PeanoCurve@#]&@k{k,#}&[5]

послідовність


Graphics[Reverse/@#&/@PeanoCurve@#]&
алефальфа

Дуже схоже на обман, щоб мати функцію, яка сама обчислює криву Пеано, але я прийму це як прийнятий відповідь, оскільки все-таки це досить вражає;). @ LegionMammal978 Я думаю, що ти заслуговуєш на публікацію власної відповіді, я стверджую, що це достатньо інакше, щоб гарантувати прийняття її як виграшної відповіді.
Peiffap


4

HTML + SVG + JS, 224 213 байт

Вихід відображається горизонтально.

n=>document.write(`<svg width=${w=3**n*9} height=${w}><path d="M1 ${(p=(n,z)=>n--&&(p(n,-z,a(a(p(n,-z,d+=z)),p(n,z))),d-=z))(n*2,r=d=x=y=1,a=_=>r+=`L${x+=~-(d&=3)%2*9} ${y+=(2-d)%2*9}`)&&r}"fill=#fff stroke=red>`)

Спробуйте в Інтернеті! (друкує HTML)


3

Логотип, 89 байт

to p:n:a
if:n>0[rt:a
p:n-1 0-:a
fw 5
p:n-1:a
fw 5
p:n-1 0-:a
lt:a]end
to f:n
p:n*2 90
end

Відповідь Atari BASIC Порта @ Арнаульда. Для використання, зробити що - щось на зразок цього :

reset
f 3

3

Стакс , 19 байт

∩▐j>♣←╙~◘∩╗╢\a╘─Ràô

Запустіть і налагоджуйте його

Вихід для 3:

███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
█                                 █ █                
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
                █ █                                 █
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.