Tema del mio compleanno: in fiamme


18

Devo accendere delle candele. In effetti, devo accendere una quantità arbitraria di candele. Ma solo quelli buoni.

OBIETTIVO Dato un blocco di testo (contenente candele accese, valide e non valide) e un numero Ncome input, scrivere un programma o una funzione che illumini un importo esattamente uguale a N, meno il numero di candele già accese. Se Nè maggiore del numero di candele valide, il programma dovrebbe stampare il numero di candele mancanti e valide. Se non sono presenti candele, l'output dovrebbe essere :(.

Ecco alcune candele valide:

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

(termina con a ., contenente solo |o bilanciato, non necessariamente adiacente \e /, può essere di qualsiasi lunghezza.)

Ecco alcune candele non valide:

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

(sbilanciato \, nessun candelabro, disconnesso, non |caratteri, non piantato a terra.)

Una candela accesa sostituirà .una candela valida con uno dei seguenti caratteri (a tua scelta):

@ ^ & " ~

Devi usarne almeno uno e ottieni un -10%bonus per ogni personaggio usato nel tuo programma, in modo tale che ogni personaggio possa apparire su una candela accesa. Se si utilizza l' 🔥emoji, si ottiene un -15bonus byte, che viene applicato prima dei bonus percentuali, se utilizzato. IL CONTE BYTE È ARROTONDATO!

Questo è un , quindi vince il codice più breve in byte.

IO di esempio

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

Classifiche

Ecco uno snippet di stack per generare sia una classifica regolare che una panoramica dei vincitori per lingua.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, utilizzando il seguente modello Markdown:

# Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet della classifica:

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


Oh, ed è il mio compleanno.
Conor O'Brien,

10
Buon compleanno!
Level River St

@steveverrill Grazie ^ _ ^
Conor O'Brien,

Possiamo supporre che l'input sia riempito di spazi per formare un rettangolo?
Downgoat,

Risposte:


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

Esempio di esecuzione:

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

Suppone che ciascuna riga di input sia lunga almeno quanto la riga precedente, come consentito da uno dei commenti dell'autore.


Sembra che abbiamo un nuovo 1 ° posto!
Conor O'Brien,

5

Python 2, 529 byte con bonus, 303

  • Presuppone che la prima riga abbia un numero intero su di essa.
  • Non presuppone una spaziatura coerente. Non presume che la colonna delle candele sia vuota.

Strategia:

  • Ottieni input come elenco.
  • Invertire e mapparlo su un elenco di colonne.
  • Testare e operare.
  • Mappa di nuovo in righe, invertirlo, unire le linee.

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

test:

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

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

3,
. . .       
| \ |

1 more candles required

3,  
. . .

. .      .
| |      |

. . .     

🔥 ~      "
| |      |

Potresti modificare per chiarire il punteggio prima e dopo i bonus e se il conteggio dei byte è con o senza commenti?
Conor O'Brien,

Sto tentando di giocare a golf ulteriormente. E voglio provare una versione di Pyth.
user193661

1
Freddo! Grazie. Buona fortuna con Pyth! ^ _ ^
Conor O'Brien,

1
Perché non ti sbarazzi di tutti i commenti, le nuove righe, ecc.?
RK.

Puoi liberarti del bit `più candele necessarie`; si presume che un output numerico sia così.
Conor O'Brien,

3

JavaScript (ES6), 328 byte (punteggio: 184)

Ho provato a battere la soluzione Haskell ma in realtà è una voce piuttosto competitiva data tutta la logica che deve accadere.

Punteggio calcolato come Math.floor((328-15)*Math.pow(0.9,5)):, byte contati in un file con codifica UTF-8, testati e confermati con io.js --harmony_arrow_functions.

Soluzione :

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

Requisiti : l'array deve essere spaziato per essere rettangolare.

Spiegazione : tutta la follia eval imposta una variabile (la variabile ksulla stringa replaceper salvare alcuni byte) e rade 11 byte da una stringa di 339 byte, che posso annullare il golf come:

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

Dato che sono stati richiesti gli I / O di esempio, ecco la suite di test che ho eseguito,

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

Qualche esempio di I / OS?
Conor O'Brien,

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ aggiunto.
CR Drost,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.