Simetrik Ladybugs


22

Giriş:

Ladybug'ları düşündüğümüzde siyah lekeli kırmızı veya koyu turuncu bir böcek düşünürüz. Bu doğru olmasa da , kırmızı / turuncu benekli ladybugs veya hiç lekesiz ladybugs da olduğu için , çoğunlukla bu Asya Uğur Böceği gibi bir şey görüyoruz:

görüntü tanımını buraya girin

Unutulmaması gereken bir başka şey, uğur böceği üzerindeki lekelerin neredeyse her zaman simetrik olmasıdır. Ve bu meydan okuma burada devreye giriyor.

Meydan okuma:

Bir tamsayı n( >= 0) verildiğinde , aşağıdaki ASCII-sanat uğur böceği bir veya birden çok kez çıktı, iki taraf arasında ve iki veya daha fazla uğur böceği arasında eşit şekilde bölünmüş simetrik lekeler.

İşte varsayılan uğur böceği düzeni:

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   |   /
  ''-!-''

Eğer n=0uğur böceği yukarıdaki gibi çıkarsa .

Ne zaman nsıfırdan büyüktür, biz ya bir küçük harf ile ASCII sanat böcek boşlukları doldurmak oveya değiştirmek |bir sermaye ile merkezde O. Amaç, n'boş' uğur böceği (lerinde) üzerinde değişiklik yapmak , yine de simetrik bir çıktı (uğur böceği başına) üretmek ve mümkün olduğunca az sayıda uğur böceği üretmek.

Bu nedenle geçerli çıktılar n=1:

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   O   /
  ''-!-''

Ancak bu geçersiz olur:

    _V_ 
  /(@I@)\
 /   |   \
| o  |    |
 \   |   /
  ''-!-''

Geçerli çıktılar n=2:

    _V_ 
  /(@I@)\
 /   O   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   O   /
  ''-!-''

    _V_ 
  /(@I@)\
 /  o|o  \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
| o  |  o |
 \   |   /
  ''-!-''

etc. There are a lot of possible outputs.

nArtık tek bir böceğe sığması mümkün olmayan ilk şey n=24. Bu durumda, mümkün olduğu kadar eşit olarak iki uğur böceğine bölmeniz gerekecektir (aralarında isteğe bağlı olarak bir boşluk veya bir satır olacak şekilde bunları yan yana mı yoksa altından mı çıkartacağınızı seçebilirsiniz). Örneğin:

    _V_        _V_ 
  /(@I@)\    /(@I@)\
 /o o|o o\  /o o|o o\
|o o | o o||o o | o o|
 \o o|o o/  \o o|o o/
  ''-!-''    ''-!-''

VEYA:

    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''
    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''

Meydan okuma kuralları:

  • naralığında olacak 0-1000.
  • STDOUT'a çıkış yapmayı, String veya 2D karakter dizisi / liste vb. Olarak dönmeyi seçebilirsiniz.
  • Önde gelen yeni hatlara veya gereksiz beyaz alanlara izin verilmiyor. Firar beyaz boşluklar ve firar tek satır yeni bir çizgiye izin verilir.
  • Yukarıda da belirtildiği gibi, iki veya daha fazla uğur böceği gerektiğinde, onları yan yana mı yoksa yan yana mı (veya her ikisinin bir karışımı ..) çıkarmayı seçebilirsiniz.
  • İki veya daha fazla uğur böceği yan yana basıldığında, aralarında tek bir isteğe bağlı boşluğa izin verilir. İki veya daha fazla uğur böceği birbiri ile basıldığında, aralarında tek bir isteğe bağlı yeni satıra izin verilir.
  • Simetrik ve girişe eşit oldukları sürece, sekans sırasında herhangi bir adımda uğur böceklerinin yerleşimini seçebilirsiniz n.
  • Amaç ndeğişiklik yapmak VE mümkün olduğunca az sayıda uğur böceği olmak olduğundan, yukarıdayken birden fazla uğur böceği kullanmaya başlayacaksınız n=23. Bu uğur böceği düzeninin aynı olması gerekmiyor. Aslında, bu iki girdi gibi n=25veya bazı n=50isimler için bile mümkün değildir .
  • Ek olarak, bazen noktaları iki veya daha fazla uğur böceği arasında eşit şekilde bölmek mümkün olmayabilir. Bu durumda, aralarında olabildiğince eşit bir şekilde bölmek zorunda kalacaksınız.

Bu nedenle n=50, son iki kuralı göz önünde bulundurarak, bu geçerli bir çıktı olabilir (ilk böceğin 16 nokta, diğer ikisinin ise 17):

    _V_        _V_        _V_ 
  /(@I@)\    /(@I@)\    /(@I@)\
 /oooOooo\  /   O   \  /o oOo o\
|ooooOoooo||ooooOoooo||o ooOoo o|
 \   |   /  \oooOooo/  \o oOo o/
  ''-!-''    ''-!-''    ''-!-''

Genel kurallar:

  • Bu , bayt cinsinden en kısa cevap kazanır.
    Code-golf dillerinin, codegolfing olmayan dillerle cevap göndermekten vazgeçmesine 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ını, uygun parametrelerle fonksiyonlarını ve geri dönüş tipini, tam programları kullanmanıza izin verilir. Senin çağrı.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, lütfen gerekirse bir açıklama ekleyin.

Boş uğur böceği için "mümkün olduğunca az değişiklik" ile ne demek istiyorsunuz? Tek bir uğur böceğine n (<24) harfleri o / O koyarken, üzerinde n değişiklikleri yaparsınız. Yoksa n-1'den n'ye olan değişiklikleri mi kastediyorsunuz?
Heimdall

@Heimdall Ah yanlış ifade nedeniyle karışıklık için üzgünüm. Bu, bu zorluğu düşündüğümde birden fazla karakterin bir nokta oluşturmasına izin verme fikrime sahipken, bunu düşürdüm ove Oyerine kullandım. İfadeleri biraz değiştirdim.
Kevin Cruijssen

Örneğin, n=50ilk böceğin 16 nokta, diğer ikisinin de 17 puan aldığına inanıyorum.
Jon Claus

Bu benim en sevdiğim Jimi Hendrix albümü.
Monica iamnotmaynard

@iamnotmaynard Belki de bariz bir şeyleri özlüyorum, ya da yanlış meydan okumayla ilgili yorum yaptın mı? Jimi Hendrix ve ladybugs arasındaki bağlantıyı gerçekten göremiyorum ..
Kevin Cruijssen

Yanıtlar:


5

Kömür , 84 81 bayt

Nθ≔⌈∕∨θ¹¦²³ηFη«≔⁺÷θη‹ι﹪θηζV_¶I@)↘²↙|/←''-↑!↑⎇›ζ²¹OO²§|OζE037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧↙»‖B←

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

Nθ

Toplam nokta sayısını girin.

≔⌈∕∨θ¹¦²³η

Gerekli olan bayan kuş sayısını hesaplayın.

Fη«

Her uğur böceği üzerinde döngü.

≔⁺÷θη‹ι﹪θηζ

Bu uğur böceği koymak için lekelerin sayısını hesaplayın.

V_¶I@)↘²↙|/←''-↑!

Uğur böceği baş ve sağ kanadı yazdırın.

↑⎇›ζ²¹OO²

21'den fazla nokta varsa, iki nokta yazdırın, aksi takdirde arkasını yazdırın.

§|Oζ

Noktaların sayısı tek ise, başka bir nokta yazdırın, aksi takdirde arkasını geri yazdırın.

E037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧

Nokta sayısını ikiye bölün ve 3, 4 ve 3 noktadan oluşan üç sıraya dağıtın.

↙»

Bir sonraki uğur böceği başlangıcına git.

‖B←

Tuvali sola yansıtın, arkayı koruyun.


8

Python 2 , 252 249 238 212 211 213 209 bayt

n=input()
x=(n+22)/23or 1
for i in range(x):b=n/x+(n%x>i);c=r"""    _V_
  /(@I@)\
 /361%s163\
|408717804|
 \5201025/
  ''-!-''"""%'|O'[b%2];i=0;exec"c=c.replace(`i%9`,' |oO'[i>9::2][i<b/2],2);i+=1;"*11;print c

Çevrimiçi deneyin!

  • Kevin Cruijssen sayesinde 9 bayt kaydedildi
  • Bay Xcoder sayesinde 18 bayt kaydedildi
  • Jonathan Frech sayesinde 2 bayt kaydedildi

Bunun yerine kaldırabilir .replace('A','|O'[b%2])ve kullanabilirsiniz c=" _V_\n /(@I@)\ \n /361"+'|O'[b%2]+"163\ \n|4087B7804|\n \\529B925/\n ''-!-''"?
Kevin Cruijssen

230 bayt çevirerek [' o','|O'][i>9]içine ' |oO'[i>9::2]kullanılarak |yerine mantıksal ya da. Ayrıca 4 bayt kaydedilen for i in range(11)bir execifadeye dönerek .
Bay Xcoder

1
Ve yorumlardaki karışıklık için özür dileriz, ancak listenizi kavrayışınızla karıştırarak 218 baytfor , gereksiz bir değişkeni de siler.
Bay Xcoder

@ Mr.Xcoder Çok teşekkürler :)
TFeld

Mümkün olan en az uğur böceği üretmesi gerekiyordu, değil mi? TIO'ya 24'den 46'ya girdiğimde iki yerine 3 uğur böceği veriyor.
Nick Matteo

7

JavaScript (ES6), 183 186 bayt

Ladybug'lar arasındaki noktaları ayırmak için TFeld'in cevabıyla aynı formülü kullanır .

n=>(g=k=>k--?`    _V_
  /(@I@)\\
 /3\\
|4|
 \\3/
  ''-!-''
`.replace(/\d/g,i=>(h=s=>i--?h((p=N?(N-=2,'o'):' ')+s+p):s)('|O'[N>2*i|N&1&&+!!N--]),N=(n%j>k)+n/j|0)+g(k):'')(j=n/23+.99|0||1)

gösteri


6

Befunge, 292 279 bayt

#j07-00p&>::1-27*9+/\!!*:1+06pv-1_@#:<<g61$<<:
v"h"**95%2:+`g61%g60\/g60::p61<>-0g*+35*-,:!|
>\-30p2/:55+`:59**"g"\-40p-26pv^*84\!`"."::<<9
v\%+55+g62:%+55+4*g62:::-1<+55<>:"/n"$#->#<^#<
>`26g!+"O"*"Y"\-\-\5+0p:>#^_" 66<0<66// >,-"v
"n //>7OXO8k />'&%$%&'k !(*+)#)+*(! /k,-.$."<v

Çevrimiçi deneyin!

açıklama

Uğur böceği için ASCII sanatı, basılabilir ilk 15 karakterin özel amaçlar için ayrılmasını sağlamak için 15 ile dengelenen tek bir Befunge dizesinde kodlanmıştır. Bu özel karakterlerin ilk ikisi |, her ikisi de yazdırılamayan yeni satırı ve karakteri temsil eder . Üçüncüsü kullanılmaz, çünkü "bir dizgede kullanılamaz. Sonraki iki merkezdeki büyük noktaları temsil eder. Ve kalan on ise kanatlardaki lekeler içindir.

Bu özel karakterler, ilk satırın ilk kısmı üzerine yazılan bir arama tablosu aracılığıyla son hallerine çevrilir.

Açıklamayı kolaylaştırmak için, çeşitli bileşen parçalarının vurgulandığı kod budur:

Yürütme yolları vurgulanmış olarak kaynak kodu

*|Arama tablosundaki yeni satırı ve karakteri başlatarak başlıyoruz , çünkü bunlar sabit.
*Daha sonra stdin'deki lekelerin sayısını okuduk ve gereken uğur böceği sayısını hesapladık.
*Daha sonra, dış döngüyü böcek kümesi için başlatabiliriz, bir sonraki uğur böceği için oluşturulacak nokta sayısını hesaplayabiliriz.
*Her uğur böceği için, büyük merkez spotunun gösterilmesi gerekip gerekmediğini (eğer spots%2 == 1) hesaplıyoruz ve uygun değeri arama tablosuna yazıyoruz.
*Benzer şekilde, diğer büyük noktalar çiftinin gösterilmesi gerekip gerekmediğini hesaplamaktayız ( spots/2 > 10arama tablosu yeniden güncellenmektedir). Ayrıca her kanatta gereken kalan noktaları da hesaplıyoruz.
*Arama tablosu başlatmanın son kısmı, küçük noktalardan hangisinin gösterilmesi gerektiğini hesaplayan bir döngüdür. Temel olarak algoritma şudur: eğer (spotnum*spotcount+4)%10 > ((spotnum+1)*spotcount+4)%10öyleyse, noktanın gösterilmesi gerekir.
*Sonra uğur böceğinin kodlanmış ip gösterimini istifin üzerine itiyoruz. Bu aslında sadece basit bir dizedir, ancak kodun boşluklarına sıkıştırılmaya çalışılırken kaynağın bir dikdörtgen oluşturabilmesi için biraz sarsıldı.
*Bu noktada, daha önce oluşturulmuş olan arama tablosu aracılığıyla karakterleri birer birer işleyerek, özel durumları (noktalar, satır kesmeleri vb.) Dönüştüren çıkış döngüsüne başlamaya hazırız.
*Sonunda, gerekli tüm ladybug'ları gösterip göstermediğimizi kontrol ederiz, aksi takdirde dış döngünün başlangıcına geri dönün.


Güzel, senin uğur böceklerinin 1-23 arasındaki her aşamada sahip oldukları modelleri gerçekten seviyorum. Diğer cevapların bazılarından oldukça farklı. Benden +1. Bir açıklama eklemeyi düşünür müsünüz (belki daha fazla golf oynamayı bitirdikten sonra)?
Kevin Cruijssen

1
Modelleri sevdiğine sevindim. Aslında mümkün olduğunca çok sayıda evrede iyi görünen bir algoritma bulmak için farklı kombinasyonları denemek için çok zaman harcadım. Ayrıca şimdi cevabımı biraz açıklama eklendi.
James Holderness

3

Ruby , 203 193 190 bayt

f=->n{s=%q{    _V_ 
  /(@I@)\
 /137x731\
|0596x6950|
 \248x842/
  ''-!-''
}
n-=d=n>0?n/(1+~-n/23):0
s.gsub!(/\d/){$&.to_i<d/2??o:' '}
x=[d%2,d<=>21]*2
s.gsub!(?x){"|O|"[x.pop]}
n>0?s+f[n]:s}

Çevrimiçi deneyin!

  • Ürdün sayesinde 10 bayt kaydedildi

{|m|m.ile değiştirilebilir {$&.; b=(n-1)/23+1ile değiştirilebilir b=1+~-n/23; ve x=[z=d>21,d%2>0,z]⏎s.gsub!(?x){x.pop ? ?O:?|}ile değiştirilebilir x=[d%2,d<=>21]*2⏎s.gsub!(?x){"|O|"[x.pop]}.
Ürdün

Sen kullanarak başka byte kaydedebilirsiniz %q{XY}yerine 'X'+"Y"yaparak çift daha ilk sekiz hatlarında ve d=n>0?n/(b=1+~-n/23):b=0yerine n>0?d=n/(b=(n-1)/23+1):d=b=0.
Ürdün

@Jordan Wow, teşekkür ederim.
Monica iamnotmaynard
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.