Petek istiyorum


39

Altıgen fayans veya bal peteğinin bu ASCII sanat bölümünü basan en kısa programı yazınız :

       __
    __/  \__
 __/  \__/  \__
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
   \__/  \__/
      \__/
  • Giriş yapılmamalıdır.
  • Stdout'a veya dilinizin en yakın alternatifi.
  • Bir program yerine, hiçbir parametre almayan ve sonucu normal olarak basan veya dizge olarak döndüren adlandırılmış bir işlev yazabilirsiniz .
  • Çıktının herhangi bir sayıda öncü ve / veya sondaki yeni satırı olabilir ve çıkıştaki her satır, herhangi bir sayıda öncül ve / veya sondaki boşluğa sahip olabilir (desen düzgün bir şekilde sıralandığı sürece).
  • Bayt cinsinden en kısa kod kazanır.

13
Çok Catan oynar mısın?
user3490

@ user3490 Aslında ben ^^
Calvin'in Hobileri

2
PCG'de gelecek hafta: bir Catan kurulu jeneratör yazıyor mu?
user3490

7
IMO girişi olmalı, sizin durumunuzda 3 olması gerekir.
user3819867

3
@ user3819867 Bunu düşündüm ama bunu tercih ettim. Değişmek için çok geç, ancak herhangi bir kişinin bu konuda zorluk çıkarması için çok geç değil.
Calvin'in Hobileri

Yanıtlar:


33

CJam, 45 43 42 41 40 bayt

741e8 36+Ab"\__/  "38*21/.{G2$-<\S*.e<N}

CJam tercümanında çevrimiçi olarak deneyin .

Nasıl çalışır

"\__/  "38*21/

modeli \__/ 38 kez tekrarlar ve uzunluğu 21 olan parçalara böler . Parçalar satır besleme ile ayrılsaydı, sonuç şöyle olurdu:

\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  

Bu açıkça istenen petek içerir. Tek yapılması gereken, bazı karakterleri boşluklarla değiştirmek, bazılarını kesmek ve aslında satır beslemelerini tanıtmak.

741e8 36+Ab

74 100 000 036 tamsayısını oluşturur ve [7 4 1 0 0 0 0 0 3 6] dizisine dönüştürür . Her bir dizi elemanı, karşılık gelen satırın boşluklarla değiştirilmesi gereken baş karakterlerin sayısını kodlar. Bu sayıyı 16'dan çıkartarak , bu satır için doğru uzunluğu da elde ederiz.

.{            } e# Execute for each pair of a digit D and a line L:
  G2$-<         e#   Chop off L after 16 - D characters.
       \S*      e#   Push a string of D spaces.
          .e<   e#   Compute the vectorized minimum.
             N  e#   Push a linefeed.

Bir boşluk diğer L karakterlerinden daha düşük bir kod noktasına sahip olduğu ve vectorized operatörleri, daha kısa olanlardan birine karşılık gelmeyen daha uzun olan dizenin karakterlerini bıraktığından .e<, ilk D karakterlerini boşluklarla değiştirir.


2
Bu mükemmel. İyi iş.
Alex A.

28

Python 2, 73

i=0
exec"k=max(7-i,i-24,0);print' '*k+('\__/  '*9)[i:][k:16-k];i+=3;"*11

Çalıştırıldığını görün.

11 çıkış sırasının her biri için, ön boşlukların sayısını k, altıgenin sol tarafının zarfı oluşturan maksimum üç doğrusal işlev olarak hesaplar . Köşegen çizgiler eğimli olduğundan 3ve -3satır sayısını indekslemek daha iyidir i=0,3,...30.

Altıgen ağ oluşturmak için, öncelikle üniteyi yeterince döşiyoruz '\__/ '. Ardından, kayma [i:]tek satırlar için 3 değerini yeniden düzenler. Sonunda, sol ve sağ tarafta [k:16-k]bir boşluk bırakarak ihtiyaç duyulan kısmını alıyoruz k.


22

CJam, 65 56 55 bayt

"Ý6TNð*¯5"303b4b["/\_")"_ "4*S]f=sB/z{_W%"\/"_W%erN}/

CJam tercümanında çevrimiçi olarak deneyin .

Fikir

Her çizginin sağ yarısı, sol yarının eğik çizgi ve ters eğik çizgi değiştirilmiş tersine çevrilmiş bir kopyasıdır. Bu nedenle, bal peteğinin sol yarısını kodlamak yeterlidir:

       _
    __/ 
 __/  \_
/  \__/ 
\__/  \_
/  \__/ 
\__/  \_
/  \__/ 
\__/  \_
   \__/ 
      \_

Bu desen satır satır analiz etmekten ziyade, sütun satır sütun analiz edebiliriz:

   /\/\/\  
  _ _ _ _  
  _ _ _ _  
  /\/\/\/\ 
 _ _ _ _ _ 
 _ _ _ _ _ 
 /\/\/\/\/\
_ _ _ _ _ _

Açık kalıplar ortaya çıkıyor:

  • Dize _ _ _ _beş kez oluşur.
  • Her birini /a takip eder \.

Her değiştirerek /\, _, _ _ _ _0 ila 3 arasında bir sayı ve alan, daha yüksek bir taban bir taban 4 numaradan diziyi dönüştürmek ve kompakt bir şekilde tam bir desen depolayabilir.

kod

"Ý6TNð*¯5"303b4b  e# Convert the string from base 303 to base 4.
["/\_")"_ "4*S]f= e# Replace each resulting digit by the corresponding item of the array
                  e# ["/\" "_" "_ _ _ _ " " "].
sB/               e# Split into strings of length 11.
z                 e# Zip: transpose rows with columns.
{             }/  e# For each string:
 _W%              e#     Push a reversed copy.
    "\/"_W%er     e#     Swap slashes and backslashes.
             N    e#     Push a linefeed.

10

C, 148 144 140 bayt

k,r,c,d,p;f(){for(;k<187;k++){r=k/17;c=k%17;d=c+r%2*3;p=3*r+c-7<33u&3*r-c+8<33u;putchar(c==16?10:p&(d+5)%6<2?95:p&d%6==3?47:!p|d%6?32:92);}}

Beyaz boşlukta, derleyici uyarısı olmadan ve bazı kodlar birkaç bayttan tasarruf etmek için ince ayar yapar:

#include <stdio.h>

int k, r, c, d, p;

void f() {
    for ( ; k < 187; k++) {
        r = k / 17;
        c = k % 17;
        d = c + 3 * (r % 2);
        p = 3 * r + c - 7 < 33u && 3 * r - c + 8 < 33u;
        putchar(
            c == 16 ? 10 :
            p && (d + 5) % 6 < 2 ? 95 :
            p && d % 6 == 3 ? 47 :
            p && d % 6 == 0 ? 92 :
            32);
    }
}

Bu yaklaşım, herhangi bir karakter / string tablosu kullanmaz. Tüm 187 üzerinde döngü (11 satır, yeni satırlar dahil 17 sütun) ve koşulların bir kombinasyonuna dayanarak her pozisyon için hangi karakterin yazdırılacağına karar verir.

Koşullar, sonuç değişkende saklanarak 4 satır denklemi kullanılarak 4 köşenin içinde / dışında olmak için bir test içerir p. Gerisi daha sonra her 6 karakterde bir tekrar eder, tek sıralar çift sıralara göre 3 karakter kaydırılır.


2
Golf oynamak için, kapalı int kullanıp bırakabilirsiniz int .
luser droog

Birkaç mikro iyileştirme:k;f(r,c,d,p){for(;k<187;putchar(c>15?10:p&d<2&p?95:p&d<3?47:!p|d-5?32:92))r=k/17,c=k++%17,d=(5+c+r%2*3)%6,p=3*r+c-7<33u&3*r-c+8<33u;}
Dennis,

7

Yakut - 78 Bayt

(-5..5).map{|i|puts' '*(j=[i.abs*3-i/6-9,0].max)+('/  \__'*4)[j+i%2*3,16-j*2]}

Xnor'ın çözümünün bir transkripsiyonu (69 Bayt):

11.times{|i|puts' '*(j=[7-i*=3,i-24,0].max)+('\__/  '*9)[i+j,16-j*2]}

1
11.times2 bayt kazandırır
Mitch Schwartz

6

JavaScript (ES6), 129 130

Bu, herhangi bir geometrik özelliğin avantajlarından faydalanmayan, değiştir / değiştir / değiştir ... 'tir.

Şablon dizgileri kullanılarak, tüm yeni satırlar önemlidir ve sayılır.

Test etmek için Firefox'ta pasajı çalıştırın

f=_=>`70
405
 055
9992 3051
6301`[R='replace'](/9/g,`55123
30551
`)[R](/5/g,1230)[R](/\d/g,n=>['__','/',,'\\'][n]||' '.repeat(n))

// TEST

O.innerHTML = f()
<pre id=O></pre>


6

PHP - 139 137 107 101 91 87 bayt

Golf oynamak için en iyi yol bu mu bilmiyorum ama işte benim denemem:

Ismael Miguel sayesinde 30 36 46 -50 bayt

Burada çevrimiçi testi yapın

<?='       __
    __',$a='/  \__',"
 __$a$a
",$c="$a$a/  \
\__$a$a/
","$c$c   \__$a/
      \__/";

<script src="http://ideone.com/e.js/WHWEZS" type="text/javascript" ></script>

eski kod:

<?php $a="/  \\__";$c=$a.$a."/  \\\n\__".$a.$a."/\n";echo "       __\n    __".$a."\n __".$a,$a."\n".$c,$c,$c."   \\__".$a."/\n      \\__/";

Programming Puzzles ve Code Golf'a hoş geldiniz. PHP kodunuz çok daha fazla azaltılabilir. 3 bayt kaydetmek <?yerine kullanabilirsiniz <?php. Bunun yerine $c=$a.$a."/ \\\n\__".$a.$a."/\n";yazabilirsiniz $c="$a$a/ \\\n\__.$a$a/\n";(PHP değişkenleri dizgelerde genişlettiğinden). echoUzunluğunu daha da azaltmak için aynı mantığı uygulayabilirsiniz . Ayrıca, echove dize arasındaki boşluğa ihtiyacınız yoktur .
Ismael Miguel,

1
Teşekkür ederim, her zaman golf hehe yapmaya çalıştığımda yeni bir şey öğreniyorum.
Timo

Rica ederim. İşte 99 bayt uzunluğunda bir çözüm: ideone.com/WHWEZS . Dağınık görünüyor, ama çok daha kısa. Kullanmak yerine, gerçek bir yeni satır \nkoyabilir ve satır başına 1 bayt kaydedebilirsiniz.
Ismael Miguel,

Bu arada 2 bayt düşürdüm. Şimdi 97 bayt var.
Ismael Miguel,

1
Burada tek kılıftır: <?="\t __\n\t__",$a='/ \__',"\n __$a$a\n",$c="$a$a/ \\\n\__$a$a/\n","$c$c \__$a/\n\t \__/";. \tBir sekme karakteriyle ve \ngerçek bir yeni satırla değiştirmeyi unutmayın .
Ismael Miguel,

4

Lua 146

T="       __\n    __/  \\__\n __/  \\__/  \\__\n"
S="/  \\__/  \\__/  \\\n\\__/  \\__/  \\__/\n"
B="   \\__/  \\__/\n      \\__/"
io.write(T,S,S,S,B)

(netlik için newlines eklendi)


1
Bu kod istenen çıktıdan daha uzun değil mi?
Caleb

6
@Caleb: Bu yorumu yaparken aslında saymadığınız ve tahmin ettiğinizden şüpheleniyorum. Metin editörüme göre kafesde 165 karakter var (yeni satırlar dahil). SÜç defa tekrar ettiğim için 19 karakterim daha az .
Kyle Kanos

2
Ancak kaçışların ve yeni satırların, kodumun bu oyunda rekabet edebilme yeteneğini sınırladığı konusunda haklısınız. Ama kazanmak da bunu yapmamın sebebi değil, eğlence ve öğrenme için.
Kyle Kanos

3

Dart - 113

main({r:"/  \\__"}){print("       __\n    __$r\n __$r$r\n${"$r$r/  \\\n\\__$r$r/\n"*3}   \\__$r/\n      \\__/");}

Saf string-enterpolasyon çözümü, hiçbir şey fantezi. "Subring" gibi string işlemleri pratikte rekabet etmek için çok ayrıntılı.

DartPad'de çalıştır .


3

Javascript ( ES7 Taslağı ), 96 94 93 bayt

Burada birkaç çözümden ilham alındı ​​...

Düzenleme: -1 edc65

f=z=>[for(x of[741e6]+36)' '.repeat(x)+'/  \\__'.repeat(4,z^=3).slice(+x+z,16-x+z)].join(`
`)

// For snippet demo:
document.write('<pre>'+f()+'</pre>');

Yorumlananlar:

f=z=>[                                 
        for(x of [741e6] + 36)        // for each character "x" in "74100000036"
            ' '.repeat(x) +           // x spaces
            '/  \\__'.repeat(4,       // build pattern string
            z ^= 3).                  // toggle z offset (3) for even lines
            slice(+x + z, 16 - x + z) // get appropriate substring
    ].join(`                          // join with newlines
    `)

Güzel. .substr(+x+z,16-x-x)-> .slice(+x+z,16-x+z)-1
edc65

@ edc65 güzel yakalamak!
nderscore,

Hızlı soru: Neden +xsadece bu x?
Nic Hartley

1
@QPaysTaxes xBir sayıya yayın yapmak. O olmasaydı bitiştirirdiz
nderscore 19:15

2

Python 3, 100 87 bayt

n=0x85208e08e08dd445
while n:l=n>>2&15;print(' '*(8-l)+('\__/  '*4)[n&3:n&3|l*2]);n>>=6

Ve aşağıdaki kodun okunabilir bir versiyonu. Fikir, aralıkları kodlamak (başlangıç, uzunluk) ve ardından aralığı ortalamak için doğru miktarda boşlukla doldurmaktır.

hexagon_string = '\__/  ' * 4
for i in range(11):
    # Pick the begin and length of the i-th interval using hardcoded numbers
    b = (0x00030303111 >> 4*i) & 3   # n is a combination of these two numbers
    l = (0x25888888741 >> 4*i) & 15  #
    # Print the interval with appropriate whitespace in front of it
    spaces = ' ' * (8-l)
    print(spaces + hexagon_string[b : b+l*2])

2

Retina , 66 bayt

<empty line>
sss __<LF>ssa__<LF> aa__<LF>lll dau<LF>ssdu
l
/daa<LF>\aau<LF>
a
ud
u
__/
d
s\
s

Her satır kendi dosyasına gitmeli ve dosyadaki <LF>asıl yeni satır anlamına gelir. Bayt sayısına eklenen her bir dosya için 1 bayt.

Kodu, -sbayrakla bir dosya olarak çalıştırabilir, <LF>işaretçileri tutar ve belki de okunabilirlik için çıktıda yeni satırlara değiştirirsiniz.

Algoritma, boş bir giriş dizesinden başlayarak 5 basit değiştirme adımıdır (tek satır içeriğini eşit satır içeriğine dönüştür). Her adımdan sonraki sonuçlar (ile sınırlandırılmıştır =):

sss __
ssa__
 aa__
lll dau
ssdu
============
sss __
ssa__
 aa__
/daa
\aau
/daa
\aau
/daa
\aau
 dau
ssdu
============
sss __
ssud__
 udud__
/dudud
\ududu
/dudud
\ududu
/dudud
\ududu
 dudu
ssdu
============
sss __
ss__/d__
 __/d__/d__
/d__/d__/d
\__/d__/d__/
/d__/d__/d
\__/d__/d__/
/d__/d__/d
\__/d__/d__/
 d__/d__/
ssd__/
============
sss __
ss__/s\__
 __/s\__/s\__
/s\__/s\__/s\
\__/s\__/s\__/
/s\__/s\__/s\
\__/s\__/s\__/
/s\__/s\__/s\
\__/s\__/s\__/
 s\__/s\__/
sss\__/
============
       __
    __/  \__
 __/  \__/  \__
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
   \__/  \__/
      \__/

1

Javascript, 154 151 bayt

b="\n",c="\t",d="/  \\",f="__",g="\\",h="/",a=f+d,j=a+a,i=d+j+b+g+j+f+h+b,k="   ";console.log(c+k+f+b+c+a+f+b+" "+j+f+b+i+i+i+k+g+a+f+h+b+c+"  "+g+f+h)
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.