Tema do meu aniversário: em chamas

18

Eu preciso acender algumas velas. Na verdade, preciso acender uma quantidade arbitrária de velas. Mas apenas os bons.

OBJETIVO Dado um bloco de texto (contendo velas acesas, válidas e inválidas) e um número Ncomo entrada, escreva um programa ou função que acenda uma quantidade exatamente igual a N, menos o número de velas já acesas. Se Nfor maior que o número de velas válidas, o programa deverá imprimir o número de velas válidas ausentes. Se não houver velas, a saída deve ser :(.

Aqui estão algumas velas válidas:

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

(terminando com a ., contendo apenas |ou equilibrado, não necessariamente adjacente \e /pode ter qualquer comprimento).

Aqui estão algumas velas inválidas:

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

(desequilibrado \, sem palito de vela, desconectado, sem |caracteres, não plantado no chão.)

Uma vela acesa substituirá a .vela válida por qualquer um dos seguintes caracteres (sua escolha):

@ ^ & " ~

Você deve usar pelo menos um e ganha um -10%bônus por cada personagem usado no seu programa, de modo que cada personagem possa aparecer em uma vela acesa. Se você usar o 🔥emoji, receberá um -15bônus de byte, que é aplicado antes dos bônus de porcentagem, se usado. A contagem de bytes é arredondada para baixo!

Este é um , portanto o código mais curto em bytes vence.

Exemplos de veiculação

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

Classificação

Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

# Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:

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

Você também pode transformar o nome do idioma em um link que será exibido no snippet da tabela de classificação:

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

Conor O'Brien
fonte
Ah, e é meu aniversário.
Conor O'Brien
10
Feliz Aniversário!
Level River St
@steveverrill Obrigado ^ _ ^
Conor O'Brien
Podemos assumir que a entrada é preenchida com espaços para formar um retângulo?
Downgoat 04/10/2015
@vihan Gosta dessa?
Conor O'Brien

Respostas:

4

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

Exemplo de execução:

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

Supõe que cada linha de entrada tenha pelo menos o comprimento da linha anterior, conforme permitido por um dos comentários do autor.

Anders Kaseorg
fonte
Parece que temos um novo 1º lugar!
Conor O'Brien
5

Python 2, 529 bytes com bônus, 303

  • Supõe que a primeira linha tenha um número inteiro.
  • Não assume espaçamento consistente. Não assume que a coluna de velas está vazia.

Estratégia:

  • Obter entrada como lista.
  • Inverta e mapeie para uma lista de colunas.
  • Teste e opere.
  • Mapeie-o novamente em linhas, inverta-o e junte-se às linhas.

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

Testes:

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

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

3,
. . .       
| \ |

1 more candles required

3,  
. . .

. .      .
| |      |

. . .     

🔥 ~      "
| |      |
user193661
fonte
Você poderia editar para esclarecer a pontuação antes e depois dos bônus e se a contagem de bytes é ou não com ou sem comentários?
Conor O'Brien
Estou tentando jogar mais golfe. E eu quero tentar uma versão Pyth.
user193661
1
Legal! Obrigado. Boa sorte com Pyth! ^ _ ^
Conor O'Brien
1
Por que você não se livra de todos os comentários, novas linhas etc.?
RK.
Você pode se livrar do bit "mais velas necessárias"; uma saída numérica é assumida como sendo assim.
Conor O'Brien
3

JavaScript (ES6), 328 bytes (pontuação: 184)

Tentei vencer a solução Haskell, mas essa é realmente uma entrada bastante competitiva, considerando toda a lógica que precisa acontecer.

Pontuação calculada como: Math.floor((328-15)*Math.pow(0.9,5))bytes contados em um arquivo com codificação UTF-8, testada e confirmada com io.js --harmony_arrow_functions.

Solução :

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

Requisitos : a matriz deve ser preenchida com espaço para ser retangular.

Explicação : toda a insanidade eval define uma variável (a variável kpara a cadeia replacede caracteres para salvar alguns bytes) e retira 11 bytes de uma cadeia de 339 bytes, que eu posso cancelar como:

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

Como foram solicitadas E / S de exemplo, aqui estava o conjunto de testes que eu executei,

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
fonte
Algum exemplo de I / OS?
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ adicionado.
CR Drost