Temat moich urodzin: w płomieniach

18

Muszę zapalić kilka świec. W rzeczywistości muszę zapalić dowolną liczbę świec. Ale tylko dobre.

CEL Biorąc pod uwagę blok tekstu (zawierający zapalone, ważne i nieważne świece) i liczbę Njako dane wejściowe, napisz program lub funkcję, która zapala ilość dokładnie równą N, minus liczba już zapalonych świec. Jeśli Njest większa niż liczba prawidłowych świec, program powinien wydrukować liczbę brakujących, ważnych świec. Jeśli nie ma żadnych świec, wyjście powinno być :(.

Oto kilka ważnych świec:

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

(kończące się na ., zawierające tylko |lub zrównoważone, niekoniecznie sąsiadujące \i /mogą mieć dowolną długość).

Oto niektóre nieprawidłowe świece:

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

(niezrównoważony \, brak świecy, rozłączony, bez |znaków, nie sadzony na ziemi).

Zapalona świeca zastąpi świecę .na ważnej dowolną z następujących postaci (do wyboru):

@ ^ & " ~

Musisz użyć co najmniej jednego, a otrzymasz -10%bonus za każdą postać użytą w twoim programie, w taki sposób, aby każda postać mogła pojawić się na zapalonej świecy. Jeśli używasz 🔥emoji, dostajesz -15premię bajtową, która jest stosowana przed bonusami procentowymi, jeśli są używane. Liczba bajtów jest zaokrąglona!

To jest , więc wygrywa najkrótszy kod w bajtach.

Przykładowe IO

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

Liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

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

Conor O'Brien
źródło
Aha, i to są moje urodziny.
Conor O'Brien
10
Wszystkiego najlepszego!
Level River St
@steveverrill Thanks ^ _ ^
Conor O'Brien
Czy możemy założyć, że dane wejściowe są wypełnione spacjami, aby utworzyć prostokąt?
Downgoat,
@vihan Podoba Ci się to?
Conor O'Brien,

Odpowiedzi:

4

Haskell, ⌊ (269 bajtów - 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

Przykładowy przebieg:

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

Zakłada, że ​​każdy wiersz wejściowy jest co najmniej tak długi, jak poprzedni wiersz, na co pozwala jeden z komentarzy autora.

Anders Kaseorg
źródło
Wygląda na to, że mamy nowe 1. miejsce!
Conor O'Brien,
5

Python 2, 529 bajtów z bonusem, 303

  • Zakłada, że ​​w pierwszym wierszu znajduje się liczba całkowita.
  • Nie zakłada spójnych odstępów. Nie zakłada, że ​​kolumna świec jest pusta.

Strategia:

  • Uzyskaj dane wejściowe jako listę.
  • Odwróć go i zamapuj na listę kolumn.
  • Testuj i działaj.
  • Zamapuj go z powrotem w rzędy, odwróć, połącz linie.

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

Testy:

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

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

3,
. . .       
| \ |

1 more candles required

3,  
. . .

. .      .
| |      |

. . .     

🔥 ~      "
| |      |
użytkownik193661
źródło
Czy możesz edytować, aby wyjaśnić wynik przed i po premiach oraz czy liczba bajtów jest z komentarzami, czy bez?
Conor O'Brien,
Próbuję dalej grać w golfa. I chcę wypróbować wersję Pyth.
user193661,
1
Chłodny! Dzięki. Powodzenia w Pyth! ^ _ ^
Conor O'Brien
1
Dlaczego nie pozbędziesz się wszystkich komentarzy, nowych linii itp.?
RK.
Możesz pozbyć się nieco więcej wymaganych świec; zakłada się, że jest to wynik liczbowy.
Conor O'Brien,
3

JavaScript (ES6), 328 bajtów (wynik: 184)

Próbowałem pokonać rozwiązanie Haskell, ale w rzeczywistości jest to dość konkurencyjne wejście, biorąc pod uwagę całą logikę, która musi się wydarzyć.

Wynik obliczony jako Math.floor((328-15)*Math.pow(0.9,5)):, bajty zliczone w pliku z kodowaniem UTF-8, przetestowane i potwierdzone za pomocą io.js --harmony_arrow_functions.

Rozwiązanie :

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

Wymagania : tablica musi być wypełniona spacją, aby była prostokątna.

Objaśnienie : wszystkie eval szaleństwo ustawiają jedną zmienną (zmienną kna ciąg znaków, replaceaby zaoszczędzić niektóre bajty) i golą 11 bajtów z 339-bajtowego ciągu, który mogę odblokować jako:

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

Ponieważ poproszono o przykładowe We / Wy, oto testowany zestaw testów, który uruchomiłem,

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
źródło
Jakiś przykładowy system operacyjny?
Conor O'Brien,
1
Dodano @ CᴏɴᴏʀO'Bʀɪᴇɴ.
CR Drost,