Bana bir pasta yap!


15

Bu bir pasta:

_========_
|        |
+________+
|        |
+________+
|        |
+________+

8 geniş, 3 boyunda ve 1 derin.

3 girişten pasta yapan bir program yazmalısınız. İlk giriş, ortada ve altta kaç alt çizgi olduğunu kontrol eder =. İşte 8 yerine 10 genişliğine sahip ilk pasta:

_==========_
|          |
+__________+
|          |
+__________+
|          |
+__________+

İkinci giriş pastanın ne kadar uzun olduğunu kontrol eder. İşte 3 yerine 4 yüksekliğe sahip ikinci kek:

_==========_
|          |
+__________+
|          |
+__________+
|          |
+__________+
|          |
+__________+

Katmanların tekrarına dikkat edin.

Üçüncü girdi ne kadar derin olduğunu kontrol eder. | |Üstte kaç tane yer alacak. İşte 1 yerine 2 derinliğe sahip üçüncü kek:

_==========_
|          |
|          |
+__________+
|          |
+__________+
|          |
+__________+
|          |
+__________+

Sondaki boşlukları yazdırabilirsiniz. Test senaryoları:

Girdi: 3, 3,3

Çıktı:

_===_
|   |
|   |
|   |
+___+
|   |
+___+
|   |
+___+

(Umarım bu pastayı asla alamam)

Girdi: 3, 2,1

Çıktı:

_===_
|   |
+___+
|   |
+___+

Girdi: 5, 5,5

Çıktı:

_=====_
|     |
|     |
|     |
|     |
|     |
+_____+
|     |
+_____+
|     |
+_____+
|     |
+_____+
|     |
+_____+

Girdiler her zaman pozitif tamsayılar mı olacak?
Nick Clifford

@NickClifford evet.

Sondaki satırsonlarına izin veriliyor mu?
Shaggy


@Shaggy varsayalım, Meta varsayılan olarak evet.
programcı5000

Yanıtlar:


9

V , 25 , 20 bayt

2é_Àé=ÙÒ|èÙÒ+È_ÀäkÀÄ

Çevrimiçi deneyin!

HexDump:

00000000: 32e9 5fc0 e93d d9d2 7ce8 d9d2 2bc8 5fc0  2._..=..|...+._.
00000010: e46b c0c4                                .k..

@ Nmjmcman101 sayesinde üç bayt kaydettiğim ve bana iki bayt tasarruf eden eski bir operatörü hatırlattığı için.

Açıklama:

a,, bve cüç bağımsız değişkendir.

2é_                   " Insert two '_' characters
   Àé=                " Insert 'a' '=' characters between them
      Ù               " Duplicate this line
       Ò|             " Replace this whole line with '|'s
         è            " *Hollow* this line (replace all the middle characters with spaces)
          Ù           " Duplicate this line
           Ò+         " Replace this whole line with '+'s
             È_       " *Hollow* this line again, but use '_' instead of spaces
               Àäk    " Make 'b' copies of this line and the line above it
                  ÀÄ  " Make 'c' copies of this line

Sana yerini alabilir mi Ò r|$.ile Ò|èbazı bayt için. Çevrimiçi deneyin!
nmjcman101

@ nmjcman101 Ah adamım, èvar olduğunu bile tamamen unuttum . Ne yaptığını hatırlamak için beynimi rafa koymak zorunda kaldım. Ama bu gerçekten zekice! Aslında, büyük harfli varyantı kullanmak, È<char>muhtemelen birkaç yerde daha fazla bayt tasarruf edebilir. Bana hatırlattığın için teşekkürler! :)
James

4

Kömür , 34 26 bayt

Nγ←×γ_↑+↑N_×γ=‖BOγF⁻N¹C⁰±²

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Parametreleri sipariş genişliği, derinliği, yüksekliği olarak alır. Açıklama:

Nγ          Input the width.
←×γ_        Print a set of _s that go at the bottom of each layer.
↑+          Print one of the +s that go on the left.
↑N          Input the depth and print that many left |s.
_           Print the top left _.
×γ=         Print the =s along the top.
‖BOγ        Copy the left column to the right.
F           Repeat:
 ⁻ ¹         One time fewer than:
  N           Input of the height:
    C⁰±²        Copy the whole cake up 2 characters.

2

Mathematica, 167 bayt

c=Column;r=Row;t=Table;f=Flatten;c[c/@{r/@f[{{{"_",r@t["=",#],"_"}},t[{"|",r@t[" ",#],"|"},#3-1]},1],c/@f[{t[{r@{"|",r@t[" ",#],"|"},r@{"+",r@t["_",#],"+"}},#2]},1]}]&

2

PHP> = 7,1, 104 Bayt

for([,$w,$h,$t]=$argv;$i<2*$h+$t;)echo str_pad($e="_|+"[$b=$i++<$t?$i>1:1+$_++%2],$w+1,"= _"[$b])."$e
";

Çevrimiçi sürüm


1
Fena değil. Bulunan 3 bayt:for([,$w,$h,$t]=$argv;$i<2*$h+$t;)echo str_pad($e="_|+"[$b=$i++<$t?$i>1:2-($i-$t&1)],$w+1,"= _"[$b])."$e\n";
Christoph

1
Ve başka 3 bayt: $b=$i++<$t?$i>1:1+$_++%2.
Christoph



1

Japt , 51 47 bayt

"_{ç'=}_"+WçA="
|{ç}|" +(B="
+{ç'_}+" +(´V çA+B

Çevrimiçi deneyin!

Giriş sipariş genişliği, yüksekliği, derinliği olarak alınır.


1

Jöle , 30 29 bayt

Dış ve iç sütunlar arasında çeviri yapmak için bir eklemeden XOR'a -1 bayt geçiş, iki yerine 5 karakter aramaya izin verme _ giriş .

ṬṚ;⁹RḤṬḤ¤Wµ^9ẋ⁵;@;µZị“_+= |”Y

Üç program argümanı alan tam program depth , height, widthve kek baskı.

Çevrimiçi deneyin!

Nasıl?

ṬṚ;⁹RḤṬḤ¤Wµ^9ẋ⁵;@;µZị“_+= |”Y - Main link: depth, height (width is a program argument)
Ṭ                             - untruth   [0,0,0,...1] such that the length is the depth
 Ṛ                            - reverse   [1,0,0,...0]
        ¤                     - nilad followed by link(s) as a nilad:
   ⁹                          -   link's right argument, height
    R                         -   range   [1,2,3,...,height]
     Ḥ                        -   double  [2,4,6,...,2*height]
      Ṭ                       -   untruth [0,1,0,1,0,1,...,0,1] (length double height)
       Ḥ                      -   double  [0,2,0,2,0,2,...,0,2]
  ;                           - concatenate  [1,0,0,...,0,0,2,0,2,0,2,...,0,2]
                              -     ...this is the form of a column of cake!
         W                    - wrap in a list
          µ                   - monadic chain separation, call that c
           ^9                 - bitwise XOR c with 9 [8,9,9,...,9,9,11,9,11,9,11,...,9,11]
              ⁵               - program's 3rd argument, width
             ẋ                - repeat the augmented c width times
               ;@             - concatenate with a copy of c
                 ;            - concatenate a copy of c
                  µ           - monadic chain separation call that sideways cake
                   Z          - transpose the sideways cake to put it the right way up
                     “_+= |”  - literal ['_','+','=',' ','|'] (cake decoration)
                    ị         - index into (1 based and modular, so 8,9, and 11 are, mod 5,
                                            3, 4, and 1 yielding '=', ' ', and '_')
                            Y - join with new lines
                              - implicit print



1

Java 7 , 169 164 158 bayt

String f(int...a){String s="_",t="|",u="+";for(;a[0]-->0;s+="=",t+=" ")u+="_";s=s+"_";t="\n"+t+"|";u=t+"\n"+u+"+";for(;a[2]-->1;)s+=t;for(;a[1]-->0;)s+=u;return s;}

Çevrimiçi deneyin!

Ungolfed:

String f(int...a)                    // saves two bytes over int a, int b, int c
{
    String s="_", t="|", u="+";      // set up the start of each row

    for(; a[0]-->0; s+="=", t+=" ")  // Uses the goes-to operator to fill the row
        u+="_";                      

    s += "_\n";                      // adds the end of each row
    t += "|\n";              
    u = t + u + "+\n";               // and combining t into u

    for(; a[2]-->1; )                // add the top of the cake
        s += t;

    for(; a[1]-->0; )                // add the rest of the cake
        s += u;

    return s;
}

u=t+u+"+\n" inside the for-loop: (U = t + u + "+ \ n; a [2] -> 1;) s + = t;` yi koyarak 1 bayt tasarruf edebilirsiniz . Ama güzel cevap, benden +1.
Kevin Cruijssen

1

05AB1E , 33 31 bayt

'_'=¹×«Ć,'|¹úRĆ³G=}²F='+'_¹×«Ć,

Çevrimiçi deneyin!

açıklama

'_'=¹×«Ć,'|¹úRĆ³G=}²F='+'_¹×«Ć,   Main link. Args: w h d
'_                                Push literal '_'
  '=¹×                            Push '=' w times
      «Ć,                         Concat, enclose and print
         '|                       Push literal '|'
           ¹ú                     Pad with w spaces in front
             RĆ                   Reverse and ecnlose
               ³G }               d - 1 times do:
                 =                Print without consuming
                   ²F             h times do:
                     =            Print without consuming
                      '+          Push literal '+'
                        '_¹×      Push '_' w times
                            «Ć,   Concat, enclose and print

1

Windows Toplu İş, 211 180 163 bayt

@Neil sayesinde toplam 48 bayt golf!

@for /l %%p in (1,1,%1)do @call set w= %%w%%
@echo _%w: ==%_
@for /l %%p in (2,1,%3)do @echo ^|%w%^|
@for /l %%p in (1,1,%2)do @echo ^|%w%^|&echo +%w: =_%+
@set w=

1
1. @Her satırda ve daha sonra dokullanmak biraz daha kısadır @echo off. 2. @call set w=%%w%%_kaçınır setlocal enabledelayedexpansion. 3. kullanın @for /l %%p in (2,1,%2). 4. IMHO eklemeniz gerekir, @set w=böylece kod bir kereden fazla çalışır.
Neil

Eklemezsem @set w=, kodun bir kez daha fazla çalışmayacak mı?
stevefestl

1
1. @for /l %%p in (1,1,%1)doGörünüşe göre kayboldun. 2. Pastanız yanlış yükseklik gibi görünüyor, en azından denediğimde test senaryosuyla eşleşmiyor gibi görünüyor. 3. Komut dosyasını aynı komut oturumunda iki kez çalıştırırsanız, pasta daha da genişler.
Neil

@Neil Her şey düzeltildi :)
stevefestl

1
Harika! Sadece bir kaç son şey fark ettim: 1. gerekmez @sonra &. 2 İkinci döngüyü (2,1,%3)ve üçüncü döngüyü değiştirirseniz, (1,1,%2)bence echo +%w%+çizgiyi silebilirsiniz . 3. Doğru saydıysam, daha az oyuncu değişikliği ile sonuçlanacağı için s wyerine boşluklarla doldurmanız gerektiğini düşünüyorum _. ( @call set w= %%w%%Aksi takdirde boşluk tespit etmek zor kullanırım!)
Neil

1

Haskell , 87 bayt

f w t d=["_=| +_\n"!!j|i<-0:([2..d]>>[2])++([1..t]>>[2,4]),j<-i:([1..w]>>[i+1])++[i,6]]

1
Çoğu golf olmayan dilleri geride bırakarak güzel bir iş. Bir infix bildirimi (w#t)d= ...bir bayt tasarrufu sağlar.
Laikoni

1

SOGL V0.12 , 25 bayt

e =*¼_Oe↕¼|.⌡Qe╔*¼+.H«{Q;

Buradan Deneyin!

Girdinin genişlik, derinlik ve yükseklik olarak olmasını bekler.


Girdilerin yeniden sipariş edilmesine izin veriliyor mu? Verilen bir sırayla belirtilmiş gibi görünüyorlar.
özyinelemeli

1
@recursive Genellikle izin verilir ve soru hiçbir yerde sıralamayı zorlamaz ve en çok oy alan 2. cevap girişleri yeniden sıralar ve muhtemelen OP tarafından görülmüştür, bu yüzden iyi olduğunu varsayırım.
dzaima

1

Python 2, 124 122 120 105 92 bayt

w,t,d=input()
a="\n|"+w*" "+"|"
print"_"+w*"="+"_"+(d-1)*a+t*(a+"\n+"+w*"_"+"+")

Program argümanları yerine STDIN kullanarak -15 bayt

Python 2'ye geçerek -13 bayt ( input()tamsayılar veprint deyimler için)

Caird Coinheringaahing'den -12 bayt

Çevrimiçi deneyin!

Python 3, 124 122 , 120 105 bayt

w,t,d=[int(input())for n in(1,2,3)]
a="\n|"+w*" "+"|"
print("_"+w*"="+"_"+(d-1)*a+t*(a+"\n+"+w*"_"+"+"))

Çevrimiçi deneyin!

Tam bir program gerekli değilse:

Python 3, 87 84 bayt

lambda w,t,d:"_"+w*"="+"_"+(d-1)*("\n|"+w*" "+"|")+t*("\n|"+w*" "+"|\n+"+w*"_"+"+")

Çevrimiçi deneyin!



@cairdcoinheringaahing 78 bayt .
Jonathan Frech

0

JavaScript (ES6), 161 157 bayt

f=(w,h,d)=>{r=x=>x.repeat(w);_='_';m='+'+r(_)+'+';b='|'+r(' ')+'|';c=[_+r('=')+_];for(i=d-1;i--;)
c.push(b);for(i=h;i--;)
c.push(b+'\n'+m);return c.join`\n`}

console.log(f(8,3,1));




0

JavaScript / ES6, 90 bayt

Sadece kaba bir çözüm yazdım ve mevcut JS cevabını 56 bayt ile yendi. Sonra 11 bayt golf.

(w,h,d,g=a=>a+a[1][r='repeat'](w)+a[0]+`
`)=>g('_=')+(l=g('| '))[r](d-1)+(l+g('+_'))[r](h)

İşte bir demo.

var F = (w,h,d,f=a=>a+a[1][r='repeat'](w)+a[0]+`
`)=>f('_=')+(l=f('| '))[r](d-1)+(l+f('+_'))[r](h);

console.log(F(prompt('width') || 3, prompt('height') || 3, prompt('depth') || 3));
console.log(F.toString().length);


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.