Haydi mozaiklerle süsleyelim!


18

Giriş

Gönderen Vikipedi :

Bir mozaik düz yüzeyin örtüşme ve hiç boşluk fayans olarak adlandırılan bir veya daha fazla geometrik şekillere, kullanan bir düzlemin döşeme olup.

Oldukça iyi bilinen bir mozaikleme aşağıda gösterilmiştir:

resim açıklamasını buraya girin

Rhombi, çakışma veya boşluk bırakmayacak ve birbirinin yerine geçen sütun sütunlarını taklit eden bir şekilde döşenmiştir.

Görev

Senin görevin rhombi görüntü yukarıdaki gibi mozaikler bir program yazmaktır. Programın girdisi mozaik boyutlar olacaktır:height x width burada genişlik sütun miktarı ve yükseklik satır miktarıdır.

Tek bir küp 1 x 1(3 eşkenar dört kiremit) tam olarak şu şekilde temsil edilir:

    _____
  /\      \
 /  \      \
/    \ _____\ 
\    /      /
 \  /      /  
  \/_____ /   

Yani giriş / boyutlar ise 3 x 2, bu çıktı olmalıdır:

    _____
  /\      \
 /  \      \
/    \ _____\ _____
\    /      /\      \
 \  /      /  \      \
  \/_____ /    \ _____\
  /\      \    /      /
 /  \      \  /      /
/    \ _____\/_____ /
\    /      /\      \
 \  /      /  \      \
  \/_____ /    \ _____\
  /\      \    /      /
 /  \      \  /      /
/    \ _____\/_____ /
\    /      /\      \
 \  /      /  \      \
  \/_____ /    \ _____\
          \    /      /
           \  /      /
            \/_____ /

Gördüğünüz gibi, 3 satır (yükseklik) ve 2 sütun (genişlik) vardır. Sütunlar yukarı ve aşağı değişiyor. Programınız da bunu yapmalı ve daha yükseğe başlamalıdır. Örneğin 3 x 3:

    _____               _____
  /\      \           /\      \
 /  \      \         /  \      \
/    \ _____\ _____ /    \ _____\
\    /      /\      \    /      /
 \  /      /  \      \  /      /
  \/_____ /    \ _____\/_____ /
  /\      \    /      /\      \
 /  \      \  /      /  \      \
/    \ _____\/_____ /    \ _____\
\    /      /\      \    /      /
 \  /      /  \      \  /      /
  \/_____ /    \ _____\/_____ /
  /\      \    /      /\      \
 /  \      \  /      /  \      \
/    \ _____\/_____ /    \ _____\
\    /      /\      \    /      /
 \  /      /  \      \  /      /
  \/_____ /    \ _____\/_____ /
          \    /      /
           \  /      /
            \/_____ /

kurallar

  • Sonuç çıktı alınmalı, giriş istediğiniz şekilde alınabilir ancak yükseklik ve genişliğe karşılık gelmelidir
  • Sondaki satırsonlarına izin verilir
  • Mozaikleme sütunları her zaman yukarıdan başlar ve yukarı ve aşağı dönüşümlü olarak değişir
  • Mozaik döşemelerinin yanları paylaşılmalı ve mozaik döşemeler boşluk olmadan diğer sütunlar arasına doğru yerleştirilmelidir.
  • Gönderiniz bir işlev veya tam bir program olabilir
  • Programınız , aynı girdi verildiğinde yukarıdaki çıktıyı tam olarak yazdırmalıdır ; başka bir deyişle, çıktılar küpler / mozaikler için aynı biçimi izlemelidir

Varsayımlar

  • Girişin her zamankinden daha büyük olacağını varsayabilirsiniz 1 x 1, böylece sıfırın girildiği durumlara ihtiyacınız yoktur.

puanlama

Bu , bu yüzden bayttaki en kısa kod kazanır. Standart boşluklar da yasaktır.

Yanıtlar:


4

JavaScript (ES6), 243 bayt

f=
(h,w)=>[...Array(h*6+4)].map((_,i)=>[...Array(w*9+3)].map((_,j)=>i&&(i+j+3)%6==0&&j%9<(i>3?6:3)&&(i>3|j<w*9)&&(j>2|i<h*6)?'/':i&&(i-j+2)%6==0&&j%9<(i>h*6?j<w*9?3:0:6)?'\\':i%3==0&&j>2&&(i*3+j+14)%18%(!i|i>h*6?18:12)<4?'_':' ').join``).join`
`
<div oninput=o.textContent=+h.value&&+w.value?f(h.value,w.value):''><input id=h type=number min=1><input id=w type=number min=1><pre id=o>

İstenen tüm karakterleri doğrudan hesaplar. İçin /:

i&&                         Not on first row of output
(i+j+3)%6==0&&              Backward diagonals
j%9<                        Not on top (right) diamond of hexagons or
    (i>3?6:3)&&             empty spaces on top half row
(i>3|j<w*9)&&               Not on top right corner of output
(j>2|i<h*6)                 Not on bottom left corner of output

İçin \:

i&&                         Not on first row of output
(i-j+2)%6==0&&              Forward diagonals
j%9<                        Not on bottom (right) diamond of hexagons or
    (i>h*6?                 empty spaces on bottom half row or
        j<w*9?3:0:6)        bottom right corner of output

İçin _:

i%3==0&&                    Every third line
j>2&&                       Not on left two columns
(i*3+j+14)%18%              Every 18 characters
    (!i|i>h*6?18:12)<4      One or two groups

3

Befunge, 277 269 bayt

&6*4+00p&:55+*3+10p2%20pv@
6+5:g03%*54:::<<0+55p03:<<v%*54++55:\p04:**`+3g03g00`\g01+*3!g02\-*84g+3+!\%
48*+,1+:10g`!#^_$,1+:00g-|>30g:2+6%\3-!+3+g48*-\:2`\20g3*+10g\`*30g2`**40g!*+
  /\      \
 /  \      \
/    \ _____\
\    /      /
 \  /      /
  \/_____ /
    _____

Çevrimiçi deneyin!

Bu soru aldatıcı bir şekilde kolay görünüyordu, ancak uç vakaların beklediğimden daha karmaşık olduğu ortaya çıktı. Gelebileceğim en iyi yaklaşım, tek ve çift sütunları ayrı yorumlamalar olarak ele almak ve ardından sonuçları birleştirmekti.

Bu nedenle, çıktı alınması gereken her x, y koordinatı için, önce küp diyagramında x , y çıkış koordinatlarını u , v koordinatlarına aşağıdaki şekilde eşleştirerek tek bir sütun için hangi karakterin oluşturulması gerektiğini belirlememiz gerekir :

u = x%20
v = (y+5)%6 + (y==0)

Eklenmesinin (y==0)ilk satırının özel bir durumunu idare etmektir. Ancak, sütunun altında son birkaç satırı ve her satırın sonundaki son birkaç karakteri oluşturmadığımızdan da emin olmamız gerekir. Bu, çıktı karakterinin ifadesiyle çarpılmasıyla elde edilir:

(y > h-3) && (x > w-3*!(columns%2))

!(columns%2)Sona keserek gereken miktar, toplam sütun sayısı tek veya çift olmasına bağlı olduğu için genişliğinde hesaplanmasıdır.

Daha sonra, u , v koordinatlarını aşağıdaki gibi eşleyerek, çift sütun için hangi karakterin oluşturulması gerektiğini belirlemek için ikinci bir hesaplama yaparız :

u = (x+10)%20
v = (y+2)%6 + (y==3)

Bu, tek sütunlar için kullanılanla aynı temel hesaplamadır, ancak biraz ofset. Ve daha önce olduğu gibi, bazı karakterleri sınırlarda oluşturmadığımızdan emin olmalıyız - bu sefer sütunun üstündeki ilk birkaç satır ve her satırın başında ve sonunda bazı karakterler. Bu durumda çarptığımız ifade:

(y > 2) && (x > 2) && (x < w-3*(columns%2))

Bu iki potansiyel çıkış karakterini hesapladıktan sonra, kullanılan son değer:

char1 + (char2 * !char1) + 32

Başka bir deyişle, char1 sıfırsa char2 çıktısı almalıyız , aksi takdirde char1 çıktısı alırız . Her ikisi de sıfır değilse , sadece char1 çıktısı alacağız , ama sorun değil çünkü ikisi de yine de aynı değer olacaktı. Ayrıca, bu karakter değerlerinin 32 ile dengelendiğini (dolayısıyla 32'nin ekleneceğini) unutmayın, böylece sıfır her zaman boşluk olarak sonuçlanır.


2

Toplu, 590 bayt

@echo off
set c=call:c 
set b=\      \
set f=%b:\=/%
set s=       
set u=_____
set w=%2
%c%"   " " %u%" "%s%%s%"
%c%"  " "/%b%" "%s%    "
%c%" " "/  %b%" "%s%  "
%c%"" "/    \ %u%\" " %u% "
for /l %%i in (1,1,%1)do %c%"\" "    %f%" "%b%"&%c%" \" "  %f%" "  %b%"&%c%"  \" "/%u% /" "    \ %u%\"&if %%i lss %1 %c%"  /" "%b%" "    %f%"&%c%" /" "  %b%" "  %f%"&%c%"/" "    \ %u%\" "/%u% /"
%c%"   " "" "%s%\    %f%"
%c%"  " "" "  %s%\  %f%"
%c%" " "" "    %s%\/%u% /"
exit/b
:c
set o=%~1
for /l %%j in (%w%,-2,1)do call set o=%%o%%%~2&if %%j gtr 1 call set o=%%o%%%~3
echo(%o%

:cAltprogram üç parametre alır; %31 ve 2 sütun %2arasındaki fark, 2 ve 3 sütun arasındaki fark %1, ilk sütun için ekstra önek, bu nedenle bir sütun %1%2, iki sütun %1%2%3, üç sütun %1%2%3%2, dört sütun %1%2%3%2%3vb.


2

Piton 2 , 329 326 319 bayt

h,w=input()
a,R=[' '*10]*3,range
b='  /\      \  # /  \      \ #/    \ _____\#\    /      /# \  /      / #  \/_____ /  '.split('#')
c=['    _____    ']+b*h
e,o=c+a,a+c
k=len(e)
f=e[:]
o[3]=o[3][:10]
for x in R(1,w):
 for y in R(k):f[y]+=((e[y][3:],e[y])[y in R(4)],(o[y][3:],o[y])[y in R(k-3,k)])[x%2]
print'\n'.join(f)

Çevrimiçi deneyin!

Aslında 21 24 31 bayt, önceki yanlış yazımdan daha kısa. Tek ve çift sütunlar için listeler oluşturur, ardından bunları genişlikteki her sütun için birleştirir.


İyi iş,
Andrew Li

1
Gönderinizde bir sorun var. Sütunlar aşağı yukarı
Andrew Li

1
Soruyu 3x3 için bir örnek içerecek şekilde düzenledim.
Andrew Li

Tabii, yine de harika bir cevap!
Andrew Li
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.