Programlama Bulmacaları ve Taco Truck


23

Programlama Bulmacaları ve Kod Golf taco kamyonunu açtı ! Bu kelime çıktı ve şimdi Stack Exchange ağının her yerinden kullanıcılar lezzetli, otantik ASCII taco'larımızı denemeye geliyor . Herkesin siparişlerini zamanında almasını sağlamak için yardımınıza ihtiyacımız var. Yemek kamyonlarının içinde çok fazla yer yok, bu yüzden kodunuzun mümkün olduğunca kısa olması gerekiyor.

Şimdi bazı iş başında eğitim için.

Senin işin

STDIN'den bir sipariş okuyan tam bir program veya giriş olarak tek bir string sipariş alan bir fonksiyon yazın. Tacos siparişe göre STDOUT'a basılır.

Emir almak

Müşteriler siparişlerini STDIN ya da function argümanı ile verir. Siparişler, istenen süslemelerin virgülle ayrılmış listesi şeklinde olacaktır. Topinglerin verildiği sıra, tacoda göründükleri sırayı belirtir; ilk altta en üstte ve üstte en üstte olmak üzere. İşte stokta tuttuklarımız:

  • Fasulyeler
  • Pirinç
  • Sebzeler
  • Marul
  • Guacamole
  • Ekşi krema
  • Salsa

Müşteriler en az 1 en fazla 5 en fazla 5 en fazla sipariş verebilir. Topingler belirgin olmak zorunda değildir.

Sipariş vermeden önce müşterilerin menüye aşina olduklarını ve bu nedenle tüm siparişlerin yalnızca stokta bulunduğumuz içerikleri içerdiğini varsayabilirsiniz. Yani, giriş her zaman geçerli olacaktır.

Takoları servis etmek

Müşteriler tacolarının STDOUT'a basılmasını talep ediyorlar. Yiyeceklerinde bazı lider veya iz bırakan boşluklarla iyi durumdalar.

Pazar araştırması, herkesin tacoyu kelime olarak yemek istediğini ve tüm kapaklardaki kelimelerin çok daha lezzetli olduğunu göstermektedir. Bu yüzden TÜM CAPS'ta boşluksuz boşlukları listeleyeceğiz.

Sanatsal sunumun yararına, sadece bir tortillaya malzeme sokamayız ve güzel diyebiliriz, yavaşça soldan sağa devirmek, gerektiği gibi sarmak ve tekrarlamak zorunda kalacağız. Her topping kendine en az 2 satır alır. Numune tabağını incelediğimizde bunların hepsi daha netleşecektir.

Örnek tabağı

Bazı örnek siparişlere bir göz atalım.

Müşteri siparişleri: Beans,Veggies,Rice,Lettuce,Sour Cream

Biz teslim ediyoruz:

   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

Oldukça lezzetli görünüyor değil mi? Topingler 6 karakterden sonra yeni bir satıra sarılır ve her biri 2 karakter doldurarak tekrar 12 karaktere bölünür. İlk madde üst satırında 6, ikinci satırında ise 4 karakter alır. Bu tortilla katına sığmasını sağlar. Benzer şekilde, son içerik daima en üst satırında 4, ikinci sekmesinde 6 karakter alır.

Bir müşteri arka arkaya aynı ikisinden iki sipariş verirse ne olur? Bu malzemeyi, art arda gelen tüm satırlar için sarmaya devam edin.

Müşteri siparişleri: Lettuce,Lettuce,Lettuce,Salsa

Biz teslim ediyoruz:

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

Müşteri siparişleri: Guacamole

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

Sadece bir bileşen mi? Üstte 4 ekstra karakter verin.

Ayın çalışanları


Mutlu yemek!

Yanıtlar:


3

JavaScript (ES6), 269 263 bayt

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"

açıklama

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

Ölçek


Ödül süresinin sonunda en kısa cevap olarak, +50 ödülünü alırsınız! Sorunun gönderilmesinden bir hafta sonra gönderilen cevaplardan en kısa olanı, imrenilen onay işaretini kazanırsınız. Güzel iş ve katıldığınız için teşekkür ederiz! :)
Alex A.

6

Python 3, 475 bayt

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:])

Muhtemelen çok uzun, ama bir şeyler de gönderebilirim!


Sana yerini alabilir mi r=(r+["TORTIL"])[::-1]sahip r=["TORTIL"]+r[::-1]. range(0,l)ayrıca olabilir range(l).
lirtosiast

1. Stack Exchange, sekmeleri dört boşlukla değiştirir, bu nedenle puanınızı olduğu gibi doğrulamak zordur. Onları değiştirdikten sonra 482'yi sayıyorum. 2. Örneğin, if l==2:q=s[0];s=[q,q,q];l=3tek bir satıra koyarak boşluktan tasarruf edebilirsiniz . 3. n(l)aynısını yapar n(0,l).
Dennis,

@Dennis, # 1 hakkında yapabileceğim bir şey var mı?
vpzomtrrfrt

1
Sekme yerine sadece tek bir boşluk kullanabilirsiniz. Python 3 zaten onları karıştırmaya izin vermiyor.
Dennis,

Tamam, önerilerini aldım ve biraz daha kısa tuttum.
vpzomtrrfrt

4

Ruby, 376 375 368 363 362 bayt

->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$/}

Hala devam eden bir çalışma.

(Bonus: İstediğin kadar top çalma ile çalışıyor, sadece 5 değil. Çoğunlukla ilk önce bu kuralı görmedim çünkü> _ <)

Ungolfed versiyonu:

#!/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'
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.