Lập trình câu đố và xe tải Taco


23

Lập trình Câu đố & Code Golf đã mở một chiếc xe tải taco ! Từ này được đưa ra và bây giờ người dùng từ khắp nơi trên mạng Stack Exchange đang đến để dùng thử các tacos ASCII ngon, xác thực của chúng tôi . Chúng tôi cần sự giúp đỡ của bạn để đảm bảo rằng mọi người đều nhận được đơn đặt hàng kịp thời. Không có nhiều chỗ trong các xe tải thực phẩm, vì vậy bạn sẽ cần mã của mình càng ngắn càng tốt.

Bây giờ cho một số đào tạo tại chỗ.

Công việc của bạn

Viết chương trình đầy đủ đọc một đơn đặt hàng từ STDIN hoặc một hàm nhận một đơn hàng chuỗi làm đầu vào. Tacos được in thành STDOUT, được thực hiện theo đơn đặt hàng.

Nhận đơn đặt hàng

Khách hàng sẽ cung cấp cho bạn đơn đặt hàng của họ thông qua STDIN hoặc đối số chức năng. Các đơn đặt hàng sẽ ở dạng một danh sách được phân tách bằng dấu phẩy của các lớp phủ mong muốn. Thứ tự mà các lớp phủ được đưa ra chỉ ra thứ tự xuất hiện trong taco, với thứ hạng đầu tiên được liệt kê ở phía dưới và cuối cùng ở trên cùng. Đây là những gì chúng tôi giữ trong kho:

  • Đậu
  • Cơm
  • Rau
  • Rau diếp
  • Guacamole
  • Kem chua
  • điệu Salsa

Khách hàng có thể đặt hàng ít nhất là 1 topping nhưng không quá 5 toppings. Toppings không cần phải khác biệt.

Bạn có thể cho rằng khách hàng đã quen thuộc với menu trước khi đặt hàng và do đó tất cả các đơn đặt hàng sẽ chỉ chứa các thành phần mà chúng tôi dự trữ. Đó là, đầu vào sẽ luôn luôn hợp lệ.

Phục vụ bánh taco

Khách hàng yêu cầu tacos của họ được in thành STDOUT. Chúng ổn với một số khoảng trắng hàng đầu hoặc dấu trong thực phẩm của chúng.

Nghiên cứu thị trường cho thấy mọi người đều muốn ăn tacos như lời nói, và từ trong tất cả các mũ có hương vị hơn nhiều. Do đó, chúng tôi sẽ liệt kê các lớp phủ trong TẤT CẢ CAPS không có khoảng trắng.

Vì lợi ích của việc trình bày nghệ thuật, chúng ta không thể nhét đồ vào một cái bánh ngô và gọi nó là tốt, chúng ta phải nhẹ nhàng đặt lớp phủ bên trái sang phải, gói và lặp lại khi cần thiết. Mỗi topping được tối thiểu 2 dòng cho chính nó. Tất cả điều này sẽ trở nên rõ ràng hơn khi chúng ta kiểm tra đĩa mẫu.

Mẫu đĩa

Chúng ta hãy xem một số đơn đặt hàng mẫu.

Các đơn đặt hàng của khách hàng: Beans,Veggies,Rice,Lettuce,Sour Cream

Chúng tôi cung cấp:

   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

Trông khá ngon đúng không? Các mặt trên bao bọc sau 6 ký tự thành một dòng mới và được lặp lại để điền vào mỗi dòng 2 ký tự, cắt ngắn thành 12 ký tự. Thành phần đầu tiên có 6 ký tự trên dòng trên cùng nhưng chỉ có 4 ký tự trên dòng thứ hai. Điều này đảm bảo rằng nó phù hợp với nếp gấp của tortilla. Tương tự, thành phần cuối cùng luôn có 4 ký tự trên dòng trên cùng và 6 ký tự thứ hai.

Điều gì xảy ra nếu một khách hàng đặt hai thứ trên cùng một hàng? Tiếp tục gói thành phần đó cho tất cả các dòng liên tiếp của thành phần đó.

Các đơn đặt hàng của khách hàng: Lettuce,Lettuce,Lettuce,Salsa

Chúng tôi cung cấp:

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

Các đơn đặt hàng của khách hàng: Guacamole

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

Chỉ có một thành phần? Cho thêm 4 nhân vật có giá trị trên đầu trang.

Nhân viên của tháng


Nấu ăn vui vẻ!

Câu trả lời:


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"

Giải trình

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

Kiểm tra


Là câu trả lời ngắn nhất vào cuối thời kỳ tiền thưởng, bạn nhận được tiền thưởng là +50! Và vì câu trả lời ngắn nhất trong hai câu trả lời được đăng một tuần sau khi câu hỏi được đăng, bạn sẽ giành được dấu kiểm đáng thèm muốn. Làm việc tốt và cảm ơn vì đã tham gia! :)
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:])

Có lẽ nó quá dài, nhưng tôi cũng có thể đăng một cái gì đó!


Tôi nghĩ bạn có thể thay thế r=(r+["TORTIL"])[::-1]bằng r=["TORTIL"]+r[::-1]. range(0,l)cũng có thể là range(l).
lirtosiast

1. Stack Exchange thay thế các tab bằng bốn khoảng trắng, vì vậy thật khó để xác minh điểm số của bạn. Sau khi thay thế chúng, tôi đếm 482. 2. Bạn có thể lưu vào khoảng trắng bằng cách đặt, ví dụ, if l==2:q=s[0];s=[q,q,q];l=3trên một dòng duy nhất. 3. n(l)không giống như n(0,l).
Dennis

@Dennis có điều gì tôi có thể làm về # 1 không?
vpzomtrrfrt

1
Bạn chỉ có thể sử dụng một không gian duy nhất thay vì một tab. Python 3 không cho phép trộn chúng.
Dennis

Được rồi, tôi đã thực hiện các đề xuất của bạn và làm cho nó ngắn hơn một chút.
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$/}

Vẫn là một công việc đang tiến triển.

(Phần thưởng: Hoạt động với số lượng toppings như bạn muốn, không chỉ 5. Chủ yếu là vì tôi không thấy quy tắc đó lúc đầu> _ <)

Phiên bản bị đánh cắp:

#!/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'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.