私の誕生日のテーマ:炎の中で


18

キャンドルを灯す必要があります。実際、私は任意の量のキャンドルを灯す必要があります。しかし、良いものだけ。

目的テキストのブロック(点灯、有効、無効のろうそくを含む)とN入力としてN数値を指定し、に既に点灯しているろうそくの数を引いた値に正確に等しい量を点灯するプログラムまたは関数を作成します。Nが有効なローソク足の数よりも大きい場合、プログラムは不足している有効なローソク足の数を出力する必要があります。ローソクが存在しない場合、出力はになります:(

有効なキャンドルは次のとおりです。

.   
|   .       .
|   |   .   \
|   |   |   /

(末尾が、.のみ、|またはバランスがとれている、必ずしも隣接\していない/、および、任意の長さにすることができます。)

無効なキャンドルは次のとおりです。

.       .   .   .
\       |   |   |
|           |   |
\   .   |   !   

(アンバランス\、ローソク足なし、切断された、|キャラクター以外、地面に植えられていない。)

ろうそくが点灯する.と、有効なろうそくの次の文字(任意)で置き換えられます。

@ ^ & " ~

少なくとも1つを使用する必要があり-10%、プログラムで使用されている各キャラクターに対して、各キャラクターが点灯したろうそくに現れるようにボーナスを獲得します。🔥絵文字を使用すると、-15バイトボーナスが得られます。これは、使用されている場合、パーセンテージボーナスの前に適用されます。バイトカウントが削減されました!

これはであるため、バイト単位の最短コードが優先されます。

IOの例

input: 8,
.         .
| . ! . . |.  . . .
| | | | | | | | | |
output:
@         @
| @ ! @ @ |.  @ @ @
| | | | | | | | | |
input: 14,
   // nothing
output: :(
input: 15,
.   ..  . .  ". .
| . ||  | |  || !
output: 9 // more candles required; 15 - (6 unlit) = 9 (thanks to @AndersKaseorg for catching my mistakes (plural)!)
input: 7,
.
/        ~
|        \  .
/  &   " /  |
\  | @ | | . . . . .
\  | | | | | 1 l I |
output: 
&
/        ~
|        \  .
/  &   " /  |
\  | @ | | ^ . . . 🔥
\  | | | | | 1 l I |
input: 5,
. .             |
i Q no candl es . |3-.
output: :(

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

# Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

# Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


ああ、それは私の誕生日です。
コナーオブライエン

10
お誕生日おめでとうございます!
レベルリバーセント

@steveverrillありがとう^ _ ^
コナーオブライエン

入力がスペースで埋められて長方形を形成すると仮定できますか?
ダウンゴート

@vihanこんな感じ
コナーオブライエン

回答:


4

Haskell、⌊(269バイト− 15)・0.9⁵⌋= 149

h('.',0)(e:f,c,o)=(f,2:c,e:o)
h(k,b)(f,c,o)|Just x<-lookup k$zip"\\|/"[4,0..]=(f,x+2*div b 2:c,k:o)|0<1=(f,2:c,k:o)
g l(f,c,o)=foldr h(f,[],'\n':o)$zip l c
d("",_,o)=o
d('@':_,_,_)=":("
d(f,_,_)=show$length f
f n=d.foldr g(take n$'@':cycle"🔥^&\"~",repeat 1,"").lines

実行例:

*Main> putStr s
.
/        ~
|        \  .
/  &   " /  |
\  | @ | | . . . . .
\  | | | | | 1 l I |
*Main> putStr (f 3 s)
^
/        ~
|        \  .
/  &   " /  |
\  | @ | | 🔥 . . . @
\  | | | | | 1 l I |

作成者のコメントの1つで許可されているように、各入力行が少なくとも前の行と同じ長さであると想定します。


新しい1位になりました!
コナーオブライエン

5

Python 2、529バイト、ボーナス、303

  • 最初の行に整数があると仮定します。
  • 一定の間隔を想定していません。ローソク足の列が空であるとは仮定しません。

戦略:

  • リストとして入力を取得します。
  • 逆にして、列のリストにマップします。
  • テストと操作。
  • 行にマップし直し、逆にし、行を結合します。

import re;R=raw_input;C=str.count;G=lambda x:[y if y else' 'for y in x];H=lambda x:[''.join(G(v))for v in map(None,*x)];F=re.findall;t,r,i,g,d=0,u"🔥~\"&^@",[],r'^[|/\\]+[%s](?=\s|$)',R()
while d:i+=[d];d=R()
c=int(F('\d+',i.pop(0))[0]);i=i[::-1];m=H(i)
t+=sum(1 for x in m if F(g%r,x))
for p,n in enumerate(m):
 try:b=F(g%'\.',n)[0]
 except:continue
 if C(b,'/')==C(b,'\\')and t<c:t+=1;m[p]=re.sub('\.',r[0],n,1)
 if len(r)>1:r=r[1:]
m='\n'.join(H(m)[::-1])
d=":("if t<1 else`c-t`+" more candles required"if t<c else m;print d

テスト:

5,
*      *               *
  *        *
*
                 *
@     @       @     @
|     |   .   |     |
|     |   |   |     |

*      *               *
  *        *            
*                       
                 *      
@     @       @     @   
|     |   🔥  |     |   
|     |   |   |     |   

3,
. . .       
| \ |

1 more candles required

3,  
. . .

. .      .
| |      |

. . .     

🔥 ~      "
| |      |

ボーナスの前後にスコアを明確にするために編集できますか?また、バイトカウントがコメント付きかコメントなしであるかを編集できますか?
コナーオブライエン

さらにゴルフをしようとしています。そして、Pythバージョンを試してみたい。
user193661

1
涼しい!ありがとう。Pythで頑張ってください!^ _ ^
コナーオブライエン

1
すべてのコメント、改行などを削除してみませんか?
RK。

「もっとキャンドルが必要」のビットを取り除くことができます。そのため、数値出力が想定されます。
コナーオブライエン

3

JavaScript(ES6)、328バイト(スコア:184)

Haskellソリューションを打ち負かそうとしましたが、実際に発生する必要のあるすべてのロジックを考えると、それは実際にはかなり競争力のあるエントリです。

次のように計算されたスコア:Math.floor((328-15)*Math.pow(0.9,5))UTF-8エンコーディングのファイルでカウントされたバイト、io.js --harmony_arrow_functions

解決策

eval("(n,s)=>{q=x=>x[0].map((_,c)=>x#[c]));h='Q';c=5;t=n;m=q(s.split('\\n')X#.match(/^ *[Q][\\\\//|]+$/)&&xR\\L==xR/L&&t-->0?xR./,c>1?h[c--]:'@'):x);return t==n?':(':t>0?1+t:q(mX.join('\\n')R@/,'🔥')}"[k='replace'](/[A-Z]/g,x=>({X:"#.split('')))#.join(''))",R:"[k](/\\",Q:'.@^&"~',L:"/g,'').length"}[x]))[k](/#/g,'.map(x=>x'))

要件:配列は、長方形になるようにスペースが埋め込まれている必要があります。

説明:すべてのevalの狂気が1つの変数(変数kreplaceいくつかのバイトを保存するための文字列へのを、339バイトの文字列から11バイト削ります。

(num_candles_desired, string) => {
    transpose = array => array[0].map((_, index) => array.map(row => row[index]));
    candle_tips = '.@^&"~';
    c = 5; // decrementing index into candle_tips when > 1.
    candles_left = num_candles_desired;
    transposed_normal_output = transpose(
            string.split('\n').map(line => line.split(''))
        ).map(col_array => col_array.join(''))
         // the next map does the actual logic: finds possible candles with
         // a regex, checks that the \ chars match the / chars in number,
         // then decrements the candles_left index while changing the . to a
         // lit flame.
         .map(col => col.match(/^ *[.@^&"~][\\//|]+$/) 
                   && col.replace(/\\/g,'').length == col.replace(/\//g,'').length
                   && candles_left-- > 0 ? x.replace(/\./, c > 1 ? candle_tips[c--] 
                                                                 : '~')
                                         : x);
    return candles_left == num_candles_desired ? ':('
                  : candles_left > 0 ? 1 + candles_left 
                  : transpose(
                        transposed_normal_output.map(col => col.split(''))
                    ).map(row_array => row_array.join('')).join('\n')
                     // as promised, we include the emoji at least once if we can.
                     // the leading backslash is unnecessary and comes from the
                     // above metaprogramming-compression with eval().
                     .replace(/\@/,'🔥')
}

サンプルI / Oが要求されたため、ここで実行したテストスイートを示しました。

Reference example #1, lighting 8 candles...
Input:
.         .        
| . ! . . |.  . . .
| | | | | | | | | |
Output:
~         🔥        
| " ! & ^ |.  @ @ @
| | | | | | | | | |
Reference example #2, lighting 14 candles...
Input:

Output:
:(
Reference example #3, lighting 15 candles...
Input:
.   ..  . .  ". .
| . ||  | |  || !
Output:
9
Reference example #4, lighting 7 candles...
Input:
.                   
/        ~          
|        \  .       
/  &   " /  |       
\  | @ | | . . . . .
\  | | | | | 1 l I |
Output:
~                   
/        ~          
|        \  .       
/  &   " /  |       
\  | 🔥 | | @ . . . @
\  | | | | | 1 l I |
Reference example #5, lighting 5 candles...
Input:
. .             |     
i Q no candl es . |3-.
Output:
:(


1
@CᴏɴᴏʀO'Bʀɪᴇɴが追加されました。
CR Drost
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.