Otomatik ev üreticisi


15

Otomatik ev yapımı nanobotlar üretildi ve bunları kodlamak sizin işiniz.

İşte girdi tarafından yaratılan ev 7 4 2

  /-----/|
 /     / |
|-----|  |
|     |  |
|     | /
|_____|/

Giriş, evin boyutlarını içeren bir dizedir.

7 genişliğidir.

|_____|

---7---

4 yüksekliktir.

|
|
|
|

2 derinlik

 / 
/

Bu girdi göz önüne alındığında evi yaratabilir misiniz?

Kodunuzun robotlara sığabilmesi için olabildiğince küçük olması gerekir.

notlar

Girdi olarak verilecek en küçük boyutlar 3 2 2. Programınız, boyutları daha küçük olan her şeyi yapabilir 3 2 2.

testcases

3 2 10

          /-/|
         / / |
        / / /
       / / /
      / / /
     / / /
    / / /
   / / /
  / / /
 / / /
|-| /
|_|/


Bu bir küp değil, bu yüzden sorumun yeterince ayrı olduğunu düşünüyorum. Ancak karakterleri değiştirebilir.

2
Daha fazla testcases lütfen?
Sızdıran Rahibe

1
Ayrıca, bu güzel bir soru. Henüz sahip olmadığımızı sanmıyorum.
Rɪᴋᴇʀ

1
Çıktı ne için olurdu 3 2 10?
Downgoat

Yanıtlar:


3

Python 2, 128 bayt

w,h,d=input();i=d
while-i<h:c='|/'[i>0];print' '*i+c+'- _'[(d>i!=0)+(h+i<2)]*(w-2)+c+' '*min(d-i,h-1,w+1,h-1+i)+'/|'[d-i<h];i-=1

Satır satır yazdırır. Satır indeksleri ile arasında geri isayım dyapılır -h+1.


Sen değiştirerek 3 bayt kırpabilir ' '*min(d-i,h-1,w+1,h-1+i)ile(' '*d)[max(0,i):h-1+i]
RootTwo

1

Ruby, 145 bayt

Dizelerin listesini döndürür. Listedeki her öğe bir satıra karşılık gelir. Çok satırlı bir dizenin döndürülmesi gerekiyorsa *$/, son köşeli parantezden hemen önce eklemek için 3 bayt ekleyin .

->w,h,d{s=' ';(0..m=d+h-1).map{|i|(i<d ?s*(d-i)+?/:?|)+(i<1||i==d ??-:i==m ??_ :s)*(w-2)+(i<d ? ?/:?|)+(i<h ?s*[i,d].min+?|:s*[m-i,h-1].min+?/)}}

1

JavaScript (ES6), 169 bayt

(w,h,d)=>[...Array(d+h--)].map((_,i)=>` `[r=`repeat`](i<d&&d-i)+(c=`|/`[+(i<d)])+` _-`[i&&i-d?h+d-i?0:1:2][r](w-2)+c+` `[r]((i<d?i:d)-(i>h&&i-h))+`|/`[+(i>h)]).join`\n`

Burada \ngerçek bir yeni satır karakteri temsil edilir. Açıklama:

(w,h,d,)=>                          Parameters
[...Array(d+h--)].map((_,i)=>       Loop over total height = d + h
 ` `[r=`repeat`](i<d&&d-i)+         Space before roof (if applicable)
 (c=`|/`[+(i<d)])+                  Left wall/roof edge
 ` _-`[i&&i-d?h+d-i?0:1:2][r](w-2)+ Space, floor or eaves between walls
 c+                                 Right wall/roof edge (same as left)
 ` `[r]((i<d?i:d)-(i>h&&i-h))+      Right wall
 `|/`[+(i>h)]                       Back wall/floor edge
).join`                             Join everything together
`

Düzenleme: @jrich sayesinde 2 bayt kaydedildi.


Kaldırmayı deneyin ,r='repeat'önden ve birinci değiştirme [r]ile[r='repeat']
jrich

@jrich Teşekkürler, başlangıçta vardı ,r=(n,c=` `)=>c.repeat(n)ve tack değiştirdiğimde yeniden düzenleme olasılığını göz ardı ettim.
Neil

1

Python 224 301 297 Bayt

(Artık 1x1x1 dahil tüm kutular için çalışır)

l,w,h=input()
s,r,d,v,R,x=" "," - ","/","|",range,(l*3-1)
print s*(w+1)+r*l
for n in R(w):
    if n<h:e,c=v,n
    else:e,c=d,h
    print s*(w-n)+d+s*x+d+s*c+e
if h-w>=1:e,c=v,w
elif w>h:e,c=d,h
else:e,c=d,w
print s+r*l+s*c+e
for n in R(h):
    if h>w+n:e,c=v,w
    else:e,c=d,h-n-1
    print v+s*x+v+s*c+e
print r*l

Açıklama:

Üç sabit alır: l (uzunluk), h (yükseklik), w (genişlik).

Birkaç örnek kutusuna bakarsak, boşlukta desenler bulabiliriz.

3 x 4 x 3 kutu için, bölümler arasındaki boşluğu göstermek için sayıları kullanacağız.

1234 -  -  - 
123/12345678/|
12/12345678/1|
1/12345678/12|
1 -  -  - 123|
|12345678|123/
|       8|12/
|       8|1/
|       8|/
 -  -  - 

Üst sırada 4 boşluk vardır veya w + 1'dir. Sonraki üç satırda w - (1 * x) vardır. X çizgidir.

Bunlar, tüm kutulardaki tüm satırlar boyunca devam eden kalıplardır. Bu nedenle, bu satırı satır satır kolayca programlayabilir ve desene uyacak alan sayısını çoğaltabiliriz.

İşte 5 x 5 x2 kutu için bir örnek.

 123 -  -  -  -  -
 12/12345678912345/|
 1/              /1|
 1 -  -  -  -  - 12|
 |              |12|
 |              |12|
 |              |12|
 |              |1/
 |12345678912345|/
  -  -  -  -  -

Muhtemelen golf oynamaya devam etmelisiniz.
Rɪᴋᴇʀ

Ayrıca, bunu w,h,l=input()bir işlev olarak atamanız veya yapmanız gerekir .
Rɪᴋᴇʀ

Programlama Bulmacaları ve Kod Golf hoş geldiniz! Tüm gönderimlerin STDIN'den okuyan ve STDOUT'a yazılan tam programlar veya bağımsız değişkenleri ve döndürülen değerleri kabul eden işlevler olmasını isteriz. Ayrıca, gönderilerin gönderim sırasında kazanmak için ciddi yarışmacılar olmalarını isteriz, bu da kod golfü için golf dinlemeyen veya kısmen golf dinlemeyen çözümlere izin vermediğimiz anlamına gelir.
Alex

Bu kodu burada çalıştırdığımda , çıktıda fazladan boşluk var.
James

@DrGreenEggsandHamDJ Düzeltildi! Belirli bir h, w ve l modelini hesaba katmadı, bu yüzden bazı if ifadeleri ekledim.
JoshK

0

Piton 3.5, 328 326 313 305 295 248 bayt

( Üçlü ifadelerin boyutunu azaltma ipucu için Kevin Lau'ya teşekkürler ! )

def s(w,h,d):R,M=range,max;S,V,L=' |/';O=w-2;D=d-M(0,d-h);Q=h-M(0,h-d);print('\n'.join([S*(d-i)+L+' -'[i<1]*O+L+S*[h-1,i][i<=D-1]+'/|'[i<=D-1]for i in R(D+M(0,d-h))]+[V+[' -'[i==h],'_'][i<2]*O+V+S*[i-1,d][i>Q]+'/|'[i>Q]for i in R(Q+M(0,h-d),0,-1)]))

Girdisini sırasıyla 3 tamsayı olarak alır width, height, depth. Zaman içinde nerede olursa olsun daha fazla golf olacak.

Çevrimiçi deneyin! (Ideone)

Açıklama:

Bu açıklamanın amaçları doğrultusunda, fonksiyonun (3,2,3)3'ün genişlik ( w), 2'nin yükseklik ( h) ve 3'ün derinlik ( d) olduğu argümanlarla yürütüldüğünü varsayın . Bununla birlikte, tüm fonksiyonun ana bölümünü göstererek başlayayım:

'\n'.join([S*(d-i)+L+' -'[i<1]*O+L+S*[h-1,i][i<=D-1]+'/|'[i<=D-1]for i in R(D+M(0,d-h))]+[V+[' -'[i==h],'_'][i<2]*O+V+S*[i-1,d][i>Q]+'/|'[i>Q]for i in R(Q+M(0,h-d),0,-1)])

Burada, tüm "evi" oluşturan iki liste oluşturulur ve ardından yeni satırlarla birleştirilir ( \n). Sırasıyla liste ave liste olarak badlandıralım ve her birini analiz edelim :

  • Listenin aoluşturulduğu yer:

    [S*(d-i)+L+' -'[i<1]*O+L+S*[h-1,i][i<=D-1]+'/|'[i<=D-1]for i in R(D+M(0,d-h))]
    

    Bu liste devin ilk satırlarını içerir. Burada, iaralıktaki her sayıdır 0=>(d-(d-h))+d-hburada d-h=0negatif veya sıfıra ise. Başlamak d-iiçin, listeye boşluklar eklenir, ardından /sıkıştırılmış koşullu deyim tarafından döndürülen ve ardından her şey döndürülür. Bu koşullu ifadede w-2boşluk sayısı döndürülür i>1. Aksi takdirde aynı sayıda -iade edilir. Ardından, bunları başka bir alan izler /ve daha sonra boşluk sayısının şimdi olup olmamasına bağlı olduğu boşluklar i<=d-(d-h)-1. Öyleyse, iboşluklar eklenir. Aksi takdirde, h-1boşluklar eklenir. Son olarak, bunların tümü a /veya a| , burada| eklenirse i<=d-(d-h)-1,/eklendi. Bu bir durumunda3x2x3prizma, bu listeye göre döndürülür a:

          /-/|
         / / |
        / / /
    
  • Listenin boluşturulduğu yer:

    [V+[' -'[i==h],'_'][i<2]*O+V+S*[i-1,d][i>Q]+'/|'[i>Q]for i in R(Q+M(0,h-d),0,-1)]`
    

    Bu listeler prizmanın geri kalanını içerir. Bu listede, iaralıktaki her tam sayı olduğu (h-(h-d))+h-d=>0burada h-d=0negatif veya sıfıra ise. Bu listeyi başlatmak için öncelikle a |eklenir, çünkü bu satırlar her zaman a ile başlar |. Daha sonra, ya bir boşluk, -ya _olup olmadığına bağlı olarak ilave edilir i=hveya i<2. Eğer i<2, o zaman a _eklenir. Aksi takdirde, a -eklenir i=hveya i>hveya i<hveya eklenirse boşluk eklenir i>2. Bu karar verildikten sonra w-2, seçilen karakterin sayısı eklenir. Bundan sonra, başka |bir tane eklenir ve daha sonra i-1veya dboşluk sayısı eklenir. Eğer i>h-(h-d), o zaman birdboşluk sayısı eklendi. Aksi takdirde, i-1boşluk sayısı eklenir. Son olarak, bunların tümü a |veya /a |ile eklenir i>h-(h-d)veya a /eklenirse veya a eklenir i<=h-(h-d). Bir 3x2x3prizma durumunda , liste şunu bdöndürür:

        |-| /
        |_|/
    

2 liste oluşturulduktan sonra, son olarak \nkullanarak yeni satırlar ( ) ile birleştirilirler '\n'.join(). Bu sizin tamamlanmış prizmanızdır ve bu durumda şöyle görünecektir:

       /-/|
      / / |
     / / /
    |-| /
    |_|/

1
Python booleans tamsayılara göre değerlendirilir, yani üçlülerinizin çoğu gibi şeylere sıkıştırılabilir '-_'[f<2]. Son olarak, R=range;S,V,L=' |/'ilk değişkenlerinizi atamak için çalışır çünkü dizeler bu durumda sizin için memnuniyetle açılacaktır.
Değer Mürekkebi

Boş ver, operatörün Python'da olmadığını unuttum ... Ama gerisi işe yaramalı!
Değer Mürekkebi

@ KevinLau-notKenny Wow, ipuçları için teşekkürler! :) Üçlü ifadelerin bu şekilde ifade edilebileceğini bilmiyordum!
R. Kap

İçindeki değişkenleri değiştirmediğiniz sürece, bu hileyi üçlüler için kullanabilirsiniz. Örneğin, a=1 if b<9 else c=5olarak ifade edilemez [a=1,c=5][b<9]hem değiştirerek bitireceğiz çünkü ave c. İşte PPCG Python golf ipuçları sayfası: codegolf.stackexchange.com/questions/54/…
Value Ink

Hala orada olan bir üçlü var '_'if f<2else' -'[f==h]. Booleların tamsayı olarak değerlendirildiğini unutmayın, böylece bu üçlüyü elde etmek için sabitlediğiniz diğerine "zincirleyebilirsiniz" [' -'[f==h],'_'][f<2]. Ayrıca, S,V,L=' |/'henüz bahşişimi kullanmadınız.
Değer Mürekkebi
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.