Thème de mon anniversaire: en flammes

18

J'ai besoin d'allumer des bougies. En fait, je dois allumer une quantité arbitraire de bougies. Mais seulement les bons.

OBJECTIF Étant donné un bloc de texte (contenant des bougies allumées, valides et invalides) et un nombre Nen entrée, écrivez un programme ou une fonction qui allume un montant exactement égal N, moins le nombre de bougies déjà allumées. Si Nest supérieur au nombre de bougies valides, le programme doit imprimer le nombre de bougies valides manquantes. Si aucune bougie n'est présente, la sortie doit l'être :(.

Voici quelques bougies valides:

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

(se terminant par un ., contenant uniquement |ou équilibré, pas nécessairement adjacent \et /, peut être de n'importe quelle longueur.)

Voici quelques bougies invalides:

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

(déséquilibré \, pas de chandelle, déconnecté, non- |personnages, non planté au sol.)

Une bougie allumée remplacera la .bougie valide par l'un des caractères suivants (votre choix):

@ ^ & " ~

Vous devez en utiliser au moins un, et vous obtenez un -10%bonus pour chaque personnage utilisé dans votre programme, de telle sorte que chaque personnage puisse apparaître sur une bougie allumée. Si vous utilisez les 🔥emoji, vous obtenez un -15bonus d'octet, qui est appliqué avant les bonus en pourcentage, s'il est utilisé. LE COMPTE D'OCTETS EST ARRÊTÉ!

Il s'agit d'un , donc le code le plus court en octets l'emporte.

Exemples d'E / S

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

Classements

Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.

Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:

# Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:

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

Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:

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

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:

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

Conor O'Brien
la source
Oh, et c'est mon anniversaire.
Conor O'Brien
10
Bon anniversaire!
Level River St
@steveverrill Merci ^ _ ^
Conor O'Brien
Pouvons-nous supposer que l'entrée est remplie d'espaces pour former un rectangle?
Downgoat
@vihan Comme ça?
Conor O'Brien

Réponses:

4

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

Exemple d'exécution:

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

Suppose que chaque ligne d'entrée est au moins aussi longue que la ligne précédente, comme le permet l'un des commentaires de l'auteur.

Anders Kaseorg
la source
On dirait que nous avons une nouvelle 1ère place!
Conor O'Brien
5

Python 2, 529 octets avec bonus, 303

  • Suppose que la première ligne contient un entier.
  • Ne suppose pas un espacement constant. Ne suppose pas que la colonne des bougies est vide.

Stratégie:

  • Obtenez une entrée sous forme de liste.
  • Inversez-le et mappez-le sur une liste de colonnes.
  • Testez et faites fonctionner.
  • Mappez-le en rangées, inversez-le, joignez les lignes.

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

Tests:

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

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

3,
. . .       
| \ |

1 more candles required

3,  
. . .

. .      .
| |      |

. . .     

🔥 ~      "
| |      |
user193661
la source
Pourriez-vous modifier pour clarifier le score avant et après les bonus, et si le nombre d'octets est avec ou sans commentaires?
Conor O'Brien du
J'essaie de jouer au golf plus loin. Et je veux essayer une version Pyth.
user193661
1
Cool! Merci. Bonne chance avec Pyth! ^ _ ^
Conor O'Brien
1
Pourquoi ne vous débarrassez-vous pas de tous les commentaires, nouvelles lignes, etc.?
RK.
Vous pouvez vous débarrasser du bit «plus de bougies nécessaires»; une sortie numérique est supposée être ainsi.
Conor O'Brien
3

JavaScript (ES6), 328 octets (score: 184)

J'ai essayé de battre la solution Haskell mais c'est en fait une entrée assez compétitive compte tenu de toute la logique qui doit se produire.

Score calculé comme Math.floor((328-15)*Math.pow(0.9,5)):, octets comptés dans un fichier avec encodage UTF-8, testé et confirmé avec io.js --harmony_arrow_functions.

Solution :

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

Exigences : la matrice doit être à espace rembourré pour être rectangulaire.

Explication : toute la folie eval définit une variable (la variable kde la chaîne replacepour enregistrer certains octets) et rase 11 octets d'une chaîne de 339 octets, que je peux dé-golfer comme:

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

Puisque des exemples d'E / S ont été demandés, voici la suite de tests que j'ai exécutée,

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
la source
Un exemple I / OS?
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ ajouté.
CR Drost