코드 골프 골프 골프


24

골프 챌린지

아래의 ASCII "녹색"이 주어집니다.

|          |
|  |>      |
|  |       |
|  O       |
|          |
|          |
|          |
|          |
|          |
|          |

하자 |넣어야에게 벽
하자 |나타내는 절반 플래그 극
하자 >나타내는 극에 플래그
하자 O넣어야 구멍
하자 o넣어야 공을

"녹색"의 크기는 10x10입니다. 두 벽 사이에는 10 개의 공간이 있습니다 |.
녹색의 위쪽과 아래쪽 사이에 비어 있거나없는 10 개의 공백도 있습니다.

도전

x와 y 값을 입력하거나 두 개의 난수를 생성하여 골프 공을 그린에 "사격"하십시오.
x, y가 생성 된 구멍이나 깃대 / 플래그 출력에 닿지 않으면 "다시 시도하십시오!"
x, y가 생성되면 홀 출력 "Hole in One!"에 도달합니다.
x, y가 생성되면 폴 출력 "Lucky Shot!"에 도달합니다.
x, y가 생성되면 플래그 출력 "Close One!"을 누르십시오.

사격 후 공의 위치를 ​​녹색으로 출력하여 o적중 한 캐릭터를 교체하십시오. 또한 위의 각각의 말을 출력하십시오.

예 :

//Hole in one example, the O was replaced with a o
Randomed x = 3
Randomed y = 4

"Hole in One!"

|          |
|  |>      |
|  |       |
|  o       |
|          |
|          |
|          |
|          |
|          |
|          |


//Clone example, the top half of the pole was replaced with a o
Randomed x = 3
Randomed y = 2

"Lucky Shot!"

|          |
|  o>      |
|  |       |
|  O       |
|          |
|          |
|          |
|          |
|          |
|          |

//Lucky Shot example, the > was replaced with a o
Randomed x = 4
Randomed y = 2

"Close One!"

|          |
|  |o      |
|  |       |
|  O       |
|          |
|          |
|          |
|          |
|          |
|          |

//Try Again example, the <space> was replaced with a o
Randomed x = 5
Randomed y = 1

"Try Again!"

|     o    |
|  |>      |
|  |       |
|  O       |
|          |
|          |
|          |
|          |
|          |
|          |

재미 있고 행운을 빕니다. 이것이 이기 때문에 가장 짧은 코드가 승리합니다!


깃발 / 극은 항상 같은 위치에 있습니까?
corvus_192

당신은 그것을 그대로 두거나 재미를 가지고 움직일 수 있습니다. 나는 그것을 옮기기가 너무 고통 스럽다고 생각했지만 재미있는 도전을 추가한다고 생각합니다. 당신이 그것을 이동하면 2 <h <= 10 여기서 h는 구멍의 높이 지수입니다. 그렇게하면 깃발이 화면에서 벗어나지 않습니다.
jacksonecac

2
624826 및 K 0 <I <= 10, 0 <K <= 10 난수 생성하여 I 및 K를 설정하는 두 paramters 걸릴
jacksonecac

1
@ corvus_192 절대적으로
jacksonecac

1
이러한 출력 문자열은 코드 골프에 어려움이 있습니다. 아직 답변이 없으므로 입력으로 받아들이도록 허용하십시오.
Luis Mendo

답변:


10

자바 스크립트 (ES6) 210 208 193 184 바이트

f=(a,b)=>((s=[...(`
|          |`).repeat(10)])[17]=s[30]='|',s[18]='>',s[43]=0,s[a+=1+b*13]='o',(a-17&&a-30?a-18?a-43?'Try Again!':'Hole in One!':'Close One!':'Lucky Shot!')+s.join``)

데모


8

젤리 , 78 바이트

ċЀ®Ḍị“ȷþḄ7Ẋ“þẹƊ⁴ḳL&Ṛ“qĠṂ®““ÞzḊṁġ“»;”!Ṅṛ
⁶ẋ“€¡®µC‘ż“|>|O”©F”o⁸¦Ç
ṭḌ‘Çs⁵j@€⁾||Y

놀이 스킬 - 게임 또는 쓰레기-촬영 에서 TryItOnline을!

(랩샷은 더 많은 바이트를 요구합니다).

방법?

ṭḌ‘Çs⁵j@€⁾||Y - Main link: x, y (0-based)
ṭ             - tack            -> [y, x]
 Ḍ            - cast to decimal -> 10y+x
  ‘           - increment       -> 10y+x+1
   Ç          - call last link (1) as a monad
    s⁵        - split into chunks of size 10 (rows of green display)
         ⁾||  - literal ['|','|']
      j@€     - join €ach  with reversed @rguments (make the border)
            Y - join with line feeds
              - implicit print

⁶ẋ“€¡®µC‘ż“|>|O”©F”o⁸¦Ç - Link 1, Make green & place the ball: decimal 1-based location
  “€¡®µC‘               - code page indexes -> [12,0,8,9,67]
⁶                       - literal ' '
 ẋ                      - repeat (vectorises)
         ż              - zip with
          “|>|O”        - literal ['|','>','|','O']
                ©       -     and place the flag parts into the register
                 F      - flatten list
                     ¦  - apply to index at
                    ⁸   - input value
                  ”o    - literal 'o'
                      Ç - call the last link (2) as a monad

ċЀ®Ḍị“ȷþḄ7Ẋ“þẹƊ⁴ḳL&Ṛ“qĠṂ®““ÞzḊṁġ“»;”!Ṅṛ - Link 2, Print message: green with ball
   ®                                     - read register (the flag parts)     | > | O
ċЀ                                      - count occurrences e.g. HoleInOne: [2,1,2,0]
    Ḍ                                    - cast to decimal                  ->2120
     ị                                   - index into (1-based & modular) 2120 % 6 = 2
      “ȷþḄ7Ẋ“þẹƊ⁴ḳL&Ṛ“qĠṂ®““ÞzḊṁġ“»      - compressed list of (6) strings:
              ...["Lucky Shot","Hole in One","Try Again","","Close One",""]
                                   ;     - concatenate with
                                    ”!   - literal '!'
                                      Ṅ  - print with linefeed
                                       ṛ - yield right argument (the green)

8

파이썬 2, 290 264 262 252 248 245 바이트

예쁘지 않고 짧지는 않지만 피곤하고 첫 번째 유일한 Python 답변입니다. x, y 형식으로 샷을 입력하십시오.

편집하다

목록이 작성되는 방식을 재정 의하여 26 점을 기록했습니다. 그래도 긴 if 문으로 여전히 운이 없습니다.

-2를 긴 if를 사전으로 바꾸고 더 짧은 if로 교체합니다.

@ Noodle9 덕분에 -10-나는 그중 하나를 놓쳤다 :)

-4-다시 감사합니다 :)

또 다른 3 오프. 감사.

x,y=input();a=[' ']*120;a[15]=a[27]='|';a[16],a[39],b='>','0',x+y*12
a[b],k='o',"Lucky Shot!";l={16:"Close One!",15:k,27:k,39:"Hole in One!"}
print l[b]if b in l else"Try Again!"
for z in range(10):c=z*12;a[c]=a[c+11]='|';print''.join(a[c:c+12])

논리에 관심이 있고 주석이없는 (1316 바이트이지만 누구나 기억하는 경우 여전히 3.5 "디스크에 쉽게 맞습니다.)

x,y=input()                                     #Get the input as a tuple
a=[' ']*120                                     #Create a great big list of spaces for the whole green
a[15]=a[27]='|'                                 #Put the flag pole in place
a[16]='>'                                       #Add the flag
a[39]='0'                                       #Add the hole
b=x+y*12                                        #Get the absolute position in the list of the input tuple 
a[b]='o'                                        #Place the ball on the green
k="Lucky Shot!"                                 #Set a variable for k because it is long and we're going to use it twice
l={16:"Close One!",15:k,27:k,39:"Hole in One!"} #Create a dictionary of the comments (using k)
print l[b]if b in l else"Try Again!"            #If the absolute index is in the dict then print it otherwise print the default
for z in range(10):                             #Loop through the length of the green
    c=z*12                                      #Set a variable for the start point of each line
    a[c]=a[c+11]='|'                            #Add the left and right walls
    print''.join(a[c:c+12])                     #Print each line in turn. Because this is in a for loop then Python will deal with newlines

골프 사전에서 사전이 최고의 데이터 형식이라는 사실은 처음입니다.


사전 키로 해시 가능한 모든 것을 사용할 수 있습니다
Noodle9

6

C, 236 바이트

n,m;char*a[]={"Try Again!","Hole in One!","Lucky Shot!","Close One!"};f(x,y){n=130;m=142-y*13-x;puts(a[(m==87)+2*(m==113|m==100)+3*(m==112)]);while(n--)putchar(m==n?111:n%13?n%13==1|n%13==12|n==113|n==100?124:n==112?62:n==87?79:32:10);}

언 골프 드 :

n,m;
char*a[]={"Try Again!","Hole in One!","Lucky Shot!","Close One!"};
f(x,y){
 n=130;
 m=142-y*13-x;
 puts(a[(m==87) + 2*(m==113|m==100) + 3*(m==112)]); 
 while(n--)
  putchar(m==n?111:n%13?n%13==1|n%13==12|n==113|n==100?124:n==112?62:n==87?79:32:10);
}

3

스칼라, 238 바이트

(x:Int,y:Int)=>{val r="<          |\n"
('"'+(if(x==2&y==3)"Hole in One!"else
if(x==2&(y==1|y==2))"Lucky Shot!"else
if(x==3&y==1)"Close One!"else
"Try again!")+"'",(r+"|  |>      |\n|  |       |\n|  O       |\n"+r*6)updated(1+x+13*y,'o'))}

제로 인덱싱 사용

이것은 너무 읽기 쉬운 방법입니다 :(

설명:

(x:Int,y:Int)=>{                                      //define an anonymous function
  val r="|          |\n"                                //a shortcut for an empty row
  (                                                     //return a tuple of
    '"'+                                                  //a double quote
    (if(x==2&y==3)"Hole in One!"                          //plus the correct string
    else if(x==2&(y==1|y==2))"Lucky Shot!"
    else if(x==3&y==1)"Close One!"
    else "Try again!"
    )+"'"                                                 //and another quote
  ,                                                     //and
    (r+"|  |>      |\n|  |       |\n|  O       |\n"+r*6) //the field
    updated(1+x+13*y,'o')                                //with the (1+x+13*y)th char replaced with a ball
  )
}

1+x+13*y각 행의 길이는 13 자 (2 개의 경계, 줄 바꿈 및 10 개의 공백)에 1의 오프셋 (0,0)이 두 번째 문자 여야하므로 오프셋을 계산 하기 때문에 수식 을 사용하여 올바른 인덱스를 계산했습니다.


3

225 209 바이트

$_="|".$"x10 ."|
";$_.=sprintf("|  %-8s|
"x3,"|>","|",O).$_ x6;$d="Try Again!";($x,$y)=@ARGV;say$x==3?$y~~[2,3]?"Lucky Shot!":$y==4?"Hole in One!":$d:$x==4&&$y==2?"Close One!":$d;substr($_,$y*13-13+$x,1)=o;say

두 개의 리터럴 개행은 각각 1 바이트를 저장합니다. 꽤 표준입니다. 선언을 인쇄 한 다음 게임 보드를 인쇄합니다.


3

, 99 바이트

NαNβ× ⁵↑¹⁰‖C←J⁴¦²←>↓²OM⁴↖P⁺⎇∧⁼α³⁼β⁴Hole in One⎇∧⁼α³⁼¹÷β²Lucky Shot⎇∧⁼α⁴⁼β²Close One¦Try Again¦!Jαβo

stdin에서 공백으로 분리 된 1 기반 입력을받습니다. 대부분의 코드는 4 가지 메시지를 인쇄하기위한 것입니다. 온라인으로 사용해보십시오!

참고 : 숯은 여전히 ​​진행중인 작업입니다. 이 코드 는 현재 커밋에서 작동합니다 . 나중에 작동이 중지되면 (특히, TIO 링크가 예상대로 작동하지 않는 경우) 핑 (Ping)하면 경쟁하지 않는 업데이트 된 버전을 추가하려고합니다.

설명

NαNβ       Read two inputs as numbers into variables α and β

               Construct the green and flag:
× ⁵          Print to canvas 5 spaces
↑¹⁰          Print 10 | characters going up
‖C←         Reflect and copy leftward
             At this point, borders of green are complete; cursor is above left wall
J⁴¦²        Jump 4 units right and 2 down
←>           Print the flag, going leftward
↓²           Print the pin (2 | characters), going downward
O            Print the hole
             The last print was rightward by default, which means we're now at (4,4)
M⁴↖         Move 4 units up and left; cursor is above left wall again

               Add the proper message:
⎇∧⁼α³⁼β⁴    If α is 3 and β is 4 (in the hole):
Hole in One  
⎇∧⁼α³⁼¹÷β²  Else if α is 3 and β is 2 or 3 (hit the pin):
Lucky Shot
⎇∧⁼α⁴⁼β²    Else if α is 4 and β is 2 (hit the flag):
Close One
             Else:
¦Try Again
⁺...¦!       Concatenate a ! to the string
P           Print it without changing the cursor position

               Overwrite the appropriate spot with o:
Jαβ         Jump α units right and β units down
o            Print o

3

Brain-Flak , 1466 1938 바이트

(<()>)<>((()()()()()){}){({}[()]<(((((((()()()()()){})){}{}()){}){})<((()()()()()){}){({}[()]<(((((()()){}){}){}){})>)}{}>)((()()()()()){})>)}{}((((()()){}){}){}()){({}[()]<({}<>)<>>)}{}{}{}(((((()()()()()){})){}{}()){})(((((((()()()()()){})){}{}()){}){})<(((()()()){}){}()){({}[()]<({}<>)<>>)}{}{}>)(((()()()){}){}()){({}[()]<({}<>)<>>)}{}{}(((((()()()){}){}){}){}){<>({}<>)}(<>{}((((({}[()])){}){})){}{}{}()<>{}){({}[()]<({}<>)<>>)}{}({}<(((((((()()()){}){})){}{}())){}{}){<>({}<>)}>)(({}<((({}(((()()){}){}){}()){})[()])>)[((((()()){}){}){}){}]){({}[(((()()){}){}){}]){({}[((()()()){}()){}]){{}{}(((((((((()()()){}()){}){}()){}){})[()()()()()])[(()()()){}()])<(((((()()()()()){}){}){}()){}())(((((()()){}){}){}){})>(((()()){}){}){}())(([((()()()){}()){}](({})<>)<>)[((()()){}){}])((<>{}<>[()()()()])[(((()()()()()){}){}){}()])<>}{}{{}((((((((((()()()){}){}){}()){}){}())<>)<>((()()())){}{})[(((()()()()()){})){}{}()])<(((((()()){}){}){}){})((((<>{}<>)((()()()){}()){})[()()()()])[()()()])>[((()()()){}){}])<>}}{}{{}((((((((()()()){}){}){}()){}){}())((()()())){}{})[(((()()()()()){})){}{}()])((((((()()){}){}){}){})<(((((()()()()()){}){({}[()])}{}){})[()()()()()])>)((((((((()()()){}){}){}()){}){}())(()()()){}())()()())((((((()()()){}){}){})){}{})<>}{}}{}{{}(((((((()()()()()){}){({}[()])}{}){})[()()()()()])[((()()){}){}])(()()()){})(((((((((((()()){}){}){}){})))({}<({}{}())>)[()()()()]){}())[(()()()){}()])[(((()()()()()){})){}{}])<>}<>(((((()()){}){}){}()){})

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


내가 이겼어?


첫 번째 출력 행 끝에 널 바이트가 인쇄 된 것 같습니다.
0

@ 1000000000 예. 최신 업데이트로 수정했습니다. 지적 해 주셔서 감사합니다.
MegaTom

2

TI 기본, 183 바이트

Input X
Input Y
X+1➡X
ClrHome
For(I,1,10
Output(I,1,"|
Output(I,12,"|
End
Output(2,4,"|>
Output(3,4,"|
Output(4,4,"O
Output(Y,X,"o
13
Output(1,Ans,"TRY AGAIN!
If X=4 and Y=4
Output(1,Ans,"HOLE IN ONE!
If X=5 and Y=2
Output(1,Ans,"CLOSE ONE!
If Y=2 or Y=3 and X=4
Output(1,Ans,"LUCKY SHOT!

감사합니다 TI-Basic은 토큰을 사용합니다.

|일반적으로 입력 할 수 없지만 문자 세트에 있습니다.

샷 결과가 반드시 소문자인지 알려주세요.

나중에 예제 프로그램 결과의 스크린 샷을 추가하겠습니다.


2

그루비-235 바이트

첫 번째 시도-샷의 X 및 Y 좌표로 0에서 9까지의 정수 2 개를 허용하는 그루비 클로저

{j, k-> j ++; c = ''; b = '|'; f = '>'; h = 'O'; s = ''; v = [2 : b, 3 : b, 4 : h ]; (0..9) .each {y-> l = (b + s * 10 + '| \ n'). chars; l [3] = v [y] ?: s; l [4] = y == 2? f : s; if (k == y) {m = [(s) : '다시 시도하십시오!', (b) : '럭키 샷!', (f) : '닫기!', (h) : '홀인원!'] [ ""+ l [j]]; l [j] = 'o'}; c + = l}; c + = m}

2

Dyalog APL , 147 (또는 127) 바이트

인수로 (y, x)를 사용합니다.

{G10 10''
G[⍳4;3]←' ||O'
G[2;4]←'>'
G[⊃⍵;⊃⌽⍵]←'o'                G[y;x]←
⎕←'|',G,'|'                  Print G with sides
4 3≡⍵:'Hole in One!'         If (y,x)  (4,3)
(⊂⍵)∊2 3∘.,3:'Lucky Shot!'   If (y,x)  {(2,3), (2,3)}
2 4≡⍵:'Close One!'
'Try Again!'}                Else

버전 16.0부터는 새로운 @연산자로 바이트 수를 거의 절반으로 줄일 수 있습니다 .

@ 왼쪽 피연산자를 오른쪽 인수의 오른쪽 피연산자 위치에 넣습니다. NewChars @ Positions ⊢ Data

{⎕←'|','|',⍨' ||O>o'@((2 4)⍵,⍨3,⍨¨⍳4)⊢10 10''
4 3≡⍵:'Hole in One!'
(⊂⍵)∊2 3∘.,3:'Lucky Shot!'
2 4≡⍵:'Close One!'
'Try Again!'}

TryAPL에서 허용되도록 약간 수정 된 코드 :

하나의 구멍 , 럭키 샷 1 , 럭키 샷 2 , 가까운 하나 , 임의


1

터틀 드 , 164 바이트

다시 한번, Turtlèd는 골프와 간단한 것 사이의 가장 단순한 것 (숫자 증가와 같은) 사이의 균형을 보여 주면서 골프 언어를 제외한 모든 것을 이깁니다.

6;11[*'|:'|>;<u]'|rrr'O8:'|u'|>;'|ddd'|l'|uuu<"|>":l'|u'|>11;'|?<:?;( #Try Again!#)(>#Close One!#)(|#Lucky Shot!#)(O#Hole in One!#)'o[|r][ u]dl[|l][ u]u@"-,r["+.r_]

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

반은 0이고 색인은 반입니다. x는 하나의 인덱스이고, y는 0 인덱스이며; 3,3은 하나의 구멍입니다


1

R, 230 226 바이트

M=matrix("|",10,10);M[2:9,]=" ";M[34]="0";M[4,2:3]="f";M[15]=">";function(x,y){m=switch(M[y,x],">"="Close One","f"="Lucky Shot","0"="Hole In One","Try again");M[y,x]="o";cat(m,"!\n",sep="");cat(gsub("f","|",M),sep="",fill=10)}

덕분에 -2 바이트,로 통지가 @billywob하기 M[a,b]에 해당 M[c]의 경우 몇 가지있다.

짜증나게도 , 두 개의 cat호출 (!)은 cat하나 fill의 메시지 로 합쳐질 수 없습니다 . 아아!


1
함수 내에서 행렬 생성을 이동하고 이름이없는 것을 만듭니다.function(x,y){M=matrix("|",10,10);M[2:9,]=" ";M[34]="0";M[4,2:3]="f";M[15]=">";m=switch(M[y,x],">"="Close One","f"="Lucky Shot","0"="Hole In One","Try again");M[y,x]="o";cat(m,"!\n",sep="");cat(gsub("f","|",M),sep="",fill=10)}
Billywob

아, 충분합니다. f=어쨌든 내 솔루션에 필요하다고 생각하지 않습니다 . 제거되었습니다.
JDL
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.