Peano eğrisini çizme


13

Giriş

Geometride, Peano eğrisi , 1890'da Giuseppe Peano tarafından keşfedilecek bir boşluk doldurma eğrisinin ilk örneğidir. Peano eğrisi, birim aralığından birim karesine kadar nesnel, sürekli bir işlevdir, ancak bu amaç dışı değildir. Peano, Georg Cantor'un daha önceki bir sonucuyla bu iki setin aynı kardinaliteye sahip olması konusunda motive oldu. Bu örnek nedeniyle, bazı yazarlar daha genel olarak herhangi bir boşluk doldurma eğrisine atıfta bulunmak için "Peano eğrisi" ifadesini kullanırlar.

Meydan okuma

Program bir tamsayı olan bir girdi alır ve bu görüntünün en sol tarafında gösterilen yanlardan 2 başlayarak, Peano eğrisinin yinelemesini ntemsil eden bir çizim nçıkarır: Peano eğrisinin üç tekrarı

Giriş

nPeano eğrisinin yineleme sayısını veren bir tam sayı . İsteğe bağlı olarak ek giriş bonuslar bölümünde açıklanmaktadır.

Çıktı

nPeano eğrisinin yinelemesinin bir çizimi . Çizim, hangisi en kolay veya en kısasa, ASCII sanatı veya "gerçek" bir çizim olabilir.

kurallar

  • Giriş ve çıkış herhangi bir uygun formatta verilebilir (diliniz / çözümünüz için en uygun formatı seçin).
  • Negatif değerleri veya geçersiz girişi işlemeye gerek yok
  • Tam bir program veya bir işlev kabul edilebilir.
  • Mümkünse, diğer kişilerin kodunuzu deneyebilmesi için lütfen bir çevrimiçi test ortamına bağlantı ekleyin!
  • Standart boşluklar yasaktır.
  • Bu bu nedenle her zamanki golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

Bonuslar

Bu parkta bir yürüyüş olmamalı (en azından düşünebildiğim çoğu dilde), bonus puanları aşağıdakiler için verilir:

  • Kodunuz Peano eğrilerinin yapısına ait bir gif oluşturuyorsa -100 bayt n.
  • Kodunuz herhangi bir dikdörtgen şekil için boşluk doldurma eğrisi çiziyorsa -100 bayt (Peano eğrisi yalnızca kareler için geçerlidir). Girdi sonra formda alır varsayabiliriz (yineleme sayısı) önceki ile aynı anlamlara sahiptir, ancak burada ve eğri çizmek için dikdörtgenin uzunluk ve genişlik olur. Eğer , bu normal Peano eğrisi olur.n l wnlwl == w

Olumsuz puanlara izin verilir (ancak mümkün mü ...).

Düzenle

Lütfen programınızın çıktısını çözüme ekleyin n == 3 (l == w == 1).


1
PPCG'ye hoş geldiniz :) Bu, bir bakışta güzel bir ilk meydan okumaya benziyor. Tanıdık gelse de, düşünebileceğim zorluğun bir ASCII sanat sorunu olduğunu düşünüyorum. Bununla birlikte, bonusları şiddetle caydırdığımızı ve bunu 100 bayttan daha az bir sürede başarabilecek golf dilleri olacağını unutmayın. Ayrıca ve en önemlisi, kazanan bir kritere ihtiyacınız var. Bonuslarınızın bir çözümün skorundan bayt çıkardığı göz önüne alındığında, bunun kod golfü olmasını düşündüğünüzden şüpheleniyorum .
Shaggy

4
Evet, bonusların iyi bir fikir olduğunu düşünmüyorum, özellikle en az iki animasyon özellikli ASCII sanat odaklı golfçü olduğu için
ASCII-sadece

2
Ah ayrıca neğer ne için kullanılır lve waynı zamanda girdi ??????????? Ve Peano eğrisi özel bir durum olur mu - tek boşluk doldurma eğrisi değil, bu yüzden bazı algoritmalar bunu özelleştirmek zorunda kalabilir
ASCII-sadece

2
Ayrıca, herhangi birinin kare olmayan boyutlar için önemsiz bir boşluk doldurma eğrisi yapmasını (sadece ileri geri zikzak yapmasını) engelleyen şey
ASCII-sadece

7
Kod golfundaki bonuslar, zorlukları yazarken kaçınılması gereken en kabul edilen şeylerden biridir. Onları kaldırmanızı ve meydan okumanın standart sürümünün hangisi olduğuna karar vermenizi öneririm.
lirtosiast

Yanıtlar:


6

Mathematica, skor 60-100-100 = -140

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

Saf fonksiyon. Alır nve {l, w}girdi olarak (genişlik ve yükseklik), ve çıktı olarak bir animasyon grafiği vermektedir. İlk önce n ile bir Peano eğrisi oluşturur PeanoCurve. Yana L = W durumda hala Peano eğri oluşturmak için gerektiğinde, 3. seviyede ifade çevirmek, benzer DavidC cevabı ; için lw , sadece Scaledikdörtgen eğrisi. Bu eğri hala boşluğu doldurarak ikinci bonusu tatmin edecek. İlk bonus için, sadece Animatetüm boyutlarda. OP'nin bunun kendi cevabını garanti etmek için DavidC'den yeterince farklı olduğunu önerdiğini unutmayın. N = 3, l = w için sonuç = 1 aşağıdaki gibidir:


çok hoş! (uygun yönlendirmeyle de)
DavidC

13

GFA Temel 3.51 (Atari ST), 156 134 124 bayt

Manuel olarak düzenlenmiş .LST biçiminde bir liste. Son satırlar da CRdahil olmak üzere tüm satırlar biter .

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

Genişletilmiş ve yorum yaptı

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

Örnek çıktı

Peano-GFA


10

Perl 6 , 117 bayt

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

Çevrimiçi deneyin!

0 endeksli. Unicode karakterlerin 2B dizisini döndürür. Temel fikir, daha düşük satırlar için,

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

deseni verir

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

Üst satırlar için, ifade

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

açıklama

{ ... }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

K (ngn / k) , 37 27 26 bayt

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

Çevrimiçi deneyin!

bir boole matrisi döndürür

|'ysözdizimi ngn / k 'ya özgüdür. diğer lehçeler, :her bir ed-fi fiili yapmak için a gerektirir :|:'y


1
Çıktıyı daha güzel hale getirmek için, (tarayıcı tarafından destekleniyorsa) tüm oluşumlarını vurgulayın
user202729 18:18

3
@ user202729 bitti - altbilgide böylece bayt sayısını etkilemez
ngn

5

Wolfram Dili 83 36 bayt, (muhtemelen -48 bayt bonus ile)

11.1 sürümünden itibaren PeanoCurveyerleşiktir.

Orijinal, beceriksiz gönderim birçok baytı boşa harcadı GeometricTransformationveReflectionTransform.

Bu çok azaltılmış versiyon alephalpha tarafından önerildi . Reverseçıktıyı doğru yönlendirmek için gerekliydi.

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

Örnek 36 bayt

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

Peano eğrisi


Bonus

Bu 100 pt bonusu için uygunsa, 52 - 100 = -48 ağırlığındadır Kod [5]sayılmadı, sadece saf işlev.

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

sıra


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

Peano eğrisini kendi başına hesaplayan bir fonksiyona sahip olmak biraz hile gibi geliyor, ama yine de oldukça etkileyici olduğu için kabul edilen cevap olarak alacağım;). @ LegionMammal978 Sanırım kendi cevabınızı göndermeyi hak ediyorsunuz, kazanan cevap olarak kabul etmenin yeteri kadar farklı olduğunu iddia ediyorum.
Peiffap


4

HTML + SVG + JS, 224213 bayt

Çıktı yatay olarak yansıtılır.

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>`)

Çevrimiçi deneyin! (HTML'yi yazdırır)


3

Logo, 89 bayt

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'un Atari BASIC cevabının limanı. Kullanım için, böyle bir şey yapmak bu :

reset
f 3

3

Stax , 19 bayt

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

Çalıştır ve hata ayıkla

3 için çıktı:

███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
█                                 █ █                
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
                █ █                                 █
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.