Программирование головоломок и Taco Truck


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).
Деннис

@ Денис, я могу что-то сделать с # 1?
vpzomtrrfrt

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

Хорошо, я принял ваши предложения и сделал его немного короче.
vpzomtrrfrt

4

Ruby, 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.