Tema ulang tahun saya: terbakar

18

Saya perlu menyalakan lilin. Sebenarnya, saya perlu menyalakan lilin dengan jumlah sewenang - wenang . Tapi hanya yang bagus.

TUJUAN Diberikan blok teks (berisi lilin menyala, valid, dan tidak valid) dan angka Nsebagai input, tulis sebuah program atau fungsi yang menerangi jumlah yang sama persis dengan N, dikurangi jumlah lilin yang sudah menyala. Jika Nlebih besar dari jumlah lilin yang valid, program harus mencetak jumlah lilin yang hilang dan valid. Jika tidak ada lilin, output seharusnya :(.

Berikut ini beberapa lilin yang valid:

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

(diakhiri dengan ., hanya mengandung |atau seimbang, tidak selalu berdampingan \dan /, bisa panjang).

Berikut ini beberapa lilin yang tidak valid:

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

(tidak seimbang \, tidak ada lilin, terputus, non- |karakter, tidak ditanam di tanah.)

Lilin yang menyala akan menggantikan lilin yang menyala .dengan salah satu karakter berikut (pilihan Anda):

@ ^ & " ~

Anda harus menggunakan setidaknya satu, dan Anda mendapatkan -10%bonus untuk setiap karakter yang digunakan dalam program Anda, sedemikian rupa sehingga setiap karakter dapat muncul pada lilin yang menyala. Jika Anda menggunakan 🔥emoji, Anda mendapatkan -15bonus byte, yang diterapkan sebelum persentase bonus, jika digunakan. COUNT BYTE DITUNDANG KE BAWAH!

Ini adalah , jadi kode terpendek dalam byte menang.

Contoh 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: :(

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

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

Conor O'Brien
sumber
Oh, dan ini hari ulang tahunku.
Conor O'Brien
10
Selamat ulang tahun!
Level River St
@steveverrill Terima kasih ^ _ ^
Conor O'Brien
Bisakah kita menganggap input diisi dengan spasi untuk membentuk persegi panjang?
Downgoat
@vihan Suka ini?
Conor O'Brien

Jawaban:

4

Haskell, ⌊ (269 byte - 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

Contoh dijalankan:

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

Asumsikan bahwa setiap baris input setidaknya sepanjang baris sebelumnya, sebagaimana diizinkan oleh salah satu komentar penulis.

Anders Kaseorg
sumber
Sepertinya kita memiliki tempat 1 yang baru!
Conor O'Brien
5

Python 2, 529 byte dengan bonus, 303

  • Diasumsikan bahwa baris pertama memiliki bilangan bulat di atasnya.
  • Tidak menganggap spasi yang konsisten. Tidak menganggap kolom lilin kosong.

Strategi:

  • Dapatkan input sebagai daftar.
  • Balikkan dan petakan ke daftar kolom.
  • Uji dan operasikan.
  • Petakan kembali menjadi baris, balikkan, bergabung dengan garis.

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

Tes:

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

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

3,
. . .       
| \ |

1 more candles required

3,  
. . .

. .      .
| |      |

. . .     

🔥 ~      "
| |      |
pengguna193661
sumber
Bisakah Anda mengedit untuk mengklarifikasi skor sebelum dan sesudah bonus, dan apakah byte-count adalah dengan atau tanpa komentar?
Conor O'Brien
Saya mencoba bermain golf lebih lanjut. Dan saya ingin mencoba versi Pyth.
user193661
1
Keren! Terima kasih. Semoga beruntung dengan Pyth! ^ _ ^
Conor O'Brien
1
Mengapa Anda tidak menyingkirkan semua komentar, baris baru, dll.?
RK.
Anda dapat menyingkirkan bit `lebih banyak lilin yang diperlukan`; output numerik diasumsikan demikian.
Conor O'Brien
3

JavaScript (ES6), 328 byte (skor: 184)

Saya mencoba untuk mengalahkan solusi Haskell tapi itu sebenarnya entri yang cukup kompetitif mengingat semua logika yang perlu terjadi.

Skor dihitung sebagai Math.floor((328-15)*Math.pow(0.9,5)):, byte dihitung dalam file dengan pengkodean UTF-8, diuji dan dikonfirmasi dengan io.js --harmony_arrow_functions.

Solusi :

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'))

Persyaratan : array harus berlapis ruang menjadi persegi panjang.

Penjelasan : semua eval insanity menetapkan satu variabel (variabel kke string replaceuntuk menyimpan beberapa byte) dan mencukur 11 byte dari string 339-byte, yang dapat saya batalkan golf seperti:

(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(/\@/,'🔥')
}

Karena contoh I / Os diminta, inilah test suite yang saya jalankan,

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:
:(
CR Drost
sumber
Beberapa contoh I / OS?
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ menambahkan.
CR Drost