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


18

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

ЦЕЛЬ Учитывая заданный блок текста (содержащий зажженные, действительные и недействительные свечи) и число в Nкачестве входных данных, напишите программу или функцию, которая зажигает количество, точно равное Nминус количество уже зажженных свечей. Если Nколичество допустимых свечей больше, программа должна напечатать количество пропущенных, действительных свечей. Если свечей нет, вывод должен быть :(.

Вот несколько действительных свечей:

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

(оканчивающийся на ., содержащий только |или сбалансированный, не обязательно смежный \и /, может иметь любую длину.)

Вот несколько недействительных свечей:

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

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

Зажженная свеча заменит .действующую свечу любым из следующих символов (на ваш выбор):

@ ^ & " ~

Вы должны использовать хотя бы один, и вы получите -10%бонус за каждого персонажа, используемого в вашей программе, таким образом, что каждый персонаж может появиться на зажженной свече. Если вы используете 🔥эмодзи, вы получаете -15байтовый бонус, который применяется перед процентными бонусами, если они используются. Байт-счет округляется вниз!

Это , поэтому выигрывает самый короткий код в байтах.

Пример IOs

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

Leaderboards

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# 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


О, и это мой день рождения.
Конор О'Брайен

10
С Днем Рождения!
Уровень Река St

@steveverrill Спасибо ^ _ ^
Конор О'Брайен

Можем ли мы предположить, что ввод дополнен пробелами для формирования прямоугольника?
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-е место!
Конор О'Брайен,

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
Здорово! Благодарю. Удачи с Пифом! ^ _ ^
Конор О'Брайен

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 устанавливает одну переменную (переменную 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?
Конор О'Брайен

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