Тема мого дня народження: у вогні


18

Мені потрібно запалити кілька свічок. Насправді мені потрібно запалити довільну кількість свічок. Але тільки хороші.

ЗАВДАННЯ Враховуючи блок тексту (містить запалені, дійсні та недійсні свічки) та число Nв якості введення, напишіть програму або функцію, яка запалює кількість, рівно рівну Nмінус кількості вже запалених свічок. Якщо Nбільша кількість дійсних свічок, програма повинна надрукувати кількість відсутніх дійсних свічок. Якщо свічок немає, вихід повинен бути :(.

Ось кілька дійсних свічок:

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

(закінчується символом a ., що містить лише |або збалансований, не обов'язково сусідній \і /може бути будь-якої довжини.)

Ось кілька недійсних свічок:

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

(незбалансований \, без палички свічок, відключений, не |символів, не посаджений на землю.)

Запалена свічка замінить .дійсну свічку будь-яким із наступних символів (на ваш вибір):

@ ^ & " ~

Ви повинні використовувати хоча б один, і ви отримуєте -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: :(

Табло лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

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

Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш результат становить суму двох файлів або ви хочете окремо вказати штрафні санкції для перекладача), переконайтесь, що фактичний результат - це останнє число у заголовку:

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

Ви також можете зробити ім'я мови посиланням, яке потім з’явиться у фрагменті таблиць лідерів:

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


О, і це мій день народження.
Conor O'Brien

10
З Днем Народження!
Рівень р. Св.

@steveverrill Спасибі ^ _ ^
Conor O'Brien

Чи можемо ми припустити, що на вході є пробіли, щоб утворити прямокутник?
Downgoat

Відповіді:


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-е місце!
Conor O'Brien

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,  
. . .

. .      .
| |      |

. . .     

🔥 ~      "
| |      |

Чи можете ви редагувати, щоб уточнити рахунок до і після бонусів, і чи підрахунок байтів з коментарями чи ні?
Conor O'Brien

Я намагаюся подати гольф далі. І я хочу спробувати версію Pyth.
користувач193661

1
Класно! Спасибі. Успіхів з Pyth! ^ _ ^
Conor O'Brien

1
Чому б вам не позбутися всіх коментарів, нових рядків тощо?
РК.

Ви можете позбутися від біта "більше необхідних свічок"; таким чином вважається числовий вихід.
Conor O'Brien

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 встановлюють одну змінну (змінну kв рядок, replaceщоб зберегти кілька байтів) і голяють 11 байтів з 339-байтової рядки, яку я не можу скасувати як:

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

Оскільки приклад запиту вводу / виводу був запитаний, тут був тестовий набір, яким я керував,

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

Якийсь приклад I / OS?
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ додано.
CR Drost
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.