Tema de mi cumpleaños: en llamas

18

Necesito encender algunas velas. De hecho, necesito encender una cantidad arbitraria de velas. Pero solo los buenos.

OBJETIVO Dado un bloque de texto (que contiene velas encendidas, válidas e inválidas) y un número Ncomo entrada, escriba un programa o función que encienda una cantidad exactamente igual a N, menos el número de velas ya encendidas. Si Nes mayor que la cantidad de velas válidas, el programa debe imprimir la cantidad de velas válidas que faltan. Si no hay velas presentes, la salida debería ser :(.

Aquí hay algunas velas válidas:

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

(terminando con a ., que contiene solo |o balanceado, no necesariamente adyacente \y /puede tener cualquier longitud).

Aquí hay algunas velas inválidas:

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

(desequilibrado \, sin palo de vela, desconectado, sin |caracteres, no plantado en el suelo).

Una vela encendida reemplazará .a una vela válida con cualquiera de los siguientes caracteres (su elección):

@ ^ & " ~

Debes usar al menos uno, y obtienes una -10%bonificación por cada personaje utilizado en tu programa, de tal manera que cada personaje pueda aparecer en una vela encendida. Si usa el 🔥emoji, obtiene un -15bono de byte, que se aplica antes del porcentaje de bonos, si se usa. ¡EL CONTEO DE BYTE SE REDONDE!

Este es un , por lo que gana el código más corto en bytes.

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

Tablas de clasificación

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntuación, se puede mantener viejas cuentas en el título, golpeándolos a través. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

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

Conor O'Brien
fuente
Ah, y es mi cumpleaños.
Conor O'Brien
10
¡Feliz cumpleaños!
Level River St
@steveverrill Gracias ^ _ ^
Conor O'Brien
¿Podemos suponer que la entrada se rellena con espacios para formar un rectángulo?
Downgoat
@vihan ¿ Te gusta esto?
Conor O'Brien

Respuestas:

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

Ejemplo de ejecución:

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

Asume que cada línea de entrada es al menos tan larga como la línea anterior, según lo permitido por uno de los comentarios del autor.

Anders Kaseorg
fuente
¡Parece que tenemos un nuevo 1er lugar!
Conor O'Brien
5

Python 2, 529 bytes con bonificación, 303

  • Asume que la primera línea tiene un número entero.
  • No asume un espaciado constante. No asume que la columna de velas está vacía.

Estrategia:

  • Obtenga información como lista.
  • Invertirlo y asignarlo a una lista de columnas.
  • Probar y operar.
  • Mapearlo nuevamente en filas, invertirlo, unir las líneas.

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

Pruebas:

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

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

3,
. . .       
| \ |

1 more candles required

3,  
. . .

. .      .
| |      |

. . .     

🔥 ~      "
| |      |
usuario193661
fuente
¿Podría editar para aclarar el puntaje antes y después de las bonificaciones, y si el recuento de bytes es con o sin comentarios?
Conor O'Brien
Estoy intentando jugar más al golf. Y quiero probar una versión de Pyth.
user193661
1
¡Frio! Gracias. ¡Buena suerte con Pyth! ^ _ ^
Conor O'Brien
1
¿Por qué no te deshaces de todos los comentarios, nuevas líneas, etc.?
RK.
Puede deshacerse del bit de "se requieren más velas"; se supone que una salida numérica es así.
Conor O'Brien
3

JavaScript (ES6), 328 bytes (puntuación: 184)

Traté de superar la solución de Haskell, pero en realidad es una entrada bastante competitiva dada toda la lógica que debe suceder.

Puntuación calculada como: Math.floor((328-15)*Math.pow(0.9,5))bytes contados en un archivo con codificación UTF-8, probado y confirmado con io.js --harmony_arrow_functions.

Solución :

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 : la matriz debe estar acolchada para ser rectangular.

Explicación : toda la locura eval establece una variable (la variable ken la cadena replacepara guardar algunos bytes) y elimina 11 bytes de una cadena de 339 bytes, que puedo eliminar del golf 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 se solicitaron E / S de ejemplo, aquí estaba el conjunto de pruebas que ejecuté,

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
fuente
¿Algún ejemplo de I / OS?
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ agregado.
CR Drost