Código Golf Golf Golf

24

Desafío de golf

Dado el siguiente ASCII "Verde".

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

Dejar |denotar una pared
Dejar |denotar la mitad del asta de la bandera
Dejar >denotar la bandera en el poste
Dejar Odenotar el agujero
Dejar odenotar la bola

Las dimensiones del "verde" son 10x10. Hay diez espacios entre las dos paredes |.
También hay diez espacios, vacíos o no, entre la parte superior y la parte inferior del green.

Reto

Ingrese un valor x e y o genere dos números aleatorios para "lanzar" una pelota de golf al green.
Si la x, y generada no toca el agujero o el asta de la bandera / salida de la bandera "¡Inténtalo de nuevo!"
Si la x, y generada golpea la salida del agujero "Hole in One!"
si la x, y generada golpea la salida del polo "Lucky Shot!"
si la x, y generada golpea la salida de la bandera "¡Cerrar uno!"

Después del disparo, muestra la ubicación de la pelota en el green con a o, reemplazando a cualquier personaje que golpee. También haga salir el dicho respectivo arriba.

Ejemplos:

//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       |
|          |
|          |
|          |
|          |
|          |
|          |

Diviértete y buena suerte y como este es el el código más corto gana!

jacksonecac
fuente
¿Está la bandera / asta siempre en la misma posición?
corvus_192
Puede dejarlo donde está, o divertirse y moverlo. Pensé que sería demasiado doloroso moverlo, pero creo que agrega un desafío divertido. Si lo mueve, me aseguraría de que 2 <h <= 10 donde h es el índice de altura del hoyo. De esa manera, la bandera no está fuera de la pantalla.
jacksonecac
2
O tome dos parámetros i y k donde 0 <i <= 10 y 0 <k <= 10 o establezca i y k usando la generación de números aleatorios
jacksonecac
1
@ corvus_192 absolutamente
jacksonecac
1
Esas cadenas de salida son dolorosas para el golf de código. Como todavía no hay respuestas, considere permitir tomarlas como una entrada
Luis Mendo

Respuestas:

10

JavaScript (ES6) 210 208 193 184 bytes

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``)
  • -9 bytes gracias a Hedi

Manifestación

sbisit
fuente
8

Gelatina , 78 bytes

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

Juega un juego de habilidad o un juego de disparos en TryItOnline!

(Crap-shoot cuesta más bytes).

¿Cómo?

ṭḌ‘Ç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)
Jonathan Allan
fuente
8

Pitón 2, 290 264 262 252 248 245 bytes

No es bonito ni corto, pero estoy cansado y es el primero respuesta de Python. Ingrese la toma en formato x, y.

Editar

Golfed off 26 redefiniendo la forma en que se construye la lista. Aún así, no tuve suerte con la larga declaración if.

-2 reemplazando el if largo por un diccionario y un if más corto.

-10 con gracias a @ Noodle9 - me lo perdí :)

-4 - gracias de nuevo :)

Otros 3 de descuento. Gracias.

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

Para cualquiera que esté interesado en la lógica, sin comentarios (1316 bytes, pero aún cabe fácilmente en un disco de 3.5 "si alguien los recuerda):

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

Definitivamente la primera vez para mí que un diccionario ha sido el mejor formato de datos en un desafío de golf.

ElPedro
fuente
puedes usar cualquier cosa que se pueda usar como clave de diccionario
Noodle9
6

C, 236 bytes

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);}

Sin golf:

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);
}
Karl Napf
fuente
3

Scala, 238 bytes

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

Usando la indexación cero.

Esto es demasiado legible :(

Explicación:

(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
  )
}

He usado la fórmula 1+x+13*ypara calcular el índice correcto, ya que cada fila tiene 13 caracteres de largo (2 bordes, una nueva línea y 10 espacios) más un desplazamiento de uno porque (0,0) debería ser el segundo carácter.

corvus_192
fuente
3

Perl, 225 209 bytes

$_="|".$"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

Las dos nuevas líneas literales guardan cada una un byte. Bastante estándar Imprime la declaración, luego el tablero de juego.

Gabriel Benamy
fuente
3

Carbón de leña , 99 bytes

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

Toma una entrada basada en 1, separada por espacios, en stdin. La mayor parte del código es para imprimir (uno de) los cuatro mensajes. Pruébalo en línea!

Nota: el carbón todavía es un trabajo en progreso. Este código funciona a partir de la confirmación actual . Si deja de funcionar en el futuro (en particular, si el enlace TIO no funciona como se esperaba), haga un ping y trataré de agregar una versión actualizada que no compita y que funcione.

Explicación

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
DLosc
fuente
3

Brain-Flak , 1466 1938 bytes

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

Pruébalo en línea!


¿Gané?

MegaTom
fuente
Parece que se imprime un byte nulo al final de la primera línea de salida.
0 '
@ 1000000000 sí. Lo he solucionado con mi última actualización. Gracias por señalar eso.
MegaTom
2

TI-Basic, 183 bytes

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!

Gracias a Dios, TI-Basic usa tokens.

los | no puede normalmente ser mecanografiadas, pero es en el conjunto de caracteres.

Avíseme si el resultado de la toma tiene que estar en minúsculas.

Agregaré una captura de pantalla de un resultado de programa de ejemplo más adelante.

DanTheMan
fuente
2

Groovy - 235 bytes

Mi primer intento: un cierre maravilloso que acepta 2 enteros de 0 a 9 como las coordenadas X e Y para el disparo.

{j, k-> j ++; c = ''; b = '|'; f = '>'; h = 'O'; s = ''; v = [2: b, 3: b, 4: h ]; (0..9) .cada {y-> l = (b + s * 10 + '| \ n'). Caracteres; l [3] = v [y] ?: s; l [4] = y == 2? f: s; if (k == y) {m = [(s): 'Try Again!', (b): 'Lucky Shot!', (f): 'Close One!', (h): '¡Agujero en uno!'] ["" ​​+ l [j]]; l [j] = 'o'}; c + = l}; c + = m}
GolfIsAGoodWalkSpoilt
fuente
2

Dyalog APL , 147 (o 127) bytes

Toma (y, x) como argumento.

{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

Desde la versión 16.0, casi podemos reducir a la mitad el conteo de bytes con el nuevo @operador;

@ pone el operando izquierdo en las posiciones de operando derecho en el argumento derecho: 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!'}

Código ligeramente modificado para permitirlo en TryAPL:

Hoyo en uno , Lucky Shot 1 , Lucky Shot 2 , Close One , Aleatorio

Adán
fuente
1

Turtled , 164 bytes

Una vez más, mostrando el equilibrio de Turtlèd entre golfiness y verbosidad para las cosas más simples (como incrementar un número), Turtlèd supera a todos menos a los langostas del golf.

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_]

Pruébalo en línea

Tenga en cuenta que es mitad cero indexado y mitad indexado; x es uno indexado, y es cero indexado; 3,3 es un hoyo en uno

Limón Destructible
fuente
1

R, 230 226 bytes

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

Gracias a @billywob por -2 bytes, darse cuenta M[a,b]es equivalente a M[c]en un par de casos.

Molesto, las dos catllamadas (!) No pueden catcombinarse en una sola, ya que el fillargumento desordena el mensaje. Argh!

JDL
fuente
1
Mueva la creación de la matriz dentro de la función y 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)}
cree
Oh, bastante justo. Eso sí, no creo que necesitara f=mi solución de todos modos. Remoto.
JDL