ASCII Dondurma


15

Pozitif bir tamsayı N alan ve üst yarısı (' lardan yapılmış bir yarım daire olan ve alt yarısı V' 'dan yapılmış bir aşağı dönük üçgen olan bir N × N ASCII sanat dizesi basan veya döndüren bir program veya işlev yazın . dolgu olarak kullanılan alanlar.

Başka bir deyişle, bir ASCII dondurma konisi yapın: (N = 17 için çıktı)

      (((((      
    (((((((((    
  (((((((((((((  
  (((((((((((((  
 ((((((((((((((( 
 ((((((((((((((( 
(((((((((((((((((
(((((((((((((((((
VVVVVVVVVVVVVVVVV
 VVVVVVVVVVVVVVV 
  VVVVVVVVVVVVV  
   VVVVVVVVVVV   
    VVVVVVVVV    
     VVVVVVV     
      VVVVV      
       VVV       
        V        

Örnekler

İşte N = 1 ila 5 için çıkışlar. Tek N için üçgenin her zaman daha büyük yarım olması gerektiğini unutmayın.

V

((
VV

(((
VVV
 V 

 (( 
((((
VVVV
 VV 

 ((( 
(((((
VVVVV
 VVV 
  V  

İşte bir N = 101 hamuru.

Ve işte püfsüz bir Python 3 referans uygulaması:

N = int(input())
ic = [[' '] * N for _ in range(N)]
for y in range(N//2):
    for x in range(N):
        if (x - (N - 1) / 2)**2 + (y - (N - 1) / 2)**2 < (N / 2)**2:
            ic[y][x] = '('
for y in range(N//2, N):
    for x in range(y - N//2, N - (y - N//2)):
        ic[y][x] = 'V'
for line in ic:
    print(''.join(line))

ayrıntılar

  • Stdin, komut satırı veya işlev bağımsız değişkeni olarak girdi alın. Çıkış stdout veya benzeri bir işleve ya da bir işlev yazarsanız dizeyi döndürebilirsiniz.
  • Koni kısmı, tüm N için referans uygulamasına tam olarak uymalıdır.
  • Dondurma bölümü yok değil tam o kadar uzun ki N'ye (nedeniyle roundoff hatalara yarım dairenin hafif farklılıklar hakkında endişe zorunda kalmamak için budur için yarım daire şeklinde açıkça olduğunca referans uygulamasını eşleşmesi gerekir .)
  • Gereksiz ön boşluklar olmamalıdır, ancak gereksiz sondaki boşluklar olabilir.
  • Çıktı isteğe bağlı olarak sondaki bir yeni satır içerebilir.
  • İstediğniz 3 diğer farklı kullanabilir yazdırılabilir ASCII yerine karakterler (, Vve uzayda.

puanlama

Bayt cinsinden en kısa gönderim kazanır. Tiebreaker en eski gönderime gider.


6
Başlığı okurken "IceCII ASCream" düşünen tek kişi ben miyim?
Sp3000

15
@ Sp3000 Jeez, umarım öyle ...
Calvin'in Hobileri

Yanıtlar:


7

CJam, 46 bayt

Çevrimiçi deneyin.

{:Z{Z{Z(2./:R-zYR<):P#YR-zP#+Z2./P#>SP?}/N}fY}

Bunun şu anda, bu cevabı üretmeye başladığımda gerekli olan orijinal spesifikasyonu tam olarak taklit ettiğine inanıyorum. Matematiği orijinal spesifikasyona göre daha az doğru yaparak birkaç bayt kaydetme potansiyeli olabilir, ancak bir veya iki bayttan daha fazlasını kaydetmenin bir yolunu görene kadar olduğu gibi bırakacağım.

açıklama

{               "Begin block";
  :Z{             "For each y from 0 to input-1";
    Z{              "For each x from 0 to input-1";
      Z(2./:R         "Calculate the radius as (input-1)/2.0";
      -z              "Calculate the horizontal distance from the center";
      YR<):P          "Calculate the power to raise distances to: (y<radius)+1
                       (This results in Euclidean distance being calculated for
                        the ice cream and Manhattan distance being calculated
                        for the cone)";
      #               "Raise the horizontal distance to the determined power";
      YR-zP#          "Calculate the vertical distance from the center and
                       raise it to the determined power";
      +               "Add the horizontal and vertical distances";
      Z2./P#          "Calculate the solid distance threshold and raise it to
                       the determined power";
      >SP?            "If the solid threshold is exceeded, produce a space;
                       otherwise, produce the determined power digit
                       (This results in ice cream being represented by the
                        digit '2' and the cone by the digit '1')";
    }/              "End x loop";
    N               "Produce a new line";
  }fY             "End y loop";
}               "End block";

Görünüşe göre 2's ve 1' yerine ('s ve V' s kullanılıyor mu?
Mark Reed

@MarkReed Buna izin verilir. Ayrıntılar bölümündeki son satır.
Jakube

3

Ca2 129 123 121 111 107

Bu çoğunlukla python örneğindeki formülleri kullanır, ancak çift döngü yerine jot noktaları ve iotas kullanır. iFonksiyon gerçekleştirir için dairesel test jbaşlatır fonksiyonu zerre-nokta bunun üzerine. Ve kişlev , işlev için üçgen testi gerçekleştirir l. cİşlevinin sonuçlarını katenatları jve lN x N için yeniden şekillendirir.

düzenlemek: -6 birleştirmek 2 haritalar 1 içine.
düzenlemek: -2 kaldırmak yararsız ravels.
düzenlemek: nicer typescript.
edit: -10 dizi-bilge tekrarlanan ifade uygulayın.
edit: bir fonksiyon olarak -4 faktör dışarı tekrarlanan ifade.
edit: satır satır yorum.

q:y-(n-1)%2
i:[((n%2)^2)>+/(qx y)^2
j:(~[y%2)i.(~y)
k:2*[x>[|qy
l:(@1+~]y%2)k.(~y)
c:y y#((jn<y),ly){' (V' 

Daha ayrıntılı olarak, giriş noktası, cörtük olarak adlandırılmış bir bağımsız değişkeni alan işlevdir y.

c:y y#((jn<y),ly){' (V' 
         n<y            } assign y to 'n'
        jn<y            } call j(y)
              ly        } call l(y)
      ((    ),  )       } catenate the results
      (         ){' (V' } map 0 1 2 to ' ' '(' 'V'
  y y#                  } reshape to NxN

jİşlevi ile aynı giriş değerini alır yparametresi.

j:(~[y%2)i.(~y)
     y%2         } y divided by 2
    [            } floor
   ~             } iota. this generates the row indices 0..y/2
            ~y   } iota y. this generates the column indices 0..y
  (     )i.(  )  } jot-dot with the function i

Buradaki nokta-nokta çift döngüyü yapar. iİşlevi, sol ve sağ dizilerden (0..n / 2 ve 0..n) her eleman kombinasyonuyla çağırır . Yani ifonksiyonu olarak aldığı y tablonun indeksi ve o kadar aldığı x indeksi. İsimler burada biraz geriye döndü :).xy

i:[((n%2)^2)>+/(qx y)^2
     n%2                 } n divided by 2
    (n%2)^2              } squared
                 x y     } make a 2-element array (x,y)
                qx y     } call q on this array

nerede qyapar

q:y-(n-1)%2
     n-1    } n minus 1
         %2 } divided by 2
  y-        } y minus that

geri dön i

i:[((n%2)^2)>+/(qx y)^2
               (    )^2  } square the result from q(x,y)
             +/          } sum the two numbers
            >            } compare the left side (above) with the right (=> 0/1)
  [                      } floor

Zemin gerekli olmamalıdır. Ama görünüşe göre tercümanda bir hata var.

Bu lfonksiyon jbir jot-dot kullanarak işleve benzer şekilde çalışır .

l:(@1+~]y%2)k.(~y)
        y%2         } y divided by 2
       ]            } ceiling
      ~             } iota 0..ceil(y/2)-1
    1+              } add 1 => 1..ceil(y/2)
   @                } reverse => ceil(y/2)..1
               ~y   } iota y  0..y-1
  (        )k.(  )  } jot-dot using k

kDeğerleri haritalamada, daha sonra dondurma değerlerinden ayırt edilebilir, böylece fonksiyon 2 ile ölçekli bir boolean verir.

k:2*[x>[|qy
     x       } k's left arg
         qy  } y-(n-1)%2
        |    } abs
       [     } floor
     x       } left-hand-side again
      >      } compare 
    [        } floor (should be unnecessary)
  2*         } scale by 2

Eylem halinde ( trREPL'in istemi olan sekme karakterlerini kaldırmak için borulama ):

josh@Z1 ~/inca
$ ./inca2 <icecream | tr -d '\t'

c1
V

c2
((
VV

c3
(((
VVV
 V 

c4
 (( 
((((
VVVV
 VV 

c5
 ((( 
(((((
VVVVV
 VVV 
  V  

josh@Z1 ~/inca
$ 

2

Piton 2, 193 192

Dizeleri kullanmaz, sadece matematik kullanır

N=input()
R=(N+1)/2;r=range(R)
s=lambda L,U:(10**U-10**L)/9
f=lambda N,m:s(0,N)+s(m,N-m)
g=lambda N,m:s(0,N)+s(m,N-m)*6
for i in r[1:]:print f(N,int(R-(2*R*i-i*i)**.5))
for i in r:print g(N,i)

s(L,U)"- Uen sağdaki Lsıfırlarla ve geri kalanlar"
f(N,m)rakamının bir sayısını döndürür, iç kısmı ile bir N basamaklı sayı döndürür 2ve 1her iki tarafın m genişliğinde bir kenarlık
g(N,m)aynı şeyi yapar, ancak 7'renk' için kullanılır İç bölümün koni dokusuna daha yakın olduğundan

Çıktı

N=8         N=9
11122111    112222211
12222221    122222221
22222222    222222222
22222222    222222222
77777777    777777777
17777771    177777771
11777711    117777711
11177111    111777111
            111171111

Bunu yapmanın çok benzersiz bir yolu :)
Calvin'in Hobileri

Dondurmayı da görebilirsek: P
Optimizer

2

Perl 6, 175

Çok fazla golf olmadan oldukça basit uygulama, sadece yabancı boşluk / noktalama işareti ortadan kaldırılması:

sub MAIN($d){my$r=($d/2).Int;for 1..$r ->$n
{my$y=$n-$r;my$h=sqrt($r*$r-$y*$y).Int;my$w=2*$h+$d%2;say
' 'x($r-$h)~'('x$w};for 1..($d-$r) ->$y {say ' 'x($y-1)~'V'x($d-2*$y+2)}}
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.