プログラミングパズルと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文字を取得しますが、2行目には4文字しかありません。これにより、トルティーヤの折り目に確実に収まります。同様に、最後の材料は常に最上行に4文字、2行目に6文字を取得します。

顧客が同じトッピングを2つ連続して注文するとどうなりますか?その成分のすべての連続した行のためにその成分をラップしてください。

顧客の注文: 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のバウンティを受け取ります!そして、質問が投稿されてから1週間後に投稿された2つの回答のうち最短のものが、切望されているチェックマークを獲得します。参加してくれてありがとう!:)
アレックス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)
リルトシアスト

1. Stack Exchangeでは、タブが4つのスペースに置き換えられているため、スコアをそのまま確認することは困難です。それらを再置換した後、私は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'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.