Рисование кривой Пеано

13

Вступление

В геометрии кривая Пеано является первым примером кривой заполнения пространства, которую Джузеппе Пеано открыл в 1890 году. Кривая Пеано является сюръективной непрерывной функцией от единичного интервала до единичного квадрата, однако она не инъективна. Пеано был мотивирован более ранним результатом Георга Кантора, что эти два набора имеют одинаковую мощность. Из-за этого примера некоторые авторы используют фразу «кривая Пеано» для более общего обозначения любой кривой заполнения пространства.

Вызов

Программа принимает входные данные, которые являются целыми числами n, и выводит чертеж, представляющий nитерацию кривой Пеано, начиная со стороны 2, показанной в самой левой части этого изображения: Три итерации кривой Пеано

вход

Целое число n дающее номер итерации кривой Пеано. Дополнительно, дополнительный вклад описан в разделе бонусов.

Выход

Чертеж nитерации кривой Пеано. Рисунок может быть как рисунком ASCII, так и «настоящим» рисунком, в зависимости от того, какой из них проще или меньше всего.

правила

  • Ввод и вывод может быть дан в любом удобном формате (выберите наиболее подходящий формат для вашего языка / решения).
  • Нет необходимости обрабатывать отрицательные значения или неверный ввод
  • Либо полная программа или функция приемлемы.
  • Если возможно, укажите ссылку на среду онлайн-тестирования, чтобы другие люди могли опробовать ваш код!
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

Бонусы

Поскольку это не должно быть прогулкой в ​​парке (по крайней мере, на большинстве языков, о которых я могу думать), бонусные баллы начисляются за следующее:

  • -100 байт, если ваш код генерирует GIF построения кривых Пеано до n.
  • -100 байт, если ваш код рисует кривую заполнения пространства для любой прямоугольной формы (очевидно, кривая Пеано работает только для квадратов). Можно предположить, что тогда входные данные принимают форму, n l wгде nимеет то же значение, что и раньше (номер итерации), но где lи wстановится длиной и шириной прямоугольника, в котором нужно нарисовать кривую. Если l == w, это становится правильной кривой Пеано.

Отрицательные оценки допускаются (но возможны ли они ...).

редактировать

Пожалуйста, включите вывод вашей программы в решение для n == 3 (l == w == 1).

Peiffap
источник
1
Добро пожаловать в PPCG :) Это, на первый взгляд, выглядит как хороший первый вызов. Хотя это кажется знакомым, я думаю, что проблема, о которой я мог думать, была искусством ASCII. Тем не менее, обратите внимание, что мы настоятельно не поощряем бонусы и что будут языки игры в гольф, которые могут достичь этого менее чем в 100 байтах. Также, и самое главное, вам нужен критерий выигрыша. Принимая во внимание, что ваши бонусы вычитают байты из оценки решения, я подозреваю, что вы предполагаете, что это будет code-golf .
лохматый
4
Да, я не думаю, что бонусы - это хорошая идея, тем более что по крайней мере две анимации с поддержкой ASCII-арт сосредоточены golflangs
ASCII-только
2
О, также, что будет nиспользоваться, если lи wявляются также входами ??????????? И будет ли кривая Пеано особым случаем - это не единственная кривая заполнения, поэтому некоторым алгоритмам, возможно, придется специально ее использовать
только для ASCII
2
Кроме того, что мешает кому-либо сделать тривиальную кривую заполнения пространства (просто зигзагообразно взад и вперед) для неквадратных размеров
только ASCII
7
Бонусы в кодовом гольфе - это одна из самых согласованных вещей, которую следует избегать при написании задач. Я предлагаю вам удалить их и решить, какая из них является канонической версией проблемы.
lirtosiast

Ответы:

6

Mathematica, оценка 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его по всем размерам. Обратите внимание, что OP предположил, что это достаточно отличается от DavidC, чтобы оправдать свой собственный ответ. Результат для n = 3, l = w = 1 выглядит следующим образом:

LegionMammal978
источник
очень хорошо! (с правильной ориентацией тоже)
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

Пример вывода

Пеано-GFA

Arnauld
источник
10

Perl 6 , 117 байт

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

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

0 индексированные. Возвращает двумерный массив символов Юникода. Основная идея заключается в том, что для нижних строк выражение

(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 '│'
nwellnhof
источник
6

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

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

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

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

|'yэто синтаксис, специфичный для ngn / k. другие диалекты требуют, :чтобы сделать монадический глагол:|:'y

СПП
источник
1
Чтобы сделать вывод более красивым, выделите все случаи (если они поддерживаются вашим браузером)
user202729
3
@ user202729 готово - в нижнем колонтитуле, чтобы оно не влияло на количество байтов
нгн
5

Вольфрам Язык 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]

последовательность

DavidC
источник
Graphics[Reverse/@#&/@PeanoCurve@#]&
alephalpha
Это немного похоже на мошенничество, когда есть функция, которая сама рассчитывает кривую Пеано, но я приму это как принятый ответ, поскольку, тем не менее, это довольно впечатляет;). @ LegionMammal978 Я думаю, что вы заслуживаете того, чтобы опубликовать свой собственный ответ. Я бы сказал, что он достаточно отличается, чтобы оправдать принятие его как победного ответа.
Peiffap
4

BBC BASIC, 142 символа ASCII (токены 130 байтов)

Скачать переводчик можно по адресу http://www.bbcbasic.co.uk/bbcwin/download.html.

I.m:q=FNh(m,8,8,0)END
DEFFNh(n,x,y,i)
IFn F.i=0TO8q=FNh(n-1,x-i MOD3MOD2*2*x,y-i DIV3MOD2*2*y,i)DRAWBY(1AND36/2^i)*x,y*(12653/3^i MOD3-1)N.
=0

введите описание изображения здесь

Уровень реки St
источник
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)

Arnauld
источник
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

Порт @ Arnauld's Atari BASIC ответ. Чтобы использовать, сделайте что-то вроде этого :

reset
f 3
Нил
источник
3

Stax , 19 байт

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

Запустите и отладьте его

Выход за 3:

███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
█                                 █ █                
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
                █ █                                 █
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
рекурсивный
источник