การเขียนโปรแกรมปริศนาและ Taco Truck


23

Programming Puzzles & Code Golf ได้เปิดตัวรถบรรทุกทาโก้ ! เป็นคำที่ออกมาและตอนนี้ผู้ใช้จากทั่วทุกมุมเครือข่ายการแลกเปลี่ยนชุดจะมาลองอร่อย ASCII จริงของเราทาโก้ เราต้องการความช่วยเหลือจากคุณเพื่อให้แน่ใจว่าทุกคนจะได้รับคำสั่งซื้อของพวกเขาในเวลาที่เหมาะสม ภายในห้องเก็บอาหารมีจำนวนไม่มากนักดังนั้นคุณต้องใช้รหัสของคุณให้สั้นที่สุด

ตอนนี้สำหรับการฝึกอบรมภาคปฏิบัติ

งานของคุณ

เขียนโปรแกรมเต็มรูปแบบที่อ่านคำสั่งจาก STDIN หรือฟังก์ชั่นที่ได้รับคำสั่งสตริงเดียวเป็นอินพุต Tacos ถูกพิมพ์ไปที่ STDOUT สั่งทำ

รับออเดอร์

ลูกค้าจะให้คำสั่งซื้อของคุณผ่านทาง STDIN หรืออาร์กิวเมนต์ของฟังก์ชัน คำสั่งซื้อจะอยู่ในรูปแบบของรายการที่คั่นด้วยจุลภาคของรสชาติที่ต้องการ ลำดับที่ได้รับ toppings กำหนดลำดับที่พวกเขาปรากฏในทาโก้กับรายการแรกที่ด้านบนด้านล่างและสุดท้ายอยู่ด้านบน นี่คือสิ่งที่เรามีอยู่ในสต็อก:

  • ถั่ว
  • ข้าว
  • ผัก
  • ผักกาดหอม
  • กวากาโมเล่
  • ครีม
  • ซัลซ่า

ลูกค้าสามารถสั่งซื้อเครื่องประดับ 1 ชิ้นได้ แต่ไม่เกิน 5 หน้า รสชาติไม่จำเป็นต้องแตกต่างกัน

คุณอาจสมมติว่าลูกค้าคุ้นเคยกับเมนูก่อนสั่งซื้อดังนั้นคำสั่งซื้อทั้งหมดจะมีเฉพาะส่วนผสมที่เราเก็บไว้ นั่นคืออินพุตจะถูกต้องเสมอ

เสิร์ฟทาโก้

ลูกค้าต้องการทาโก้ของพวกเขาถูกพิมพ์ไปยัง STDOUT พวกมันใช้ได้ดีกับช่องว่างชั้นนำหรือตามรอยในอาหารของพวกเขา

การวิจัยตลาดแสดงให้เห็นว่าทุกคนต้องการที่จะกินทาโก้เป็นคำและทุกคำในตัวพิมพ์ใหญ่นั้นมีรสชาติที่ดีกว่ามาก ดังนั้นเราจะแสดงรายการรสชาติใน CAPS ทั้งหมดโดยไม่มีช่องว่าง

เพื่อความสนใจในการนำเสนองานศิลปะเราไม่สามารถทำสิ่งต่างๆในตอร์ตีญาและเรียกมันว่าดีได้เราต้องวางท็อปปิ้งจากซ้ายไปขวาเบา ๆ ห่อและทำซ้ำตามต้องการ การเติมเงินแต่ละครั้งจะได้รับอย่างน้อย 2 บรรทัดสำหรับตัวเอง ทั้งหมดนี้จะชัดเจนขึ้นเมื่อเราตรวจสอบตัวอย่างแผ่นเสียง

ตัวอย่างแผ่นเสียง

ลองมาดูคำสั่งตัวอย่าง

คำสั่งซื้อของลูกค้า: Beans,Veggies,Rice,Lettuce,Sour Cream

เราส่งมอบ:

   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

ดูน่าอร่อยใช่มั้ย ท๊อปปิ้งห่อหลัง 6 ตัวอักษรไปยังบรรทัดใหม่และทำซ้ำเพื่อเติม 2 บรรทัดแต่ละบรรทัดตัดให้เหลือ 12 อักขระ ส่วนผสมแรกได้รับ 6 ตัวอักษรในบรรทัดบนสุด แต่เพียง 4 ตัวบนบรรทัดที่สอง สิ่งนี้ทำให้มั่นใจได้ว่ามันเหมาะกับการพับของ Tortilla ในทำนองเดียวกันส่วนผสมสุดท้ายมักจะได้รับ 4 ตัวอักษรในบรรทัดบนสุดและ 6 ในสองของมัน

จะเกิดอะไรขึ้นถ้าลูกค้าสั่งให้เติมเงินสองใบติดต่อกัน ห่อส่วนผสมนั้นสำหรับทุกบรรทัดที่ต่อเนื่องกันของส่วนผสมนั้น

คำสั่งซื้อของลูกค้า: Lettuce,Lettuce,Lettuce,Salsa

เราส่งมอบ:

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

คำสั่งซื้อของลูกค้า: Guacamole

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

ส่วนผสมเดียว? ให้คุณค่าพิเศษแก่ตัวละคร 4 ตัวด้านบน

พนักงานของเดือน


มีความสุขในการทำอาหาร!

คำตอบ:


3

JavaScript (ES6), 269 263 ไบต์

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"

คำอธิบาย

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

ทดสอบ


ในฐานะที่เป็นคำตอบที่สั้นที่สุดเมื่อสิ้นสุดระยะเวลาของรางวัลคุณจะได้รับความโปรดปราน +50! และเมื่อโพสต์ที่สั้นที่สุดของทั้งสองโพสต์ตอบหนึ่งสัปดาห์หลังจากที่โพสต์คำถามคุณจะชนะเครื่องหมายถูกโลภ การทำงานที่ดีและขอขอบคุณสำหรับการเข้าร่วม! :)
Alex A.

6

Python 3, 475 ไบต์

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

อาจยาวเกินไป แต่ฉันก็อาจโพสต์บางอย่าง!


ฉันคิดว่าคุณสามารถแทนที่ด้วยr=(r+["TORTIL"])[::-1] นอกจากนี้ยังสามารถ r=["TORTIL"]+r[::-1]range(0,l)range(l)
lirtosiast

1. การแลกเปลี่ยนแบบสแต็กแทนที่แท็บที่มีช่องว่างสี่ช่องจึงยากที่จะตรวจสอบคะแนนของคุณตามที่เป็น หลังจากแทนที่พวกเขาอีกครั้งฉันนับ 482 2. คุณสามารถบันทึกในช่องว่างด้วยการใส่เช่นif l==2:q=s[0];s=[q,q,q];l=3ในบรรทัดเดียว 3. ไม่เป็นเช่นเดียวกับn(l) n(0,l)
Dennis

@Dennis มีบางอย่างที่ฉันสามารถทำได้เกี่ยวกับ # 1 หรือไม่
vpzomtrrfrt

1
คุณสามารถใช้ช่องว่างเดียวแทนแท็บ Python 3 ไม่อนุญาตให้ผสมกัน
Dennis

ตกลงฉันได้รับคำแนะนำของคุณแล้วและทำให้มันสั้นลงเล็กน้อย
vpzomtrrfrt

4

ทับทิม, 376 375 368 363 362 ไบต์

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

ยังคงอยู่ระหว่างดำเนินการ

(โบนัส: ทำงานได้กับรสชาติมากเท่าที่คุณต้องการไม่ใช่แค่ 5 ส่วนใหญ่เป็นเพราะฉันไม่เห็นกฎนั้นในตอนแรก> _ <)

เวอร์ชันที่ไม่ถูกปรับแต่ง:

#!/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'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.