Програмування пазлів та вантажівка Тако


23

Програмування Головоломки та Код Гольф відкрив вантажівку тако ! Слово вимкнене, і тепер користувачі з усієї мережі Stack Exchange приїжджають спробувати наші смачні, справжні ASCII тако . Нам потрібна ваша допомога, щоб усі вчасно отримали свої замовлення. Всередині вантажних автомобілів для їжі не так багато місця, тому вам знадобиться, щоб ваш код був якомога коротшим.

Тепер для навчання на роботі.

Ваша робота

Напишіть повну програму, яка зчитує замовлення зі STDIN або функцію, яка отримує єдиний порядок рядків у якості введення. Тако друкується в STDOUT, виготовляється на замовлення.

Прийом замовлень

Клієнти віддадуть вам свої замовлення через STDIN або аргумент функції. Замовлення будуть у формі списку бажаних начинок, розділених комами. Порядок, в якому надаються начинки, диктує порядок їх відображення в тако, причому перший перелічений верхній набір і останній вгорі. Ось що ми маємо на складі:

  • Квасоля
  • Рис
  • Овочі
  • Листя салату
  • Гуакамоле
  • Сметана
  • Сальса

Клієнти можуть замовити всього 1 начинку, але не більше 5 начинок. Начинки не повинні бути чіткими.

Ви можете припустити, що клієнти ознайомлюються з меню перед замовленням, і тому всі замовлення містять лише інгредієнти, які ми маємо на складі. Тобто вхід завжди буде дійсним.

Подають тако

Клієнти вимагають, щоб їхні файли були надруковані в STDOUT. Вони чудово поєднуються з деякими провідними або затримними пробілами в їжі.

Дослідження ринку показують, що всі хочуть їсти тако як слова, а слова в усіх шапках набагато смачніші. Таким чином, ми перерахуємо начинки у ВСІХ КАПАХ без пробілів.

В інтересах мистецької презентації, ми не можемо просто заплести речі в тортилью і назвати це добре, нам потрібно акуратно викласти начинки зліва направо, загортаючи і повторюючи за потребою. Кожен топінг отримує мінімум 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 на другому рядку. Це забезпечує його прилягання до складки тортилії. Так само останній інгредієнт завжди отримує 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! І як найкоротший із двох опублікованих відповідей через тиждень після того, як питання було розміщено, ви виграєте бажану галочку. Приємної роботи та спасибі за участь! :)
Олексій А.

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. Stack Exchange замінює вкладки чотирма пробілами, тому важко перевірити ваш результат таким, яким він є. Після їх повторної заміни я рахую 482. 2. Ви можете заощадити на пробілі, розмістивши, наприклад, if l==2:q=s[0];s=[q,q,q];l=3один рядок. 3.n(l) робить те саме, що і n(0,l).
Денніс

@Dennis чи є щось, що я можу зробити щодо №1?
vpzomtrrfrt

1
Ви можете просто використовувати один пробіл замість вкладки. Python 3 ні в якому разі не дозволяє їх змішувати.
Денніс

Гаразд, я прийняв ваші пропозиції і зробив це трохи коротше.
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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.