Teka-teki Pemrograman dan Truk Taco

23

Programming Puzzles & Code Golf telah membuka truk taco ! Kata itu keluar dan sekarang pengguna dari seluruh jaringan Stack Exchange datang untuk mencoba taco ASCII kami yang lezat dan otentik . Kami membutuhkan bantuan Anda untuk memastikan bahwa semua orang menerima pesanan mereka tepat waktu. Tidak ada banyak ruang di dalam truk makanan, jadi Anda perlu kode Anda sesingkat mungkin.

Sekarang untuk beberapa pelatihan di tempat kerja.

Pekerjaan Anda

Tulis program lengkap yang membaca perintah dari STDIN atau fungsi yang mendapat urutan string tunggal sebagai input. Taco dicetak ke STDOUT, dibuat sesuai pesanan.

Menerima pesanan

Pelanggan akan memberi Anda pesanan mereka melalui STDIN atau argumen fungsi. Pesanan akan dalam bentuk daftar topping yang diinginkan koma-dibatasi. Urutan pemberian topping menentukan urutan kemunculannya di taco, dengan topping yang terdaftar pertama di bagian bawah dan yang terakhir di atas. Inilah yang kami simpan:

  • kacang polong
  • Nasi
  • Sayuran
  • Selada
  • guacamole
  • Krim asam
  • salsa

Pelanggan dapat memesan sedikitnya 1 topping tetapi tidak lebih dari 5 topping. Topping tidak perlu berbeda.

Anda dapat berasumsi bahwa pelanggan sudah familiar dengan menu sebelum memesan dan dengan demikian semua pesanan hanya akan mengandung bahan yang kami stok. Artinya, input akan selalu valid.

Melayani taco

Pelanggan meminta taco mereka dicetak ke STDOUT. Mereka baik-baik saja dengan ruang putih terkemuka atau tertinggal dalam makanan mereka.

Riset pasar menunjukkan bahwa semua orang ingin makan taco sebagai kata-kata, dan kata-kata dalam semua topi jauh lebih beraroma. Dengan demikian kami akan membuat daftar topping di SEMUA CAPS tanpa spasi.

Untuk kepentingan presentasi yang artistik, kita tidak bisa begitu saja memasukkan barang-barang ke dalam tortilla dan menyebutnya bagus, kita harus dengan lembut meletakkan topping dari kiri ke kanan, membungkus dan mengulangi sesuai kebutuhan. Setiap topping mendapatkan minimal 2 baris untuk dirinya sendiri. Ini semua akan menjadi lebih jelas setelah kami memeriksa piring sampel.

Piring sampel

Mari kita lihat beberapa pesanan sampel.

Pesanan pelanggan: Beans,Veggies,Rice,Lettuce,Sour Cream

Kami mengirimkan:

   SOUR
  CREAMS
T LETTUC L
O ELETTU I
R RICERI T
T CERICE R
I VEGGIE O
L SVEGGI T
L BEANSB A
 A EANS L
  TORTIL

Terlihat sangat enak, bukan? Topping membungkus setelah 6 karakter ke baris baru dan diulang untuk masing-masing mengisi 2 baris, terpotong menjadi 12 karakter. Bahan pertama mendapat 6 karakter pada baris teratas tetapi hanya 4 pada baris kedua. Ini memastikan bahwa itu pas di lipatan tortilla. Demikian pula, bahan terakhir selalu mendapat 4 karakter di baris teratas dan 6 di kedua.

Apa yang terjadi jika pelanggan memesan dua topping yang sama berturut-turut? Terus bungkus bahan itu untuk semua baris berturut-turut bahan itu.

Pesanan pelanggan: Lettuce,Lettuce,Lettuce,Salsa

Kami mengirimkan:

T  SALS  L
O ASALSA I
R LETTUC T
T ELETTU R
I CELETT O
L UCELET T
L TUCELE A
 A TTUC L
  TORTIL

Pesanan pelanggan: Guacamole

T        L
O        I
R        T
T        R
I        O
L  GUAC  T
L AMOLEG A
 A UACA L
  TORTIL

Hanya satu bahan? Berikan nilai 4 karakter tambahan di atas.

Karyawan bulan ini


Selamat memasak!

Alex A.
sumber

Jawaban:

3

JavaScript (ES6), 269 263 byte

x=>eval('x=x.split`,`;p=o="";for(i=10;i--;){t=x[1]?x[i/2|0]:x[i>2|0];t!=p?r=(n=0,t?t.replace(s=" ",""):s).toUpperCase().repeat(99):0;m=r.slice(n,n+=p&&i?6:4);p&&i?0:m=s+m+s;p=t;o+=(i>7?t?s+s+m:"":i?"TORTILL"[7-i]+s+m+s+"LITROTA"[7-i]:` A${m}L`)+`\n`}')+"  TORTIL"

Penjelasan

x=>
  eval('                                          // use eval to save writin return and {}
    x=x.split`,`;                                 // convert ingredients to an array
    p=                                            // p = previous ingredient
      o="";                                       // o = output text
    for(i=10;i--;){                               // loop from top to bottom of taco
      t=x[1]?x[i/2|0]                             // t = ingredient text
        :x[i>2|0];                                // start a line early if 1 ingredient
      t!=p?r=                                     // r = repeated ingredient text
        (n=0,                                     // n = current index in repeated text
        t?t.replace(s=" ",""):s)                  // get the ingredient (or space)
        .toUpperCase().repeat(99):0;              // upper-case and repeat the ingredient
      m=r.slice(n,n+=p&&i?6:4);p&&i?0:m=s+m+s;    // m = text in the middle of the taco
      p=t;                                        // set p to current ingredient

      // Add the appropriate output
      o+=(i>7?t?s+s+m:"":i?"TORTILL"[7-i]+s+m+s+"LITROTA"[7-i]:` A${m}L`)+`\n`

    }                                             // implicit: eval returns o
  ')+"  TORTIL"                                   // return the output text

Uji

pengguna81655
sumber
Sebagai jawaban terpendek di akhir periode hadiah, Anda menerima hadiah +50! Dan sebagai jawaban terpendek dari dua jawaban yang diposting seminggu setelah pertanyaan diposting, Anda memenangkan tanda centang yang diidamkan. Kerja bagus dan terima kasih telah berpartisipasi! :)
Alex A.
6

Python 3, 475 byte

n=range
s=input().upper().replace(" ","").split(",")[::-1]
s=sum(zip(s,s),tuple())
t=""
p=0
l=len(s)
if l==2:q=s[0];s=[q,q,q];l=3
r=[]
e=" "
f=e*4
d=[f," AL ","L  A","L  T","I  O","T  R","R  T","O  I","T  L",f,f]
for i in n(l):
 h=s[i]
 c=6
 a=""
 if i==0 or i==l-1:c=4
 if t!=h:
  p=0
  t=h
 for x in n(0,c):
  a+=h[p]
  p+=1
  if p==len(h):
   p=0
 if c==4:a=e+a+e
 r+=[a]
r=["TORTIL"]+r[::-1]
for i in n(0,11):
 y=10-i
 x=d[y]
 m=e*6
 if y<=l:m=r[y]
 print(x[:2]+m+x[2:])

Mungkin terlalu lama, tetapi saya mungkin juga memposting sesuatu!

vpzomtrrfrt
sumber
Saya pikir Anda bisa menggantinya r=(r+["TORTIL"])[::-1]dengan r=["TORTIL"]+r[::-1]. range(0,l)bisa juga range(l).
lirtosiast
1. Stack Exchange mengganti tab dengan empat spasi, jadi sulit untuk memverifikasi skor Anda apa adanya. Setelah mengganti mereka, saya hitung 482. 2. Anda dapat menghemat spasi dengan menempatkan, misalnya, if l==2:q=s[0];s=[q,q,q];l=3pada satu baris. 3. n(l)melakukan hal yang sama dengan n(0,l).
Dennis
@ Dennis ada yang bisa saya lakukan tentang # 1?
vpzomtrrfrt
1
Anda bisa menggunakan satu ruang alih-alih tab. Python 3 tidak memungkinkan untuk mencampurkannya.
Dennis
Oke, saya sudah menerima saran Anda dan membuatnya sedikit lebih pendek.
vpzomtrrfrt
4

Ruby, 376 375 368 363 362 byte

->a{p='ALLITROT'.chars
s='LATORTIL'.chars
t=['  TORTIL']
c=[*a.split(?,).chunk(&:upcase)]
c.map.with_index{|x,i|n=x[1].size*2
w=x[0].tr(' ','')*9*n
[n+=i==0?1:0,w.sub!(/..../,' \0 ')]if i==c.size-1
w.chars.each_slice(6).take(n).reverse.map{|l|t=["#{p.shift||' '} #{l*''} #{s.shift||' '}"]+t}}
p.map{|x|t=[x+' '*8+s.shift]+t}
t[-2].sub! /(.{6})../,' \1'
t.join$/}

Masih dalam proses.

(Bonus: Bekerja dengan topping sebanyak yang Anda inginkan, bukan hanya 5. Kebanyakan karena saya tidak melihat aturan itu pada awalnya> _ <)

Versi tidak disatukan:

#!/usr/bin/env ruby

def make_taco ingredients
    # These three variables make up the tortilla.
    prefixes = 'ALLITROT'.chars
    suffixes = 'LATORTIL'.chars
    taco = ['  TORTIL']
    # .chunk is a Ruby builtin that's *incredibly* useful for this challenge.
    chunks = ingredients.split(',').chunk{|x| x}.to_a
    # Loop through every chunk of equal ingredients.
    chunks.each_with_index do |ingredient, idx|
        # Get the number of lines the group of ingredients should take up.
        count = ingredient[1].length * 2
        # *9 because that's guaranteed to be enough ingredient.
        wrapped = ingredient[0].upcase.sub(' ','') * 9 * count
        # If this is the last element...
        if idx == chunks.length - 1
            # Add spaces strategically to position the top "layer."
            wrapped.sub! /..../, ' \0 '
            # If this is also the first element...
            if idx == 0
                # We need to make one more row.
                count += 1
            end
        end
        # Arrange the ingredient like so, and then for each "layer"...
        wrapped.chars.each_slice(6).take(count).reverse.each do |line|
            # Add it to the taco, along with prefixes/suffixes if they exist.
            taco.push "#{prefixes.shift || ' '} #{line * ''} " +
                "#{suffixes.shift || ' '}"
        end
    end
    # Fill in the rest of the prefixes and suffixes we didn't use.
    prefixes.each do |prefix|
        taco.push prefix + ' ' * 8 + suffixes.shift
    end
    # Fix the "offset" on the second-to-last line.
    taco[1].sub! /(.{6})../, ' \1'
    # Since we've been building the taco bottom-up, reverse, join, and return.
    taco.reverse.join("\n")
end

puts make_taco 'Beans,Veggies,Rice,Lettuce,Sour Cream'
puts
puts make_taco 'Lettuce,Lettuce,Lettuce,Salsa'
puts
puts make_taco 'Guacamole'
Gagang pintu
sumber