Chủ đề sinh nhật của tôi: lên ngọn lửa


18

Tôi cần phải thắp vài ngọn nến. Trong thực tế, tôi cần phải thắp một lượng nến tùy ý . Nhưng chỉ những người tốt.

MỤC TIÊU Cho một khối văn bản (chứa nến sáng, hợp lệ và không hợp lệ) và một số Nlàm đầu vào, hãy viết chương trình hoặc chức năng chiếu sáng một lượng chính xác bằng N, trừ đi số lượng nến đã được thắp sáng. Nếu Nlớn hơn số nến hợp lệ, chương trình sẽ in số nến bị thiếu, hợp lệ. Nếu không có nến, đầu ra nên được :(.

Dưới đây là một số nến hợp lệ:

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

(kết thúc bằng a ., chỉ chứa |hoặc cân bằng, không nhất thiết phải liền kề \/, có thể có độ dài bất kỳ.)

Dưới đây là một số nến không hợp lệ:

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

(không cân bằng \, không có cây nến, ngắt kết nối, không |ký tự, không được trồng trên mặt đất.)

Một ngọn nến được thắp sáng sẽ thay thế .một cây nến hợp lệ bằng bất kỳ ký tự nào sau đây (sự lựa chọn của bạn):

@ ^ & " ~

Bạn phải sử dụng ít nhất một và bạn nhận được -10%phần thưởng cho mỗi nhân vật được sử dụng trong chương trình của mình, theo cách mà mỗi nhân vật có thể xuất hiện trên một ngọn nến được thắp sáng. Nếu bạn sử dụng 🔥biểu tượng cảm xúc, bạn sẽ nhận được -15phần thưởng byte, được áp dụng trước phần thưởng phần trăm, nếu được sử dụng. QUẬN BYTE ĐANG TẢI XUỐNG!

Đây là một , vì vậy mã ngắn nhất tính bằng byte sẽ thắng.

IOs ví dụ

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

Bảng xếp hạng

Dưới đây là một Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành một liên kết mà sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

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


Ồ, và đó là sinh nhật của tôi.
Conor O'Brien

10
Chúc mừng sinh nhật!
Cấp sông St

@steveverrill Cảm ơn ^ _ ^
Conor O'Brien

Chúng ta có thể giả sử đầu vào được đệm bằng khoảng trắng để tạo thành một hình chữ nhật không?
Downgoat

Câu trả lời:


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

Chạy ví dụ:

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

Giả sử rằng mỗi dòng đầu vào ít nhất bằng dòng trước đó, như được cho phép bởi một trong những nhận xét của tác giả.


Hình như chúng ta có một vị trí số 1 mới!
Conor O'Brien

5

Python 2, 529 byte có thưởng, 303

  • Giả sử rằng dòng đầu tiên có một số nguyên trên đó.
  • Không giả định khoảng cách nhất quán. Không cho rằng cột nến là trống rỗng.

Chiến lược:

  • Lấy đầu vào là danh sách.
  • Đảo ngược nó và ánh xạ nó vào một danh sách các cột.
  • Kiểm tra và vận hành.
  • Ánh xạ nó trở lại thành hàng, đảo ngược nó, tham gia các dòng.

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

Các xét nghiệm:

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

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

3,
. . .       
| \ |

1 more candles required

3,  
. . .

. .      .
| |      |

. . .     

🔥 ~      "
| |      |

Bạn có thể chỉnh sửa để làm rõ điểm số trước và sau phần thưởng không, và liệu số đếm byte có hay không có ý kiến?
Conor O'Brien

Tôi đang cố gắng chơi gôn hơn nữa. Và tôi muốn thử một phiên bản Pyth.
dùng193661

1
Mát mẻ! Cảm ơn. Chúc may mắn với Pyth! ^ _ ^
Conor O'Brien

1
Tại sao bạn không loại bỏ tất cả các ý kiến, dòng mới, v.v.?
RK.

Bạn có thể thoát khỏi bit `nhiều nến hơn '; một đầu ra số được giả định là như vậy.
Conor O'Brien

3

JavaScript (ES6), 328 byte (điểm: 184)

Tôi đã cố gắng đánh bại giải pháp Haskell nhưng đó thực sự là một mục khá cạnh tranh với tất cả logic cần phải xảy ra.

Điểm được tính là : Math.floor((328-15)*Math.pow(0.9,5)), byte được tính trong một tệp có mã hóa UTF-8, được kiểm tra và xác nhận với io.js --harmony_arrow_functions.

Giải pháp :

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

Yêu cầu : mảng phải được đệm không gian để có hình chữ nhật.

Giải thích : tất cả sự điên rồ của eval đều đặt một biến (biến kthành chuỗi replaceđể lưu một số byte) và loại bỏ 11 byte khỏi chuỗi 339 byte, mà tôi có thể hủy đánh gôn thành:

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

Vì ví dụ I / Os được yêu cầu, đây là bộ thử nghiệm tôi đã chạy,

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

Một số ví dụ I / OS?
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ đã thêm.
CR Drost
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.