Thema meines Geburtstages: In Flammen

18

Ich muss ein paar Kerzen anzünden. Tatsächlich muss ich eine beliebige Menge Kerzen anzünden . Aber nur die Guten.

ZIEL Gegeben ist ein Textblock (der brennende , gültige und ungültige Kerzen enthält) und eine Zahl Nals Eingabe. Schreiben Sie ein Programm oder eine Funktion, die einen Betrag genau gleich Nabzüglich der Anzahl der bereits brennenden Kerzen beleuchtet. Wenn Ngrößer als die Anzahl der gültigen Kerzen ist, sollte das Programm die Anzahl der fehlenden gültigen Kerzen drucken. Wenn keine Kerzen vorhanden sind, sollte die Ausgabe sein :(.

Hier sind einige gültige Kerzen:

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

(Endung mit a ., nur enthaltend |oder ausgeglichen, nicht unbedingt benachbart \und /kann beliebig lang sein.)

Hier sind einige ungültige Kerzen:

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

(Unausgeglichen \, kein Kerzenhalter, nicht verbunden |, keine Zeichen, nicht auf den Boden gepflanzt.)

Eine brennende Kerze ersetzt .eine gültige Kerze durch eines der folgenden Zeichen (nach Ihrer Wahl):

@ ^ & " ~

Sie müssen mindestens eine verwenden, und Sie erhalten einen -10%Bonus für jeden in Ihrem Programm verwendeten Charakter, sodass jeder Charakter auf einer brennenden Kerze erscheinen kann. Wenn Sie das 🔥Emoji verwenden, erhalten Sie einen -15Byte-Bonus, der vor den prozentualen Boni angewendet wird, sofern diese verwendet werden. DER BYTE COUNT WIRD ABGERUNDET!

Dies ist ein , also gewinnt der kürzeste Code in Bytes.

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

Bestenlisten

Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:

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

Conor O'Brien
quelle
Oh, und es ist mein Geburtstag.
Conor O'Brien
10
Alles Gute zum Geburtstag!
Level River St
@ Steveverrill Dank ^ _ ^
Conor O'Brien
Können wir annehmen, dass die Eingabe mit Leerzeichen aufgefüllt ist, um ein Rechteck zu bilden?
Downgoat
Gefällt dir das?
Conor O'Brien

Antworten:

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

Beispiellauf:

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

Es wird davon ausgegangen, dass jede Eingabezeile mindestens so lang ist wie die vorherige, wie in einem Kommentar des Autors angegeben.

Anders Kaseorg
quelle
Sieht so aus, als hätten wir einen neuen 1. Platz!
Conor O'Brien
5

Python 2, 529 Bytes mit Bonus, 303

  • Angenommen, die erste Zeile enthält eine Ganzzahl.
  • Nimmt keinen gleichmäßigen Abstand an. Es wird nicht davon ausgegangen, dass die Spalte mit den Kerzen leer ist.

Strategie:

  • Eingabe als Liste holen.
  • Kehren Sie es um und ordnen Sie es einer Liste von Spalten zu.
  • Testen und bedienen.
  • Ordne es wieder in Reihen zu, kehre es um und verbinde die Linien.

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
quelle
Könnten Sie die Punkte vor und nach den Boni bearbeiten, um zu verdeutlichen, ob die Anzahl der Bytes mit oder ohne Kommentare ist?
Conor O'Brien
Ich versuche weiter Golf zu spielen. Und ich möchte eine Pyth-Version ausprobieren.
user193661
1
Cool! Vielen Dank. Viel Glück mit Pyth! ^ _ ^
Conor O'Brien
1
Warum werden Sie nicht alle Kommentare, Zeilenumbrüche usw. los?
RK.
Sie können das "mehr Kerzen erforderlich" Bit loswerden; eine numerische Ausgabe wird also angenommen.
Conor O'Brien
3

JavaScript (ES6), 328 Byte (Bewertung: 184)

Ich habe versucht, die Haskell-Lösung zu übertreffen, aber das ist angesichts der notwendigen Logik ein ziemlich wettbewerbsfähiger Einstieg.

Ergebnis berechnet als Math.floor((328-15)*Math.pow(0.9,5)):, Bytes gezählt in einer Datei mit UTF-8-Codierung, getestet und bestätigt mit io.js --harmony_arrow_functions.

Lösung :

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

Anforderungen : Das Array muss mit Leerzeichen aufgefüllt sein, damit es rechteckig ist.

Erläuterung : Der gesamte eval-Wahnsinn setzt eine Variable (die Variable kfür die Zeichenfolge replace, um einige Bytes zu speichern) und entfernt 11 Bytes von einer 339-Byte-Zeichenfolge, die ich als ungolfen kann:

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

Da Beispiel-I / Os angefordert wurden, war hier die Testsuite, die ich ausgeführt habe,

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
quelle
Ein Beispiel für I / OS?
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ hinzugefügt.
CR Drost