Yıldızlar Yıldızlar


17

Giriş

Fikir, yıldız *boyutundaki karakteri (yıldız) belirli bir boyutta bir ascii-art yıldızı görüntülemek için kullanmaktır . Boyut, bir giriş numarası daha büyük ya da ona eşit olan 1 yıldız üst noktasının hatlarında yüksekliğini belirtir. Buradaki yıldızlar, daha büyük boyutlarda resim açısından daha iyi görünen altı köşeli yıldız olarak tasarlanmıştır.

Her durumda, yıldızların ascii-art temsili, aşağıdaki örneklerde gösterildiği gibi üst üste binen iki üçgen olarak görünmelidir.

Parametrikler

Aşağıdaki resim ve veri tablosu, yıldızın ilk yedi boyutu için nitelikleri açıklar. N = 1 farklı olduğu sürece , parametrelerin her biri N arttıkça aritmetik bir ilerleme içinde büyür .N=1

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Örnekler

1 (dejenere durumda) girişi için program çıktısı aşağıdaki gibi olmalıdır:

  *
*****
*****
  *

2 girişi:

    *
   ***
*********
 *******
*********
   ***
    *

(3)

       *
      ***
     *****
***************
 *************          
  ***********
 *************
***************
     *****
      ***
       *

(5)

             *
            ***
           *****
          *******
         *********
***************************
 *************************
  ***********************
   *********************
    *******************
   *********************
  ***********************
 *************************
***************************
         *********
          *******
           *****
            ***
             *

Meydan okuma

Göreviniz, N sayısını giriş olarak kabul edecek ve daha sonra sadece karakterler ve* .

  • Giriş değerinin her zaman pozitif bir tam sayı olduğunu varsayabilirsiniz.
  • Çıktı çizgilerinde sondaki boşluk tamam.
  • Program algoritması herhangi bir N için yeterince genel olmalıdır.N- girdisinin yıldız sanat çıktısı üretmesi için . Tabii ki ekran çıktı boyutu nedeniyle pratik sınırlamalar var.
  • Çıktı STDOUT'a yazdırılmalıdır.
  • Standart boşluklar yasaktır.
  • Bu bu nedenle her zamanki golf kuralları geçerlidir.

puanlama

Bu yani en az bayt sayısı ile kod kazanır!


5
Ayrıca bir işlev olabileceğini, ancak "STDOUT'a yazdırması" gerektiğini söylüyorsunuz. Bu kasıtlı mı?
Post Rock Garf Hunter

5
Evet, genel bir inşaat kuralı çok iyi olurdu ... örneğin N = 4 gibi girdilerden bile emin değilim ...
digEmTüm

7
Lütfen "Yıldızları üreten algoritma programlama zorluğunun bir parçasıdır" demeyin. Bu, çoğu golfçünün ASCII sanat mücadelesi yaparken keyif aldığı bir şey değildir ve belirleyicilerin sorumluluğu olan bir şeyi piyon etme girişimi gibi görünür. Bununla birlikte, insanların buradaki inşaatta belirsiz olduklarına şaşırdım; meydan okumada belirtildiği gibi üst üste binen iki üçgen. Üçgenlerin boyutunu ve ofsetini açıkça söylemek yardımcı olur mu?
xnor

9
@TimPederick N = 1'in farklı olduğu konusunda iyi bir fikir. Çözücüler bunu kaçırmamak için bir not koydum. Yine de bu özel durum olmasaydı mücadelenin daha iyi olacağını düşünüyorum.
xnor

4
@xnor: n = 1 farklı olduğundan, genel bir kural çıkartamadım ... ve IMO kuralı her zaman ASCII sanatı için belirtilmelidir, aksi takdirde tanımlanan aralığın dışında ne istersem yazabiliyorum örnekler;)
digEmTüm

Yanıtlar:


7

05AB1E , 21 bayt

3*s≠-L·<sÅ0«Âø€à'*×.C

Çevrimiçi deneyin! veya Test Paketi olarak

açıklama

3*                     # multiply input by 3
  s≠-                  # subtract 1 if the input isn't 1
     L                 # push range [1 ... (3*n-(n!=1))]
      ·<               # multiply by 2 and subtract 1 to get odd numbers
        sÅ0«           # append n zeroes
            Âø         # zip with a reversed copy
              ۈ       # get the largest number in each pair
                '*×    # repeat "*" for each number in the list
                   .C  # format centered

1
Çıktı yıldızlarınız doğru görünüyor.
Michael Karas

1
Ben alternatiflerinin yükleri bulabilirsiniz 3*s≠-L·<gibi 6*s≠·-ÅÉveya ≠3/-6*ÅÉdaha kısa, fakat ne yazık ki hiçbiri .. Güzel cevap, her zaman olduğu gibi! :)
Kevin Cruijssen

xs3*<ŸRsLì'*×.º.C.∊19 :). Yalan söyledim, işe yaramaz. 1. İlham almak için ayrılmak.
Sihirli Ahtapot Semaverleri

7

Haskell , 114 bayt

gBir sayı alan ve IOyıldızı STDOUT'a yazdıran bir monad üreten bir işlev oluşturur . Bence bu iyi.

f=replicate
a%b=mapM_(\n->putStrLn$f(a-n)' '++f(2*n-3)'*')$zipWith max<*>reverse$[2..a]++f b 0
g 1=4%1
g a=(3*a)%a

Çevrimiçi deneyin!

açıklama

Önce lambda hakkında konuşalım.

\n->putStrLn$f(a-n)' '++f(2*n-1)'*'

Bu, nyıldız olarak çizilmek için bir sayı alır . İki kat daha fazla yıldız ve sonra 1 tane daha basıyoruz ve görüntünün boyutuna göre sağa doğru yerleştiriyoruz. aYıldız çizgisini ortalamak için bunu sağda boşluklarla dolduruyoruz. Her lambayı çizmek için bu lambda'yı kullanabiliriz.

Bu lambdadan (%) . bir profili şekle dönüştürmek için lambda'mızla (%)yapmaya başlar mapM_.

Şimdi tek yapmamız gereken yıldız için profilin bir listesini yapmak. Bunu önce bir üçgen yaparak yapabiliriz.[1..a] ardından sıfırlarla doldurarak yapabiliriz ++replicate b 0. Üçgenin profilini alıp tersine çevirirsek yıldızın diğer yarısını alırız. Onları süper empoze etmek için, her girişin iki üçgenin maksimum olduğu yeni bir profil oluşturuyoruz. Bu zipWith max.

Sonra bunu iki yoldan biriyle adlandırırız: 3%1 girişi 1ve (3*a-1)%abaşka şekilde.

Buradan, bazı baytları tıraş etmek için bazı değerlerle biraz uğraşıyoruz. Yana 3*a-1ziyade uzun herşey iptal yüzden 1 ederek diğer değerlerden bazılarını ofset ve biz ile amaçlanan davranışı elde 3*ayerine. Yani biz listemizi başlamak 2yerine 1ve yapılacak 2*n-3yerine 2*n-1değişim için telafi etmek.

Alternatif sürüm, 114 bayt

Bu noktadan bağımsız bir işlev oluşturur (%)<*>min 2

f=replicate
a%b=mapM_(\n->putStrLn$f(3*a-n)' '++f(2*(n-b)+1)'*')$zipWith max<*>reverse$[b..3*a]++f a 0
(%)<*>min 2

Çevrimiçi deneyin!

N>1

f=replicate
g a=mapM_(\n->putStrLn$f(3*a-n)' '++f(2*n-3)'*')$zipWith max<*>reverse$[2..3*a]++f a 0

Çevrimiçi deneyin!

N=1

f=replicate
g a=mapM_(\n->putStrLn$f(3*a-n)' '++f(2*n-1)'*')$zipWith max<*>reverse$[1..3*a]++f a 0

Çevrimiçi deneyin!


Çıktınız şimdi güzel görünüyor.
Michael Karas

6

R , 125 107 101 bayt

function(n,S=3*n+!n-1,P=pmax(I<-c(2:S*2-3,!1:n),rev(I)),`~`=strrep)write(paste0(' '~S-1-P/2,'*'~P),1)

Çevrimiçi deneyin!

  • -24 @Giuseppe sayesinde

Önceki (farklı) yaklaşım:

R , 150 148 136 135 130 128 bayt

function(n,G=n<2,K=4*n-1+G)for(i in 1:K-1)cat(`[<-`(rep(' ',W<-3*n-2+G),1+W+c(-i:i*(i<K-n),-(j=K-i-1):j*(i>=n)),'*'),sep='','
')

Çevrimiçi deneyin!

  • @Kirill L. sayesinde -14 teşekkürler
  • @ T-clausen.dk sayesinde -1
  • -7 @Giuseppe sayesinde

Evet, tekrarlanan S [] = ödevlerini de sevmiyorum ve bu işe yarıyor
Kirill L.

Harika ! Böyle bir şey düşünüyordum ... ama akşam yemeği
yiyordum

Bir bayt kaydedebilirsiniz görünüyor: i> n-1 için tekrar yazılabilir > = n i
t-clausen.dk

@ t-clausen.dk: evet, teşekkürler!
digEmAll

1
Yeni sürümde 117 bayt
Giuseppe

5

Python 2 , 101 99 97 bayt

n=input()
x=2*(n>1)
for i in range(1,8*n,2):print('*'*[i,8*n-i-x][i+x>n*6or i/n/2%2]).center(6*n)

Çevrimiçi deneyin!

-2 bayt, Lynn sayesinde


Seçici ifadedeki parenslere ihtiyacınız olmadığından eminim, bu yüzden i+x>n*6oriki bayt kaydeder.
Lynn

@Lynn Thanks :)
TFeld

Hatta gidebilir i+x>~i/n/2%2*6*nya da benzeri bir şey i+x>3*n*(~i/n&2)(her ikisi de 96 bayt.)
Lynn

5

JavaScript (V8) ,  101  108 bayt

DÜZENLEME: STDOUT'a yazdırmak için +7 bayt

n=>print((k=3*n+!~-n,g=y=>++y<k+n?`
`.padEnd(w=k-Math.max(y>n&&n-y+k,y<k&&y)).padEnd(2*k+~w,'*')+g(y):'')``)

Çevrimiçi deneyin!

Yorum yaptı (olmadan print)

n => (                    // n = input
  k =                     // k is half the maximum width of the star + 1.5
    3 * n + !~-n,         // k = 3n if n > 1 or 4 if n = 1
  g = y =>                // g = recursive function taking y
    ++y < k + n ?         //   increment y; if y is less than k + n:
      `\n`                //     append a line feed
      .padEnd(            //     append w - 1 leading spaces:
        w =               //       where w is defined as
          k -             //       k minus
          Math.max(       //       the maximum of:
            y > n         //         - true (coerced to 1) if y > n
            && n - y + k, //           or n - y + k otherwise (bottom triangle)
            y < k &&      //         - true (coerced to 1) if y < k
            y             //           or y otherwise (top triangle)
          )               //       end of Math.max()
      )                   //     end of padEnd()
      .padEnd(            //     append 2 * (k - w) - 1 stars
        2 * k + ~w,       //       by padding to 2 * k - w - 1
        '*'               // 
      ) +                 //     end of padEnd() 
      g(y)                //     append the result of a recursive call
    :                     //   else:
      ''                  //     stop recursion
)``                       // initial call to g with y = [''] (zero-ish)

Zorluğun üstesinden gelmek, çıktınızın doğrudan konsola yazdırılmasını gerektiriyor gibi görünüyor. Bu teknik olarak bu şartı karşılamıyor.
Rock Garf Hunter Post

@ SriotchilismO'Zaic Bana bildirdiğiniz için teşekkürler. Bu artık 'düzeltildi'.
Arnauld

3

Jöle , 21 bayt

×3’+ỊR;Ṭ»Ṛ$”*ẋz⁶ṚZŒBY

STDOUT'a yazdırılan pozitif bir tamsayıyı kabul eden tam bir program.

Çevrimiçi deneyin! Veya bir test takımına bakın .

Nasıl?

×3’+ỊR;Ṭ»Ṛ$”*ẋz⁶ṚZŒBY - Main Link: integer, n   e.g. 3
 3                    - three                        3
×                     - multiply (n by)              9
  ’                   - decrement                    8
    Ị                 - insignificant (abs(n)<=1)?   0
   +                  - add                          8
     R                - range                        [1,2,3,4,5,6,7,8]
       Ṭ              - un-truth (n)                 [0,0,1]
      ;               - concatenate                  [1,2,3,4,5,6,7,8,0,0,1]
          $           - last two links as a monad:
         Ṛ            -   reverse                    [1,0,0,8,7,6,5,4,3,2,1]
        »             -   maximum (vectorises)       [1,2,3,8,7,6,7,8,3,2,1]
           ”*         - an asterisk character        '*' 
             ẋ        - repeat (vectorises)          ["*","**",...]
               ⁶      - a space character            ' '
              z       - transpose with filler        ["***********"," ********* ",...]
                Ṛ     - reverse                      ["   *   *   ","   ** **   ",...]
                 Z    - transpose                    ["       *","      **",...]
                  ŒB  - bounce (vectorises)          ["       *       ","      ***      ",...]
                    Y - join with newline characters "       *       \n      ***      \n..."
                      - implicit print


2

Jöle , 21 bayt

×’»ɗ3”*xⱮz⁶ɓ⁶x;»Ṛ$ŒBY

Çevrimiçi deneyin!

Tek bir tamsayıyı sol argümanı olarak kabul eden ve yeni satırla ayrılmış bir Jelly dizesini yıldız olarak çıktı olarak döndüren monadik bir bağlantı. Tam bir program olarak çalıştırıldığında örtülü olarak yıldızı STDOUT'a yazdırır.

açıklama

   ɗ3                 | Last three links as a dyad with 3 as right argument:
×                     |   Multiply (by 3)
 ’                    |   Decrease by 1
  »                   |   Maximum of this (and 3)
     ”*xⱮ             | An implicit range from 1 to this many asterisks
         z⁶           | Zip with space as filler
           ɓ          | Start a new dyadic chain with the input as left argument and the list of asterisks as right argument
            ⁶x        | Input many spaces
              ;       | Concatenated to the asterisk list
                 $    | Last two links as a monad:
               »Ṛ     |   Maximum of this list and its reverse
                  ŒB  | Bounce each list (i.e. mirror it without duplicating the middle entry)
                    Y | Join with newlines

1
×3’»3Aynı uzunlukta olmasına rağmen başlangıcı şık bir şekilde yazmayı takdir ediyorum ^ _ ^
Lynn

1
@Lynn, birden fazla bağlantıyı birleştirmek için başka bir hızlı kullanacağımı düşündüğüm noktada yaptım ve izin verilen maksimum 4 içinde yapabileceğim anlamına geliyordu. Ancak, bir kez kullanmaya karar verdim ɓönemli değildi ama yine de sevdim çünkü tuttu!
Nick Kennedy

2

Kömür , 25 bayt

G↙θ←⁺⊗θ¬⊖θ↑⊗θ↘⊕θ*‖O¬C⁰¬⊖θ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

G↙θ←⁺⊗θ¬⊖θ↑⊗θ↘⊕θ*

Yıldızın sağ üst çeyreğini temsil eden düzensiz bir beşgen çizin, ancak 1sırayı ekstra bir sütun daha geniş yapmak için özel kasa .

‖O¬

Yıldızı tamamlamayı düşünün.

C⁰¬⊖θ

1Ekstra sıralı bir yıldız için yıldızı yapmak için daha özel kasa .

Alternatif çözüm, ayrıca 25 bayt:

∧¬⊖θ*G↗↓⊖׳N*‖O‖OO↓∧⊖θ⊖⊗θ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

∧¬⊖θ*

Bir ekstra yazdır *durumu için 1.

G↗↓⊖׳N*

Uygun boyutta bir üçgenin sol yarısını çizin.

‖O

Üçgeni tamamlamak için yansıtın.

‖OO↓∧⊖θ⊖⊗θ

Yansımasıyla üst üste getirin, ancak 1bu durumda sadece yansıtın.

Özel kasası olmayan 14 bayt 1:

G<⊖׳N*‖OO↑⊖⊗θ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

G<⊖׳N*

Uygun boyutta bir üçgen çizin.

‖OO↑⊖⊗θ

Yansımasıyla üst üste bindirin.


2

Perl 6 , 74 bayt

{$_ Z~|[R,] $_}o{.&{|((' 'x--$+$_*3~'*'x$++*2+1)xx$_*3-($_>1)),|($ xx$_)}}

Çevrimiçi deneyin!

Kelimenin tam anlamıyla doğru oranlarda bir üçgen oluşturur ve dizeyi veya operatörü ( ~|) kullanarak baş aşağı bir kopyayla üst üste gelir . Öncü ve sondaki satır boşlukları olan satırların listesi olarak çıktılar.

Açıklama:

                {.&{                                                     }  # Anonymous code block
                      (                        )xx$_*3-($_>1)   # Repeat n*3-(n!=1) times
                       ' 'x--$+$_*3      # With a decreasing indentation
                                   ~'*'x$++*2+1  # Append an increasing triangle
                                       # This creates the triangle
                                                            ,|($ xx$_)  # And add some padding lines
{             }o   # Pass the triangle to the combining function
    Z~|            # Zip string bitwise or
 $_                # The list
       [R,] $_     # With its reverse

2

J , 53 50 bayt

' *'{~[:(+.|.),.@#&0,~[:(|.,}.)"1*@<:>:/~@i.@-~3*]

Çevrimiçi deneyin!

ungolfed

' *' {~ [: (+. |.) ,.@#&0 ,~ [: (|. , }.)"1 *@<: >:/~@i.@-~ 3 * ]

Nasıl

İşlev olarak >:(büyük veya eşit) kullanarak üçgenin yarısını oluşturmak için bir işlev tablosu (3. sınıf kez tablosu gibi) kullanın . Sonra her satırı tersine çevirin, son sütunu doğrayın ve tam üçgeni elde etmek için iki tarafı birbirine dikin (ancak 1 ve 0'dan yapılmış). nAlt kısımlara sıfır satırları ekleyin . Sonunda her şeyi tersine çevirin ve boolean kullanarak veya +.sonucu elde etmek için orijinalin üzerine yerleştirin . Sonra 1'i *0'a ve boşluklara çevirin .


Güzel! İşte benim çözümüm - aynı uzunluk, farklı yaklaşım: Çevrimiçi deneyin!
Galen Ivanov

1
Teşekkürler. Kesinlikle daha fazla golf olabilir gibi geliyor, ama bir avuç diğer yaklaşımları denedim ve bunu başaramadı.
Jonah

2

T-SQL, 194 bayt

@ giriş değeri

@c üst üçgenin genişliğini işler

@d genişlik alt üçgenini işler

@eçıktıyı içerir @cveya @d- bu birkaç bayt tasarruf sağlar

@fgiriş olarak 1 özel durumunu işler. @c*@=3ne zaman kullanılacağını belirler @f. Yazmadan daha ucuz 5 bayt@c=3and @=1

DECLARE @ INT=8

,@c INT=1,@e INT=1,@d INT,@f INT=0SET @d=@*8-3r:PRINT
space(@*3-@e/2+@f/2)+replicate('*',@e-@f)SELECT
@c=nullif(@c,@*6-3)+2,@f=iif(@c*@=3,2,0),@d-=2-@f,@e=iif(@c>@d
or @c/2<@,@c,@d)IF @d>0goto r

Çevrimiçi deneyin


1

Japt -R , 25 bayt

Şunun için +5 bayt n=1: \

õ cUon3*U-´UÎ)®ç* êÃê!U û

Dene

õ cUon3*U-´UÎ)®ç* êÃê!U û     :Implicit input of integer U
õ                             :Range [1,U]
  c                           :Concatenate
   Uo                         :  Range [0,U)
     n                        :  Subtract each from
      3*U-                    :    Multiply U by 3 and subtract
          ´U                  :      Decrement U
            Î                 :      Get sign
             )                :End concat
              ®               :Map each Z
               ç*             :  Repeat "*" Z times
                  ê           :  Palindromise
                   Ã          :End map
                    ê!U       :If decremented U is 0, append reverse, else, palindromise
                        û     :Centre pad each line with spaces to the length of the longest
                              :Implicitly join with newlines and output
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.