내 생일의 주제 : 불길


18

촛불을 켜야 해요 사실, 나는 임의의 양의 촛불을 켜야합니다. 그러나 좋은 것만.

목표 텍스트 블록 (점등, 유효, 유효하지 않은 양초 포함)과 숫자 N를 입력으로 받으면 정확히 N점등 된 양초를 뺀 것과 정확히 같은 양의 빛을 발하는 프로그램이나 기능을 작성하십시오 . 경우 N유효한 촛불의 수보다 큰 경우, 프로그램이 없거나, 유효한 촛불의 수를 인쇄해야합니다. 양초가 없으면 출력은이어야합니다 :(.

유효한 양초는 다음과 같습니다.

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

(a 끝나는 .만 함유 |하거나, 반드시 인접하지 균형 \/길이에 상관 될 수있다.)

유효하지 않은 촛불은 다음과 같습니다.

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

(언밸런스 드 \, 캔들 스틱 없음, 연결 해제 됨, |캐릭터 외, 땅에 심지 않음)

불이 켜진 촛불은 .유효한 양초를 다음 문자 중 하나로 대체합니다 (선택).

@ ^ & " ~

최소한 하나를 사용해야하며, -10%각 캐릭터가 불이 켜진 촛불에 나타날 수 있도록 프로그램에 사용 된 각 캐릭터에 대해 보너스를 받습니다 . 🔥그림 이모티콘 을 사용하는 경우, 사용되는 경우 , -15보너스 보너스 전에 적용되는 바이트 보너스를받습니다. 바이트 수가 줄어 듭니다!

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

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

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

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

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

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

언어 이름을 링크로 만들어 리더 보드 스 니펫에 표시 될 수도 있습니다.

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


아, 그리고 내 생일이야.
Conor O'Brien

10
생일 축하!
Level River St

@steveverrill 감사합니다 ^ _ ^
Conor O'Brien

입력에 공백이 채워져 사각형을 형성한다고 가정 할 수 있습니까?
Downgoat

@vihan 이것 처럼?
Conor O'Brien

답변:


4

하스켈, ⌊ (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

예제 실행 :

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

작성자의 의견 중 하나에서 허용하는대로 각 입력 줄이 이전 줄보다 길다고 가정합니다.


새로운 1 위를 차지한 것 같습니다!
Conor O'Brien

5

파이썬 2, 529 바이트, 보너스 303

  • 첫 번째 줄에 정수가 있다고 가정합니다.
  • 일정한 간격을 가정하지 않습니다. 촛불 열이 비어 있다고 가정하지 않습니다.

전략:

  • 목록으로 입력하십시오.
  • 그것을 뒤집어서 열 목록에 매핑하십시오.
  • 테스트하고 작동하십시오.
  • 다시 행으로 매핑하고 뒤집고 선을 결합하십시오.

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

테스트 :

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

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

3,
. . .       
| \ |

1 more candles required

3,  
. . .

. .      .
| |      |

. . .     

🔥 ~      "
| |      |

보너스 전후의 점수와 바이트 수에 주석이 있는지 여부를 명확히하기 위해 편집 할 수 있습니까?
Conor O'Brien

골프를 더하려고합니다. Pyth 버전을 사용하고 싶습니다.
user193661

1
멋있는! 감사. Pyth와 함께 행운을 빕니다! ^ _ ^
Conor O'Brien

1
모든 의견, 줄 바꿈 등을 제거하지 않으시겠습니까?
RK.

'더 많은 양초 필요'비트를 제거 할 수 있습니다. 따라서 숫자 출력이 있다고 가정합니다.
Conor O'Brien

3

자바 스크립트 (ES6), 328 바이트 (점수 : 184)

나는 Haskell 솔루션을 이길려고했지만 실제로 필요한 모든 논리를 감안할 때 실제로 경쟁이 치열합니다.

점수는 다음과 같이 계산됩니다. Math.floor((328-15)*Math.pow(0.9,5)), UTF-8 인코딩으로 파일에서 계산 된 바이트 수로 테스트 및 확인되었습니다 io.js --harmony_arrow_functions.

해결책 :

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

요구 사항 : 배열은 사각형이되도록 공백으로 채워야합니다.

설명 : 모든 eval 광기는 하나의 변수 ( 일부 바이트를 저장 k하기 위해 문자열 replace로 변수) 를 설정 하고 339 바이트 문자열에서 11 바이트를 제거합니다.

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

예제 I / O가 요청되었으므로 여기에 내가 실행 한 테스트 스위트가 있습니다.

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

예제 I / OS?
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ 님이 추가했습니다
CR Drost
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.