Codegolf Rainbow: Siyah Beyaz Çiz


12

Giriş:

resim açıklamasını buraya girin(Kaynak: Wikipedia )
Bir gökkuşağına baktığımızda her zaman yukarıdan aşağıya renkleri olacaktır:
Kırmızı; Portakal; Sarı; yeşil; mavi; indigo; menekşe

Bu ayrı halkalara bakarsak, kırmızı halka elbette menekşe halkadan daha büyüktür.
Ayrıca, aynı anda iki hatta üç gökkuşağına sahip olmak da mümkündür.

Yukarıdaki tüm bunlar bu meydan okumada kullanılacaktır:

Meydan okuma:

Bir tamsayı verildiğinde , renkler niçin harfleri kullanacağımız (muhtemelen birden fazla) 'gökkuşağının birçok halkasının çıktısını alın vibgyor.

Nasıl yukarı doğru oluşturulduklarını n=1ve aralığın nasıl ele alınacağını görmek için aşağıdaki test senaryolarına bakın (at n=8). Gördüğünüz gibi, bir sonraki gökkuşağının halkasını sıraya eklemeden önce, üstteki aralık dahil olmak üzere iki gökkuşağı arasına bir boşluk eklenir.

Zorluk kuralları:

  • VIBGYORKüçük harf yerine sermaye kullanmanıza izin verilir
  • Her bir gökkuşağı arasında bir boşluk olmalıdır
  • Gerçek gökkuşağı (ekranda nereye yerleştirilirse yerleştirilsin) doğru olduğu sürece, herhangi bir miktarda önde gelen ve / veya sondaki boşluklara / yeni satırlara izin verilir
  • Giriş her zaman pozitif bir tamsayı ( >= 1) olacaktır. Bu n=0nedenle tanımsız olduğunda davranış ve program / işlev ne isterse yapabilir (hiçbir şey n=1çıktı; gökkuşağı çıktısı ; rasgele çıktı; hata ile başarısız; vb.)
  • İsterseniz bir liste / dize dizisi veya 2B dizi / karakter listesi çıkışına izin verilir (gerçek güzel baskı kodunu TIO altbilgisine ekleyebilirsiniz).
  • Çıktıların gökkuşağından çok Maya tapınaklarına benzediğini görmezden gelin .. xD

Genel kurallar:

  • Bu , bayt en kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. 'Herhangi bir' programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem uygun parametreler ve dönüş tipi, tam programlar ile kullanılabilir. Çağrınız.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, cevabınız için bir açıklama eklemeniz şiddetle tavsiye edilir.

Test durumlarda (ilk n=1aracılığıyla n=10ve n=25):

1:
 vvv
v   v

2:
  iii
 ivvvi
iv   vi

3:
   bbb
  biiib
 bivvvib
biv   vib

4:
    ggg
   gbbbg
  gbiiibg
 gbivvvibg
gbiv   vibg

5:
     yyy
    ygggy
   ygbbbgy
  ygbiiibgy
 ygbivvvibgy
ygbiv   vibgy

6:
      ooo
     oyyyo
    oygggyo
   oygbbbgyo
  oygbiiibgyo
 oygbivvvibgyo
oygbiv   vibgyo

7:
       rrr
      rooor
     royyyor
    roygggyor
   roygbbbgyor
  roygbiiibgyor
 roygbivvvibgyor
roygbiv   vibgyor

8:
         vvv
        v   v
       v rrr v
      v rooor v
     v royyyor v
    v roygggyor v
   v roygbbbgyor v
  v roygbiiibgyor v
 v roygbivvvibgyor v
v roygbiv   vibgyor v

9:
          iii
         ivvvi
        iv   vi
       iv rrr vi
      iv rooor vi
     iv royyyor vi
    iv roygggyor vi
   iv roygbbbgyor vi
  iv roygbiiibgyor vi
 iv roygbivvvibgyor vi
iv roygbiv   vibgyor vi

10:
           bbb
          biiib
         bivvvib
        biv   vib
       biv rrr vib
      biv rooor vib
     biv royyyor vib
    biv roygggyor vib
   biv roygbbbgyor vib
  biv roygbiiibgyor vib
 biv roygbivvvibgyor vib
biv roygbiv   vibgyor vib

25:
                            ggg
                           gbbbg
                          gbiiibg
                         gbivvvibg
                        gbiv   vibg
                       gbiv rrr vibg
                      gbiv rooor vibg
                     gbiv royyyor vibg
                    gbiv roygggyor vibg
                   gbiv roygbbbgyor vibg
                  gbiv roygbiiibgyor vibg
                 gbiv roygbivvvibgyor vibg
                gbiv roygbiv   vibgyor vibg
               gbiv roygbiv rrr vibgyor vibg
              gbiv roygbiv rooor vibgyor vibg
             gbiv roygbiv royyyor vibgyor vibg
            gbiv roygbiv roygggyor vibgyor vibg
           gbiv roygbiv roygbbbgyor vibgyor vibg
          gbiv roygbiv roygbiiibgyor vibgyor vibg
         gbiv roygbiv roygbivvvibgyor vibgyor vibg
        gbiv roygbiv roygbiv   vibgyor vibgyor vibg
       gbiv roygbiv roygbiv rrr vibgyor vibgyor vibg
      gbiv roygbiv roygbiv rooor vibgyor vibgyor vibg
     gbiv roygbiv roygbiv royyyor vibgyor vibgyor vibg
    gbiv roygbiv roygbiv roygggyor vibgyor vibgyor vibg
   gbiv roygbiv roygbiv roygbbbgyor vibgyor vibgyor vibg
  gbiv roygbiv roygbiv roygbiiibgyor vibgyor vibgyor vibg
 gbiv roygbiv roygbiv roygbivvvibgyor vibgyor vibgyor vibg
gbiv roygbiv roygbiv roygbiv   vibgyor vibgyor vibgyor vibg

3
Belki bunu biliyorsunuz ve tasarım gereği (gökkuşağıların eşkenar dörtgenler veya ascii olmadığını ve daha yüksek siparişlerin pozisyonlarının daha karmaşık hale geldiğini biliyorum), ancak 2. gökkuşağında renkler tersine çevrilmemiş mi?
Chris M

1
@ChrisM Ah, haklısın. İki gökkuşağı ile ikincisi gerçekten tersine çevrilir , ancak üçüyle sadece dış ters çevrilir ve dört gökkuşağı ile her iki dış ters çevrilir. Ah, şimdi değiştirmek için biraz geç. Belki daha sonra bununla ilgili üçüncü bir zorluk düşüneceğim. :)
Kevin Cruijssen


Oh cool, nice one: ¬)
Chris M

Yanıtlar:



3

JavaScript (ES6), 100 bayt

Bir dizgi dizisi döndürür.

f=(n,a=[i='   '])=>++i<n+n/7?f(n,[c=' vibgyor'[i&7],...a].map(s=>c+s+c)):a.map(s=>' '.repeat(--i)+s)

Çevrimiçi deneyin!


3

05AB1E , 32 31 23 bayt

.•VvÈ©•¹∍¬„ v:Rηε¬ý}.c

Çevrimiçi deneyin!

Kevin Cruijssen sayesinde -1 ve Adnan sayesinde -8


Açıklama (3 girişi ile yığın örneği):

.•VvÈ©•                  # Push 'aibgyor'           | ['aibgyor']
       ¹∍                # Extend to input length.  | ['aib']
         ¬               # Push head.               | ['aib','a']
          „ v:           # Replace with ' v'.       | [' vib']
              R          # Reverse.                 | ['biv ']
               η         # Prefixes.                | ['b', 'bi', 'biv', 'biv ']
                ε   }    # For each....             | []
                 ¬ý     # Bifurcate, join by head. | ['b','b']       ->    ['bbb']
                                                    | ['bi','ib']     ->   ['biiib']
                                                    | ['biv','vib']   ->  ['bivvvib']
                                                    | ['biv ',' vib'] -> ['biv   vib']
                     .c # Center the result.        | Expected output.

1
"vibgyor"1 bayt golf yapılabilir .•2Bãθ(•. ( Burada bunun açıklaması " Sözlük parçası olmayan dizeleri sıkıştırmak nasıl? " Bölümünde.) Ayrıca, „vr…v r:ð«golf edilebilir 'v„v .:. Yani 28 bayt . Güzel cevap olsa da, benden +1.
Kevin Cruijssen

2
@KevinCruijssen oh Dize sıkıştırması hakkında her şeyi biliyorum - 3 baytlık şişkinliğin .••bir bayt kurtarmayacağını düşündüm (genellikle süper küçük dizelerde olduğu gibi) . Rakamlar bir kez ben aslında kontrol etmiyoruz o xD bayt kurtaracak zamanı. İyi av
Sihirli Ahtapot Urn


1
@Adnan yeterince adil, aynanın olmaması onu gözlerimde önemli bir refaktör yapıyor (bu ve oraya tek başıma sahip olduğumdan şüpheliyim: P).
Sihirli Ahtapot Urn

1
@Adnan da ¬ýdahidir ... Tanrım ... Çok farklı düşünüyorsun ve harika.
Sihirli Ahtapot Urn

3

Tuval , 29 28 26 bayt

7÷U+{ <ibgyor@¹×/n}⇵K2*∔─↶

Burada deneyin!

Açıklama:

7÷U+                          ceil(input/7) + input
    {             }         for n in 1..the above
      <ibgyor@                in the string " <ibgyor", pick the nth character
              ¹×              repeat n times
                /             create a diagonal of that
                 n            and overlap the top 2 stack items (the 1st time around this does nothing, leaving an item for the next iterations)
                   ⇵        reverse the result vertically
                    K       take off the last line (e.g. " <ibgyor <ib")
                     2*     repeat that vertically twice
                       ∔    and append that back to the diagonals
                        ─   palindromize vertically
                         ↶  and rotate 90° anti-clockwise. This rotates "<" to "v"

25 24 22 bayt sabitlendikten sonra, istenen uzunluk giriş uzunluğundan daha büyükse ve 10. kez sabitlemek için mold'un dönmesi gerekir


Meraktan, neden vyana doğru ( <)? Canvas'ta vzaten ayrılmış bir anahtar kelime var, öyleyse, neden <tersine çevrilmiş anahtar kelime olarak kullanmıyorsunuz ?
Kevin Cruijssen

1
karakterler dikey olarak kullanılır ve daha sonra döndürülür ve Tuval, <90 ° saat yönünün tersine döndürülmüş olduğunu v
anlayacak kadar akıllıdır

Ah tamam, öyleyse vburada kullansaydınız ve daha sonra saat yönünün tersine 90 derece döndürürseniz, bunun >yerine olur . Anlıyorum. : D
Kevin Cruijssen

@KevinCruijssen Bunun başka sonuçları da olabilir
dzaima

Ah, orada bir yerlerde de aynanın var mı? Canvas tbh'ı okuyamıyorum, bu yüzden kodun açıklanmasını dört gözle bekliyorum. ;)
Kevin Cruijssen

3

Haskell , 114 110 101 bayt

- 4 13 bayt için [nimi] [1] 'e teşekkürler !

f n=""#(n+1+div n 7)
w#0=[]
w#n|x<-cycle"r vibgyo"!!n=((' '<$[2..n])++reverse w++x:x:x:w):(x:w)#(n-1)

Çevrimiçi deneyin!


3

Dyalog APL , 41 39 38 bayt

↑{⌽(⌽,⊃,A↑⊢)⍵↑A' vibgyor'}¨-⍳A←⌈⎕×8÷7

Çevrimiçi deneyin!

Diğerlerine benzer bir yaklaşım: A←⌈⎕×8÷7gökkuşağının yüksekliğini (ayrıca merkezin soluna / sağına en uzun 'yarım sıranın' genişliğini) bulur ve Adaha sonra kullanmak üzere atar ¨-⍳, 1. değerleri arasında yineler. ile birlikte kullanıldıklarında doğru tarafta seçilmelerini reddetmek .

A⍴' vibgyor'bir 'yarım sıra' oluşturur ve ⍵↑doğru uzunlukta alt dizeyi seçer. (⌽,⊃,A↑⊢)tersine çevrilmiş yarım satır ( ) ile başlayarak tam satırı tersine (daha az karakter alır ), daha sonra yarım satır dizesinin ( ) başından alınan orta karakter ve son olarak yarım satırın ( A↑⊢). Final , satırı doğru yöne çevirir ve satırların vektörünü 2B diziye dönüştürür.

Düzenleme: -2 teşekkürler dzaima

Düzenleme: -1 sayesinde ngn


Sen yerini alabilir ⍕⍪ile izin verilir karakterlerin bir 2D dizi çıkışı -
dzaima


1+÷7->8÷7
ngn


2

Odun kömürü , 30 bayt

↶≔… vibgyor⁺²÷×⁸⊖N⁷θθ⸿Eθ✂θκ‖O←

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

Çizim yönünü yukarı doğru değiştirin.

≔… vibgyor⁺²÷×⁸⊖N⁷θ

Gökkuşağının yüksekliğini hesaplayın ve değişmez dizgeyi bu uzunluğa kadar tekrarlayın.

θ⸿

Gökkuşağının orta çizgisini yazdırın.

Eθ✂θκ

Ardışık dilimler alarak ve her birini kendi "çizgisine" yazdırarak gökkuşağının sağ yarısını yazdırın.

‖O←

Gökkuşağını tamamlamak için yansıtın.



2

Jöle , 28 bayt

:7+‘“ vibgyor”ṁµṫJZz⁶U;"⁸ŒBṚ

Karakterlerin bir listesini veren bir tamsayıyı kabul eden monadik bir bağlantı.

Çevrimiçi deneyin! (altbilgi yeni satır karakterleriyle birleşir)

Veya test takımına bakın .

Nasıl?

:7+‘“ vibgyor”ṁµṫJZz⁶U;"⁸ŒBṚ - Link: integer
:7                           - integer divide by seven (number of full rainbows)
   ‘                         - increment (the input integer)
  +                          - add (gets the number bands)
    “ vibgyor”               - list of characters = " vibgyor"
              ṁ              - mould like the result above (as a range)
               µ             - start a new monadic chain
                 J           - range of length
                ṫ            - tail (vectorises) (gets the suffixes)
                  Z          - transpose
                   z⁶        - transpose with filler space character
                             -   (together these pad with spaces to the right)
                     U       - reverse each
                             -   (now we have the left side of the rainbow upside down)
                        ⁸    - chain's left argument, as right argument of...
                       "     -   zip with:
                      ;      -     concatenation
                             -   (adds the central character)
                         ŒB  - bounce (vectorises at depth 1)
                             -   (reflects each row like [1,2,3,4] -> [1,2,3,4,3,2,1])
                           Ṛ - reverse (turn the rainbow up the right way)


2

Haskell , 106113 bayt

Henüz diğer yayınları (yani bu ) yorum yapamam, bu yüzden çözümü ayrı bir cevap olarak göndermek zorundayım.

Golf byvs by 7 bytes

p x=reverse x++x!!0:x
u m|n<-m+div(m-1)7=[(' '<$[z..n])++p(drop(n-z)$take(n+1)$cycle" vibgyor")|z<-[0..n]]

Çevrimiçi deneyin!

( Eski sürüm , 113 bayt)


Güzel cevap. Haskell'i tanımıyorum, ancak kod diğer Haskell cevabından oldukça farklı görünüyor. Not: Diğer Haskell cevabı, @ nimi'nin yorumundaki golf ipuçlarından sonra aslında 110 bayt . Ne olursa olsun, bu güzel bir alternatif Haskell cevabı, bu yüzden benden +1.
Kevin Cruijssen

1
Liste kavrayışı bu zorluk için daha iyi bir araç gibi görünüyor. Toplam işlev sayısını azaltarak çözümünüzü 106 bayta kadar golf yapabildim . Bu değişiklikleri uyarlamaktan çekinmeyin.
ovs

2

PowerShell , 108 98 89 85 bayt

param($x)($x+=$x/7-replace'\..*')..0|%{' '*$_+-join(" vibgyor"*$x)[$x..$_+$_+$_..$x]}

Çevrimiçi deneyin!

Bu şimdi oldukça iyi hissettiriyor. Banker'in yuvarlanması hala şeytandır ve aptal olmayan bir birleşimin nasıl yapıldığını anladım. Çok fazla başarı elde etmek için $ ofs ile maymunluk denedim. Konuşursak, katılmadan sonuçlar oldukça iyi görünüyor, biraz erimiş:

         vvv
        v     v
       v   rrr   v
      v   r ooo r   v
     v   r o yyy o r   v
    v   r o y ggg y o r   v
   v   r o y g bbb g y o r   v
  v   r o y g b iii b g y o r   v
 v   r o y g b i vvv i b g y o r   v
v   r o y g b i v     v i b g y o r   v

[int] $ x + = $ x / 7?
mazzy

@mazzy Bu x = 25 için başarısız oluyor.
Kesmek

Evet. Ve truncate çalışır
mazzy

1
@mazzy biliyorum, kesmeyi bilmemin tek yolu ya [math] :: truncate () ya da yukarıda kullanılan normal ifade. [int] $ x sayıyı yuvarlar. Eğer daha iyi bir yol biliyorsan, ben tamamen kulaktayım.
Veskah


1

Kırmızı , 153 bayt

func[n][r: take/last/part append/dup copy"""roygbiv "n l: 9 * n + 8 / 8
repeat i l[print rejoin[t: pad/left take/part copy r i l last t reverse copy t]]]

Çevrimiçi deneyin!

Biraz daha okunabilir:

f: func[ n ] [
    r: copy ""
    append/dup r "roygbiv " n
    r: take/last/part r l: 9 * n + 8 / 8
    repeat i l [
        print rejoin [ t: pad/left take/part copy r i l
                       last t 
                       reverse copy t ]
    ]
]

1

Java (JDK 10) , 184 bayt

n->{int h=n+n/7,i=h+1,w=i*2+1,j,k=0;var o=new char[i][w];for(;i-->0;o[i][w/2]=o[i][w/2+1])for(j=w/2;j-->0;)o[i][j]=o[i][w+~j]=i<h?j<1?32:o[i+1][j-1]:" vibgyor".charAt(k++%8);return o;}

Çevrimiçi deneyin!

Her 7'nin katları için ekstra bir ön ve arka boşluk yazdırır.

açıklama

n->{                             // IntFunction
 int h=n+n/7,                    //  Declare that height = n + n/7
     i=h+1,                      //          that index  = h + 1
     w=i*2+1,                    //          that width  = (h+1)*2+1
     j,                          //          j
     k=0;                        //          that k      = 0
 var o=new char[i][w];           //  Declare a 2D char array
 for(;                           //  Loop
   i-->0;                        //    Until i is 0
   o[i][w/2]=o[i][w/2+1]         //    After each run, copy the middle letter.
 )
  for(j=w/2;                     //   Loop on j = w/2
   j-->0;                        //     Until j = 0
  )                              //
   o[i][j]                       //    copy letters to the left side,
    =o[i][w+~j]                  //      and the right side
    =i<h                         //      if it's not the last line
     ?j<1                        //        if it's the first (and last) character
      ?32                        //          set it to a space.
      :o[i+1][j-1]               //          else set it to the previous character on the next line.
     :" vibgyor".charAt(k++%8);  //      else assign the next letter.
 return o;                       //  return everything
}

Kredi


Sen değiştirerek 2 bayt kaydedebilirsiniz ,w=-~h*2+1,i=h+1için,i=h+1,w=i*2+1
Kevin Cruijssen

Vay be, ben gerçekten golf gece yarısı geçti olmamalı! Bunun için teşekkürler, @KevinCruijssen! :)
Olivier Grégoire

i-~iBunun yerine öneri*2+1
ceilingcat

1

Stax , 23 bayt

⌡G'5h!M╩EV[Ez ▼>≈<S⌡⌡0`

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

Ambalajından çıkarılmış, golf edilmemiş ve yorum yapılmış gibi görünüyor.

" vibgyor"  string literal
,8*7/^      input * 8 / 7 + 1
:m          repeat literal to that length
|]          get all prefixes
Mr          rectangularize, transpose array of arrays, then reverse
            this is the same as rotating counter-clockwise
m           map over each row with the rest of the program, then implicitly output
            the stack starts with just the row itself
  _h        push the first character of the row
  _r        push the reversed row
  L         wrap the entire stack in a single array

Bunu çalıştır

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.