눈사람 볼링


29

(관련 / 영감 : 볼링장 그리기 )

겨울철에 재미있는 취미는 농구와 같은 큰 공과 작은 눈사람 인물을 사용하여 눈사람 볼링을 수행하는 것입니다. 이것을 ASCII로 다시 만들어 봅시다.

각 눈사람은 다음으로 구성됩니다.

(.,.)
( : )

눈사람 "핀"의 정렬은 다음과 같습니다.

(.,.) (.,.) (.,.) (.,.)
( : ) ( : ) ( : ) ( : )
   (.,.) (.,.) (.,.)
   ( : ) ( : ) ( : )
      (.,.) (.,.)
      ( : ) ( : )
         (.,.)
         ( : )

이러한 "핀"에서 표시되어 있습니다 110

7 8 9 10
 4 5 6
  2 3
   1

지금까지는 표준입니다. 그러나 일반적인 볼링과 달리 눈사람 핀은 단순히 평평 해져 완전히 제거되지 않습니다. 이것은 맞은 핀의 눈을 수동으로 평평하게해야하는 사람이 수행합니다. 납작한 눈사람은 _____공백이있는 (5 개의 밑줄)로 표시됩니다 . 다음은 1 3 5 6 9 10핀이 평평한 예입니다 ( 2 4 7 8핀만 남음을 의미 ).

(.,.) (.,.)
( : ) ( : ) _____ _____
   (.,.)
   ( : ) _____ _____
      (.,.) 
      ( : ) _____

         _____

입력

  • 의 정수 목록 110 편리한 형식으로 핀을 강타 따라서 필요했다 나타내는 평평합니다.
  • 각 숫자는 최대 한 번만 나타나며 숫자는 순서에 따라 정렬 (정렬, 정렬되지 않은 정렬, 내림차순 정렬) 할 수 있습니다.
  • 입력은 하나 이상의 정수를 갖도록 보장됩니다.

산출

올바른 핀을 평평하게하여 눈사람 핀의 결과 ASCII 아트 표현.

규칙

  • 문자 자체가 올바르게 정렬되는 한 줄 바꿈 또는 공백은 모두 선택 사항입니다.
  • 전체 프로그램 또는 기능이 허용됩니다. 함수 인 경우 출력하지 않고 출력을 반환 할 수 있습니다.
  • 가능하면 사람들이 코드를 시험해 볼 수 있도록 온라인 테스트 환경에 대한 링크를 포함하십시오!
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

1 3 5 6 9 10

(.,.) (.,.)
( : ) ( : ) _____ _____
   (.,.)
   ( : ) _____ _____
      (.,.) 
      ( : ) _____

         _____

1 2 3

(.,.) (.,.) (.,.) (.,.)
( : ) ( : ) ( : ) ( : )
   (.,.) (.,.) (.,.)
   ( : ) ( : ) ( : )

      _____ _____

         _____

1 2 3 4 5 6 8 9 10

(.,.)
( : ) _____ _____ _____

   _____ _____ _____

      _____ _____

         _____

18
코드 골프 ? 코드 볼링이 아닙니까?
Mark

0에서 색인 된 입력 번호를 취할 수 있습니까? 그리고 가능하다면 1 2 3 4 5 6 7 8 9 10 대신 0123456789와 같은 공백없이 입력 값을 가져 가십시오.
청록 펠리칸

Perfect : D 그것은> <>에서 더 쉽게 시도 할 수있게 해줍니다
Teal pelican

4
나는 평평한 눈사람을 승인하지 않습니다.

나는 눈사람으로 자신을 식별 하고이 납작한을 찾으십시오.
정복자

답변:


7

05AB1E , 45 44 바이트

TF"(.,.)( : )"„ _5×{«4ä2ä¹N>åè})4L£Rvyø»}».c

온라인으로 사용해보십시오!

설명

TF                                           # for N in [0 ... 9] do:
  "(.,.)( : )"                               # push string
              „ _                            # push the string " _"
                 5×                          # repeat it 5 times
                   {                         # sort
                    «                        # concatenate the strings
                     4ä                      # split the string in 4 parts
                       2ä                    # split the list in 2 parts
                         ¹N>åè               # if index+1 is in the input, push the first part
                                             # else push the second part
                              }              # end loop
                               )             # wrap stack in a list
                                4L£          # split list in parts of size 1,2,3,4
                                   R         # reverse list
                                    v        # for each list in list of lists
                                     yø      # transpose the list
                                       »     # join by spaces and newlines
                                        }    # end loop
                                         »   # join by newlines
                                          .c # centralize

46

눈사람 1.0.2 , 157 바이트

(()("789:045600230001"4aG::48nSdU][:#:]eq]/nM;AsI[:"_____"wR["     "wR/aC;:"( : )"wR["(.,.)"wR/aC;bI;:"  "wRdUaC;bI\#**\;aMaZ:" "aJ1AfL;aM;aM1AfL"
"aJ1AfL*))

온라인으로 사용해보십시오!

이 도전을 보았을 때 나는 완벽한 언어로 대답해야한다는 것을 알았습니다 ...

이것은 숫자의 배열로 입력을 취하고 현재 영구를 통해 문자열로 출력하는 서브 루틴입니다.

"가독성"/ 미학을 위해 포장 :

(()("789:045600230001"4aG::48nSdU][:#:]eq]/nM;AsI[
:"_____"wR["     "wR/aC;:"( : )"wR["(.,.)"wR/aC;bI
;:"  "wRdUaC;bI\#**\;aMaZ:" "aJ1AfL;aM;aM1AfL"
"aJ1AfL*))

약간 ungolfed / 댓글 버전 :

}
1wR`
3wR`aC`
5wR`aC`
6wR`aC`
9wR`aC`
*

((
    )(
    "789:045600230001"  // pin layout data
    4aG                 // split into groups of 4; we need each row twice
    :                   // map over groups of 2 output lines
        :               // map over pins (or whitespace)
            48nS        // subtract ascii '0'
            dU][        // duplicate the pin; we need it in the if{}
            :           // if (pin) {
                #:]eq]/nM;AsI[:"_____"wR["     "wR/aC;:"( : )"wR["(.,.)"wR/aC;bI
            ;:          // } else {
                "  "wRdUaC
            ;bI         // }
            \#**\       // maneuver the permavars around to discard pin
        ;aM
        aZ:" "aJ1AfL;aM
    ;aM
    1AfL                // flatten (simulate a flatmap)
    "
"aJ                     // join on newline
    1AfL                // flatten again into a single string
    *
))

#sP

17
이것이 "완벽한 언어"로 알려진 유일한 맥락, : P
DJMcMayhem

2
자신의 종류를 죽이는 눈사람 ... You monster!
RudolfJelin

10

스택 된 비경쟁 118 바이트

deepmap이 도전 이후에 수많은 버그 수정과 함께 몇 가지 추가 사항을 추가 했습니다. 여기 사용해보십시오!

@a((7 8 9 10)(4 5 6)(2 3)(1)){e:('(.,.)
( : )' ' 
_'5 hrep)a e has#'  'hcat
}deepmap{e i:' 
 'i 3*hrep e,$hcat#/!LF+}map

언 골프

{ a :
  ((7 8 9 10) (4 5 6) (2 3) (1))
  { e :
    (
      '(.,.)' LF '( : )' + + 
      ' ' LF '_' + + 5 hrep
    ) @possible
    a e has @ind
    possible ind get @res
    '  ' @padding
    res padding hcat return
  } deepmap
  { e i:
    ' ' LF ' ' + + i 3 * hrep
    e ,
    $hcat insert!
    LF +
  } map
} @:bowl

(1 2 3 4 6 10) bowl out

산출:

(.,.) (.,.) (.,.)       
( : ) ( : ) ( : ) _____ 
         (.,.)       
   _____ ( : ) _____ 

      _____ _____ 

         _____ 

이 언어는 좋아 보인다. 위키의 Fisher-Yates 예제는 아름답습니다.
Jordan

@Jordan 너무 감사합니다! 그것은 나에게 많은 것을 의미합니다 :)
Conor O'Brien

7

파이썬 2 248 243 241 226 224 223 221 210 206 200 177 바이트

@Rod 덕분에 -5

Rod 덕분에 다시 -15

Rod에서 공간 계산을 다시 사용하여 -1

더 많은 줄과 들여 쓰기로 인해 더 길어 지지만 놀랍게도 11 바이트 더 짧습니다.

나는 이것이 200 이하가 될 것이라고 확신합니다 ...

나는 옳았지만 @ Pietu1998의 23 바이트 가치의 힌트가 없었습니다. 많은 감사합니다!

i,z=input(),0;m=['']*10;n=m[:]
for x in range(11):m[x-1],n[x-1]=('(.,.)',' '*5,'( : )','_'*5)[x in i::2]
for y in 10,6,3,1:
 for q in m,n:print' '*3*z+' '.join(q[y-4+z:y])
 z+=1

온라인으로 사용해보십시오!

정수 목록으로 입력을받습니다. 248에서 너무 크지 만 작동합니다.



6

C 번호 233 221 213 203 바이트

메소드는 떨어진 핀 목록으로 int 배열 a를 사용합니다.

string S(int[]a){string o="",x=o,y=o,z=o;for(int i=10;i>0;){var c=a.Contains(i);x=(c?"      ":"(.,.) ")+x;y=(c?"_____ ":"( : ) ")+y;if(i==7|i<5&i--!=3){o+=$"{z}{x}\n{z}{y}\n";x=y="";z+="   ";}}return o;}

포장

string S(int[]a){string o="",x=o,y=o,z=o;for(int i=10;i>0;)
{var c=a.Contains(i);x=(c?"      ":"(.,.) ")+x;y=(c?"_____ ":
"( : ) ")+y;if(i==7|i<5&i--!=3){o+=$"{z}{x}\n{z}{y}\n";x=y="";
z+="   ";}}return o;}

넓히는

string S(int[] a)
{
    string o = "", x = o, y = o, z= o;
    for (int i = 10; i > 0;)
    {
        var c = a.Contains(i);
        x = (c ? "      " : "(.,.) ") + x;
        y = (c ? "_____ " : "( : ) ") + y;

        if (i==7|i<5&i--!=3)
        {
            o += $"{z}{x}\n{z}{y}\n";
            x = y = "";
            z += "   ";
        }
    }
    return o;
}

Ghost, raznagul 및 auhmaan의 의견에 대한 제안으로 몇 바이트를 떨어 뜨 렸습니다.


2
PPCG에 오신 것을 환영합니다!
AdmBorkBork

좋은! for를 입력하고 다음 new[]{7,4,2,1}.Contains(i--)으로 변경하면 몇 바이트 (5?)를 절약 할 수 있습니다.i<9&&i%3==1||i==2
Ghost

다음을 통해 두 가지를 더 향상시킬 수 있습니다 (-7).i==7||i<5&&i!=3
Ghost

@ 고스트 감사합니다! non-shortcurcuit ors and ands를 사용하여 조금 더 무너 뜨 렸지만 여전히 i에 대한 최종 심판으로 감소합니다i==7|i<5&i--!=3
Erresen

로 교체 var o="";var x=...하여 일부 바이트를 절약 할 수 있습니다 string o="",x=""....
raznagul

5

배치, 262 바이트

@echo off
for /l %%i in (1,1,10)do set s%%i=( : ) 
for %%i in (%*)do set s%%i=_____ 
set l=call:l 
%l%%s7%%s8%%s9%%s10%
%l%"   %s4%%s5%%s6%
%l%"      %s2%%s3%
%l%"         %s1%
exit/b
:l
set s=%~1
set s=%s:( : )=(.,.)%
echo(%s:_____=     %
echo(%~1

참고 : 2, 3, 4 행은 공백으로 끝나고 각 행에 후행 공백을 출력합니다. 5 바이트의 비용으로 제거 할 수 있습니다. 눈사람의 하단 절반으로 변수 s1 ... s10을 만든 다음 명령 줄 인수로 주어진 변수를 병합하여 작동합니다. 적절한 행이 두 번 인쇄되며 처음에는 아래쪽 절반이 위쪽 절반으로 바뀝니다. 이렇게하면 상한 및 하반 변수 두 세트를 사용하여 18 바이트를 절약 할 수 있습니다.


1
매끄러운 답변입니다.
AdmBorkBork

4

자바 스크립트, 154 149 바이트

f=
a=>`6 7 8 9
_3 4 5
__1 2
___0
`[r='replace'](/\d|_/g,m=>++m?~a.indexOf(m)?'_____':'( : )':'   ')[r](/.*\n?/g,m=>m[r](/ : |_/g,s=>s=='_'?' ':'.,.')+m)


I.oninput=()=>O.innerHTML=f(JSON.parse(`[${I.value.match(/\d+/g)}]`))
I.oninput()
<input id=I value="1 3 5 6 9 10"><pre id=O>


3

Pyth, 63 바이트

j.ejm+**3k;j;db)_CcR[1 3 6).e:*T]btMQ@m*T]*5d,d\_kc2"(.,.)( : )

정수 목록을 입력하고 결과를 인쇄하는 프로그램입니다.

테스트 스위트

[나중에 설명]


3

Pyth, 51 바이트

이 코드에는 인쇄 할 수없는 것이 포함되어 있으므로 여기에는 xxd16 진 덤프가 있습니다.

00000000: 6a6d 2e5b 3233 5f6a 3b6d 4063 323f 7d6b  jm.[23_j;m@c2?}k
00000010: 5172 2235 2035 5f22 392e 2220 3b5b 8db2  Qr"5 5_"9." ;[..
00000020: 1778 a822 6472 4673 4d50 4253 2d34 2f64  .x."drFsMPBS-4/d
00000030: 323b 38                                  2;8

온라인으로 사용해보십시오.

인쇄 불가, 52 바이트

jm.[23_j;m@c2?}kQr"5 5_"9").,.() : ("drFsMPBS-4/d2;8

온라인으로 사용해보십시오.


2

자바 스크립트 178 169 바이트

본질적으로 C # 답변의 포트입니다.

평탄화 된 "핀"목록으로 int 배열을 취합니다.

f=a=>{o=x=y=z="";for(i=10;i>0;){c=a.includes(i);x=(c?"      ":"(.,.) ")+x;y=(c?"_____ ":"( : ) ")+y;if(i==7|i<5&i--!=3){o+=z+x+"\n"+z+y+"\n";x=y="";z+= "   ";}}return o}

포장 :

f=a=>{o=x=y=z="";for(i=10;i>0;){c=a.includes(i);
x=(c?"      ":"(.,.) ")+x;y=(c?"_____ ":"( : ) ")+y;
if(i==7|i<5&i--!=3){o+=z+x+"\n"+z+y+"\n";x=y="";
z+= "   ";}}return o}

확장 및 설명 :

// function f takes parameter a (an array of ints) 
f = a => {

    // four strings:
    // o: output
    // x: top row of snowmen
    // y: bottom row of snowmen
    // z: padding to indent the snowmen
    o = x = y = z = "";

    // loop from 10 to 1 (the pins)
    // remove the "afterthought" decrement - we can do that later
    for (i = 10; i > 0;) {

        // set the boolean c to whether the current pin has been flattened
        c = a.includes(i);

        // prefix x and y with the appropriate "sprite"
        // using a ternary if on c
        x = (c ? "      " : "(.,.) ") + x;
        y = (c ? "_____ " : "( : ) ") + y;

        // determine if we've reached the end of a row (i equals 7, 4, 2 or 1)
        // use non shortcircuit operators to save bytes and ensure we hit the final i, because...
        // we also decrement i here 
        // (we didn't do this in the for loop declaration to save a byte)
        if (i == 7 | i < 5 & i-- != 3) {

            // concatenate our rows x & y,
            // prefixing them with the padding z,
            // postfixing them with a newline
            o += z + x + "\n" + z + y + "\n";

            // reset x and y rows
            x = y = "";

            // increase our padding for next time
            z += "   ";
        }
    }

    // return our final string (no semicolon to save a byte)
    return o
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.