프로그래밍 퍼즐 및 타코 트럭


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

자바 스크립트 (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

파이썬 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. 스택 교환은 탭을 4 개의 공백으로 대체하므로 점수를 그대로 확인하기가 어렵습니다. 그것들을 다시 바꾼 후, 나는 482를 센다 if l==2:q=s[0];s=[q,q,q];l=3. 3. n(l)와 동일합니다 n(0,l).
Dennis

@Dennis # 1에 대해 할 수있는 일이 있습니까?
vpzomtrrfrt

1
탭 대신 단일 공간을 사용할 수 있습니다. 파이썬 3은 어쨌든 혼합을 허용하지 않습니다.
Dennis

좋아, 나는 당신의 제안을 받아 약간 짧게 만들었습니다.
vpzomtrrfrt 2016

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

여전히 진행중인 작업입니다.

(Bonus : 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.