Buatkan saya sepotong roti sebelum saya dipecat!

7

Backstory

Tidak terlalu nyata, sshh!

Semuanya dimulai suatu hari ketika seorang rekan kerja membawa roti buatan sendiri untuk ulang tahun bos saya.

Bos saya sangat menyukai roti ini, dan dia menginginkan yang lain. Sayangnya, rekan kerja saya sudah berhenti, jadi bos saya meminta saya memberinya roti lagi.

Masalahnya, saya tidak tahu cara membuat roti. Jadi saya memberi tahu atasan saya bahwa saya bukan koki dan terlihat lebih keras bagi seseorang.

Dia berkata, "Tentu ... tetapi Anda kehilangan pekerjaan Anda jika Anda tidak dapat membuat saya makan roti."

Lalu saya punya ide.

Saya akan menjadikannya loaf dengan skilz coding saya! Dia berkata ya, dengan 1 syarat: "Anda harus membuatnya di bawah 351 byte." Sayangnya bagi saya, golf kode terbaik saya membuat saya sampai 375 byte. Uh oh.

Kemudian bos saya menambahkan 2 hal: "Anda harus memberi saya roti dalam seminggu (13/4), dan jika Anda melakukannya Anda mendapatkan gaji yang meningkat. Semakin rendah jumlah byte yang Anda gunakan, semakin baik gaji. Tetapi ingat, jika Anda melebihi 349 Anda kehilangan pekerjaan. "

Jadi saya butuh bantuan Anda dalam bahasa pilihan Anda untuk membantu saya mempertahankan pekerjaan saya!

Aturan

Saya akan melakukan curl ... | shpada TinyURL, tetapi bos saya mengatakan kepada saya bahwa saya tidak dapat menggunakan daftar celah . Saya mungkin bisa melanggar aturan, tapi pekerjaan saya dipertaruhkan, jadi itu bukan ide yang baik.

Apa yang dianggap sebagai roti

Program atau fungsi Anda harus mengambil 3 bilangan bulat positif sebagai input. Jika bahasa Anda memiliki daftar atau larik, Anda dapat mengambil daftar atau larik angka-angka itu. Anda juga dapat menganggapnya sebagai argumen untuk suatu fungsi atau program, atau string angka yang dipisahkan spasi untuk STDIN, baris perintah atau argumen fungsi, dll.

Angka pertama adalah lebar roti Anda

Angka kedua adalah ketinggian roti Anda.

Angka ketiga adalah kedalaman roti Anda.

Inilah roti dengan lebar 3, tinggi 2, dan kedalaman 1:

 / --- \
/ --- \ |
| ||
| ___ | /

Terlihat aneh? Ini adalah 3x2x2:

  / --- \
 / |
/ --- \ |
| | /
| ___ | /

Bagaimana dengan 3x3x3:

   / --- \
  / |
 / |
/ --- \ |
| | /
| | /
| ___ | /

A 4x1x2:

  / ---- \
 / |
/ ---- \ /
| ____ | /

Saya harap Anda mengerti! Lihat jawaban JS (ES6) saya di bawah ini untuk contoh.

Lihat juga kasus uji lengkap

Catatan:

  • Jangan khawatir tentang input yang valid. Semua ukuran akan bilangan bulat positif.
  • Anda harus menerima bilangan bulat positif yang dapat didukung oleh bahasa Anda.
  • Jika angkanya sangat tinggi, bahasa Anda macet dari StackOverflow, panjang string maksimum, dll.

Jawaban terpendek dalam byte menang!

programmer5000
sumber
2
Saya kira jika Anda telah menggunakan Arang Anda bisa meminta kenaikan 10% ... :)
ElPedro
Bagaimana dengan 350 byte?
boboquack
"Anda harus membuatnya di bawah 351 byte". "Ingat, jika Anda melebihi 349 byte, Anda kehilangan pekerjaan Anda". Apa maksudmu sebenarnya? Harap konsisten dengan diri Anda sendiri.
HyperNeutrino

Jawaban:

8

Arang , 35 33 30 byte

Disimpan 2 byte berkat hanya @ ASCII

Disimpan 3 byte berkat @Neil dengan mengatur ulang urutan garis yang digambar

NωNηNδ↓η↗→×_ω↑η←\←ω↗δ→/ω↓\↓η↙δ

Cobalah online!

Ini adalah percobaan pertama saya di Charcoal. Saya dengar bagus dalam , jadi saya mencobanya.

Penjelasan (kedaluwarsa)

NωNηNδ                  # Take the width, height and depth as input
↗¹                        # Write 1 /
↗δ                        # Write depth times /
¶ω                        # Move the cursor down and write - width times
\                         # Write \
↙↓η                       # Move the cursor one down and one left, and then write | height times
↙δ                        # Write / depth times

Sekarang bagian belakang roti sudah selesai. Sekarang tiba wajah depannya.

↑↑η                       # Go up and write | height times
←\                        # Write a \ and move 1 to the left
←ω                        # Write - width times
↓↓η                       # Go down and write | height times
↗P×_ω                    # Go northeast and write _ width times
pengguna41805
sumber
1
Itu sangat keren!
ElPedro
hahaha aku tahu itu segera setelah aku melihat roti ascii ...!
Nelz
Anda dapat mengganti ↓→dengan (baris baru), dan \←←←ωdengan←\←ω
ASCII
@ Khusus ASCII Terima kasih atas tipsnya :)
user41805
Penjelasan Anda telah ←\←tetapi milik kedua sebelum ωdi baris berikutnya. ↗δ→/adalah byte yang lebih pendek daripada ↗¹↗δ¶, tetapi saya juga menyimpan beberapa byte lebih banyak dengan mengatur ulang urutan garis yang diambil: Coba online!
Neil
4

C, 270 290 320 328 byte

#define P printf(
p(n,s)char*s;{P s,--n&&p(n,s));}i,j,k;f(w,h,d){P "%*c",d+1,47);p(w,"-");P "\\\n");for(i=d,j=h,k=0;--i;)P "%*c%*c\n",i+1,47,w+d+1-i-k+!!k,j-->0?124:(++k>0)*47);P "/");p(w,"-");P "\\%*c\n",d-k,j-->0?124:47);for(k&&k++;++i<h;)P "|%*c%*c\n",w+1,124,d-k>!k?d+1-k-!k:0,j-->0?124:(++k>0)*47);P "|");p(w,"_");P "|/");}

Akhirnya (setelah dua tiga versi yang salah) itu berfungsi dengan benar dengan ukuran besar juga.

Cobalah online!

Steadybox
sumber
2

JS (ES6), 375 byte

s=(s,t)=>s.repeat(t);(d,c,e)=>{z=" ",y=`
`,x="\\",w="/",v="|",u="-";a=s(z,e--);a=a+w+s(u,d);a+=x+y;for(b=0;b<e;b++)a+=s(z,e-b),b<c?(a+=w,a+=s(z,d+b+1),a+=v):(a+=w,a+=s(z,d+c+1),a+=w),a+=y;a=a+w+s(u,d);a+=x;f=0;b<c?(a+=s(z,e),a+=v):(a+=s(z,c-f),a+=w);b++;f++;a+=y;for(g=0;g<c;g++)a+=v,a+=s((g==c-1?"_":z),d),a+=v,b<c?(a+=s(z,e),a+=v):(a+=s(z,c-f),a+=w),b++,f++,a+=y;return a}

Tidak Disatukan:

var proc = function(width, height, depth){
    var str = "";

    //Back of loaf (depth)
    str += " ".repeat(depth);//initial padding before start of back of loaf
    str += "/";//top left corner of back of loaf
    str += "-".repeat(width);//top edge of back of loaf
    str += "\\";//top left corner of back of loaf
    str += "\n";//end line

    //Depth lines
    for(var i = 0; i < depth - 1; i++){
        console.log(i)
        str += " ".repeat(depth - i - 1);//space padding before start of left middle edge
        if(i < height){
            //str += " ".repeat(depth - i - 2);
            str += "/";//left middle edge
            str += " ".repeat(width + i + 1);//middle of loaf
            str += "|";//end that edge
            str += "\n";//end line
        }else{
            str += "/";//left middle edge
            str += " ".repeat(width + height + 1);//between two /s
            str += "/";//right middle edge
            str += "\n";//end line
        }
    }

    //front top edge of loaf
    str += "/";//top left corner
    str += "-".repeat(width);//top edge
    str += "\\";//top right corner

    var i3 = 0;

    if(i < height){
        str += " ".repeat(depth - 1);//space for the incoming far right edge
        str += "|";//far right edge
        i++;
        i3++;
    }else{
        str += " ".repeat(height - i3);//space for the incoming far right edge
        str += "/";//far right edge
        i++;
        i3++;
    }

    str += "\n";//newline


    for(var i2 = 0; i2 < height; i2++){
        str += "|";//left edge
        str += (i2 === height - 1 ? "_" : " ").repeat(width);//if we are at the bottom, use underscores to mark that, otherwise spaces.
        str += "|";
        if(i < height){
            str += " ".repeat(depth - 1);//space for the incoming far right edge
            str += "|";//far right edge
            i++;
            i3++;
        }else{
            str += " ".repeat(height - i3);//space for the incoming far right edge
            str += "/";//far right edge
            i++;
            i3++;
        }
        str += "\n";//newline
    }

    return str;
};

s=(s,t)=>s.repeat(t);
var bakeBread = (d,c,e)=>{z=" ",y=`
`,x="\\",w="/",v="|",u="-";a=s(z,e--);a=a+w+s(u,d);a+=x+y;for(b=0;b<e;b++)a+=s(z,e-b),b<c?(a+=w,a+=s(z,d+b+1),a+=v):(a+=w,a+=s(z,d+c+1),a+=w),a+=y;a=a+w+s(u,d);a+=x;f=0;b<c?(a+=s(z,e),a+=v):(a+=s(z,c-f),a+=w);b++;f++;a+=y;for(g=0;g<c;g++)a+=v,a+=s((g==c-1?"_":z),d),a+=v,b<c?(a+=s(z,e),a+=v):(a+=s(z,c-f),a+=w),b++,f++,a+=y;return a}
<input type = "number" id = "a1">
<br/>
<input type = "number" id = "a2">
<br/>
<input type = "number" id = "a3">
<br/>
<button onclick = "document.getElementById('textarea').innerText = bakeBread(+(document.getElementById('a1').value), +(document.getElementById('a2').value), +(document.getElementById('a3').value))">Bake Bread!</button>
<br/>
<textarea id = "textarea"></textarea>

programmer5000
sumber
"di bawah 351 byte" Seseorang baru saja dipecat :(
Shadow
@shadow, sebenarnya, saya perlu program <351 byte untuk dikirim ke bos saya. Salah satu jawaban di bawah ini akan berfungsi!
programmer5000
2

Python 2 , 234 216 210 byte

w,h,d=input()
f,g='|','/';z,s=g+'-'*w+'\\',' '
print'\n'.join([s*d+z]+[s*(d-c)+g+s*(w+c)+(f,g)[c>h]for c in range(1,d)]+[z+s*(d-1)+(f,g)[d>h]]+[f+s*w+f+s*(h-e-1)+(f,s+g)[d>=h]for e in range(1,h)]+[f+'_'*w+f+g])

Cobalah online!

Tentu bisa bermain golf lebih banyak tapi ini awal. 210 akan lakukan untuk saya untuk saat ini.

ElPedro
sumber
2

PHP, 420 byte

<?php $a=$_GET["a"];$b=$_GET["b"];$c=$_GET["c"];$w="<br>";$s="&nbsp;";$u="&#95";$p="|";$k="/";$t=str_repeat;$l='';$r=$t($s,$c).$k.$t("-",$a)."\\".$w;for($i=0;$i<$c+$b-1;$i++){$i<=$b-1?($i<$c-1?$l=$t($s,$a+$i+1).$p:$l=$t($s,$c-1).$p):($i<$c-1?$l=$t($s,$a+$b+1).$k:$l=$t($s,$c+$b-$i-1).$k);$i<$c-1?$r.=$t($s,$c-$i-1).$k.$l.$w:($i==$c-1?$r.=$k.$t("-",$a)."\\".$l.$w:$r.=$p.$t($s,$a).$p.$l.$w);};echo$r.=$p.$t($u,$a).$p.$k?>

Kedengarannya seperti seseorang dipecat - mungkin mencoba meyakinkan bos Anda bahwa itu jauh lebih keren di backend.

Input terlampir pada string URL: ?a=[width]&b=[height]&c=[depth] - Anda dapat mencobanya online di host murah saya. Dalam situasi ini, saya sangat suka menggunakan permintaan GET.

Tidak dikumpulkan untuk transparansi:

<?php 
$a=$_GET["a"];$b=$_GET["b"];$c=$_GET["c"];
$w="<br>";$s="&nbsp;";$u="&#95"; $p="|";$k="/";$t=str_repeat;$f=$v=$m=$l='';
//first line
$r=$t($s,$c).$k.$t("-",$a)."\\".$w;


for($i=0;$i<$c+$b-1;$i++){

    //right side of the loaf
    $i <= $b-1 
    ? ($i < $c-1 ? $l=$t($s,$a+$i+1).$p : $l=$t($s,$c-1).$p)  
    : ($i < $c-1 ? $l=$t($s,$a+$b+1).$k : $l=$t($s,$c+$b-$i-1).$k) ;

    //left side, with the right side attached
    $i<$c-1 
        ? $r.=$t($s,$c-$i-1).$k.$f.$l.$w
        : ($i==$c-1 
            ? $r.=$k.$t("-",$a)."\\".$f.$l.$w
            : $r.=$p.$t($s,$a).$p.$f.$l.$w);

};
    //final line
    echo $r.=$p.$t($u,$a).$p.$k;

?>
Zoltán Schmidt
sumber
2

JavaScript (ES6), 204 byte

(w,h,d)=>[...Array(h-~d)].map((_,y)=>[...Array(w-~d)].map((_,x)=>x+y==d|x+y==h+w-~d?`/`:x==w+d&y<=h&&y||!x|x==w&&y>d?`|`:y==h+d&x<w?`_`:!y|y==d?x+y==w+d?`\\`:x+y>d&x+y<w+d?`-`:` `:` `).join``,++w).join`\n`

Dimana \nmewakili karakter baris baru literal.

Alih-alih bermain-main dengan karakter yang berulang, ini hanya menciptakan array berukuran yang sesuai dan menghitung karakter yang muncul di setiap sel.

Neil
sumber