Su programa tiene que imprimir varios espacios, seguidos de un punto y una nueva línea. El número de espacios es la posición x de su punto definido con 0 <x <30
Cada nueva línea es un turno. Su programa se ejecuta durante 30 turnos. Su programa comienza con una posición x aleatoria y cada giro cambia esta posición aleatoriamente en 1 a la izquierda o derecha, mientras permanece dentro del área definida. Cada vez que su punto tiene que cambiar su posición por 1.
Tu puntuación es la cantidad de caracteres. Obtiene 10 puntos de bonificación, si cada línea impresa consta de exactamente 30 caracteres (y nueva línea). Obtiene 50 puntos de bonificación si, si bien es aleatorio, su programa tiende a permanecer en el centro del área definida.
Editar: Los 50 puntos de bonificación están destinados a tirar de su punto hacia el medio. Por ejemplo, esto se aplica si su punto está en x = 20 y tiene una probabilidad de 66% de ir a la izquierda y 33% de ir a la derecha. Esto tiene que ser independiente del punto de partida y solo debe suceder alterando el valor porcentual de izquierda / derecha dinámicamente.
No se permite ninguna entrada de ningún tipo, ¡la salida debe estar en la consola de ejecución!
Para una mejor comprensión, aquí hay un ejemplo legible en Java, que le daría una puntuación de 723:
public class DotJumper{
public static void main(String[] args){
int i = (int)(Math.random()*30);
int max = 29;
int step = 1;
int count = 30;
while(count>0){
if(i<=1){
i+=step;
}else if(i>=max){
i-=step;
}else{
if(Math.random() > 0.5){
i+=step;
}else{
i-=step;
}
}
print(i);
count--;
}
}
public static void print(int i){
while(i>0){
System.out.print(' ');
i--;
}
System.out.println('.');
}
}
int i = (int)(Math.random()*30);
debería serint i = 1 + (int)(Math.random()*29);
en su lugar. Como es, genera un número en0 >= x > 30
lugar de0 > x > 30
.Respuestas:
APL, 39-10-50 = –21
Probado en Dyalog con
⎕IO←1
y,⎕ML←3
pero debería ser bastante portátil.Explicación
En cada paso, este código decide si mover el punto hacia la izquierda o hacia la derecha dependiendo de la probabilidad de que un número aleatorio elegido entre (1.5 2.5 ... 27.5 28.5) sea menor que la posición actual del punto.
Por lo tanto, cuando la posición actual del punto (número de espacios a la izquierda) es 1, el incremento siempre es +1 (todos esos números 1.5 ... 28.5 son> 1), cuando es 29 siempre es -1 (todos esos números son <29); de lo contrario, se elige al azar entre +1 y -1, con una probabilidad de que sea una interpolación lineal entre esos extremos. Entonces, el punto siempre se mueve y siempre es más probable que se mueva hacia el centro que hacia los lados. Si está exactamente en el medio, tiene un 50% de posibilidades de moverse a cualquier lado.
La reducción (plegado a la derecha) de un valor replicado
{...}/a/b
es solo un truco que se me ocurrió para repetir losa-1
tiempos de una función , comenzando con el valorb
y haciendo que el resultado de cada iteración sea el⍵
argumento del acumulador ( ) para el siguiente. Se⍺
ignoran los argumentos de entrada segundo y siguiente ( ), así como el resultado final. Resulta ser mucho más corto que una llamada recursiva regular con guardia.Ejecución de ejemplo
fuente
+/2×⍳9
se lee "la suma de: dos veces: los naturales hasta 9" pero es ejecutado de manera opuesta.⎕←30↑...
imprimirá 30 caracteres más una nueva línea, sin importar en qué cadena esté...
Mathematica 138 - 10 - 50 = 78
No estoy publicando esto porque creo que está particularmente bien golfizado, pero por otras razones. Utiliza un proceso de Markov definición de con una matriz de transición diseñada para "centrar" la pelota.
El uso de un proceso de Markov en Mathematica nos permite calcular algunas estadísticas útiles , como verá a continuación.
Primero el código (espacios no necesarios):
Algunas salidas:
La matriz de transición que utilicé es:
Pero como dije, la parte interesante es que usar
DiscreteMarkovProcess[]
nos permite tomar una buena imagen de lo que está sucediendo.Veamos la probabilidad de que la pelota esté
15
en cualquier momento at
partir de un estado aleatorio particular :Puede ver que fluctúa entre 0 y un valor cercano a 0.3, eso se debe a que, dependiendo del estado inicial, solo puede alcanzar 15 en un número impar o par de pasos :)
Ahora podemos hacer lo mismo, pero diciéndole a Mathematica que considere la estadística a partir de todos los estados iniciales posibles. ¿Cuál es la probabilidad de estar
15
después de un tiempot
?Puedes ver que también oscila ... ¿por qué? La respuesta es simple: en el intervalo
[1, 29]
hay más números impares que pares :)La oscilación casi desaparece si preguntamos por la probabilidad de que la pelota esté en
14 OR 15
:Y también podría pedir el límite (en el sentido de Cesaro) de las probabilidades estatales:
Oh, bueno, tal vez merezco algunos votos negativos para una respuesta tan fuera de tema. Sentirse libre.
fuente
Bash, puntaje 21 (81 bytes - 50 bonus - 10 bonus)
En esta respuesta, el punto se "jala" hacia el centro. Esto se puede probar codificando el punto de partida en 0 o 30.
fuente
{1..30}
por{P..m}
o
es1
yRANDOM%30
vuelve0
? ¿Y en la próxima iteración también?Rubí
696664-60 = 4Muestra:
fuente
i=rand 30;
lugar dei=rand(30);
.Smalltalk,
161159145-60 = 85todas las columnas tienen 30 caracteres de largo (operan en una cadena mutable b);
La posibilidad de movimiento aleatorio se ajusta al sesgar el valor rnd con p (rnd (0..29) -p), tomar el signo (-1/0/1) y luego ajustarlo a (-1 / + 1) a través de (-1 | 1), que se toma como mover delta (efectivamente calcula: signo x <= 0 ifTrue: -1 ifFalse: 1). Como ST usa indexación basada en 1, tengo que ajustar todas las referencias de cadena en +1 (por favor, aprecio el truco de violín -1 | 1 bit ;-)).
Robando una idea de la versión Ruby (gracias y Up @fipgr), puedo deshacerme de la verificación min / max:
salida: (he agregado manualmente los números col y las barras verticales después; el código anterior no los genera)
fuente
C, 86
Asumiendo que
rand()
no se requiere sembrar la función.Explicación:
En C, en
"%*c"
los*
medios que la longitud de la salida tendrá una longitud mínima, y esta longitud mínima se determina por el argumento de la llamada de función (en este caso, esi+=i==30?-1:i==1||rand()%2?1:-1
. Losc
medios de la siguiente argumento (46
) es un personaje ( el punto).En cuanto a la verificación de límites, me disculpo por haberme olvidado de eso. Ahora he agregado esto a la respuesta, a costa de 15 caracteres. El operador ternario funciona de la siguiente manera:
boolean_condition?value_if_true:value_if_false
. Tenga en cuenta que en C verdadero es 1 y falso es 0.fuente
printf("%*c\n",i+=rand()%2?1:-1,46)
imprime los espacios, así como cómo evita que el punto se mueva más allá de 29. Gracias de antemano. (Lo siento, no soy un programador en C.)rand()%2
en que es muy predecible (turnos pares / impares)? Probé surand()%2
en mi solución PHP, y exhibió este comportamiento muy predecible (a diferencia derand(0,1)
. Dado que PHP hace mucho uso de las bibliotecas C (si estoy en lo correcto), me preguntaba si su programa C tiene el mismo 'defecto' .rand()
función. En C sirand()
no se siembra explícitamente, siempre usa la misma semilla cada vez. Por eso es predecible. Si tuviera quesrand(time());
rand()
no necesitan ser sembradas consrand()
, pero aún muestran este comportamiento extraño .Java:
204183182176175 caracteres - 10 - 50 = 115Primero, la posición del punto debe ser
0 < x < 30
, es decir, [1-29]. Esto genera un número entre 0 y 28 distribuidos uniformemente, y para los propósitos de este programa [0-28] tiene el mismo efecto que [1-29]:Personalmente, prefería que se distribuyera normalmente alrededor de 14, pero mi respuesta sería más larga:
Segundo, este código asegura que tiende a estar en el medio:
La probabilidad de obtener +1 es mayor ya que menor es el valor de
i
, y tenemos el opuesto para -1. Sii
es 0, la probabilidad de obtener +1 es 100% y la probabilidad de obtener -1 es 0%. Sii
es 28, sucederá lo contrario.Tercero, al reemplazar el
32
al final por'_'
para ver la salida más fácilmente, vemos que cada línea tiene 30 caracteres más una nueva línea:Gracias a @VadimR (ahora, usuario 2846289) por señalar un malentendido en una versión anterior.
Gracias a @KevinCruijssen por eliminar 6 caracteres, incluso después de más de dos años y medio después de que esta respuesta se publicara inicialmente.
fuente
i
llegar0
es ilegal, ¿no?i
está en el rango [0-29]. Esto es equivalente a [1-30] o [288-317], la salida sería la misma. Lo que importa es que hay 30 números enteros en el intervalo [0-29].i
No puede ser0
. Entiendo que se trata de divertirse, pero aún así es triste.i
obtiene1
inicialmente, y en la primera iteraciónMath.random()
es0
, luegoi
obtiene0
. Por favor, no me malinterpretes, no se trata de tu respuesta. Más bien sobre mi incapacidad para leer la mayoría de los idiomas que no sean C-like. Luego, sin ninguna reacción (excepto los votos a favor) sobre los errores, ¿cómo puedo saber si son correctos o no?Mathematica 157-10-50 = 97
Se utiliza un número aleatorio del 1 al 30 para comenzar. Todos los números de columna restantes del punto se eligen mediante
RandomChoice[If[c > 15, {2, 1}, {1, 2}] -> {-1, 1}] + c
, lo que se traduce en: "Si el número de columna anterior era mayor que 15, seleccione un número del conjunto {-1,1}, con -1 ponderado 2: 1 con respecto a 1; de lo contrario, voltee los pesos y elija del mismo conjunto.ReplacePart
reemplaza el elemento en una lista de 30 espacios en blanco que corresponde a la columna de interés.fuente
RandomChoice[]
> <>, 358-10 = 348
Esto no ganará en codegolf, pero funciona. (En Windows 7 con este intérprete , que implementa la instrucción "p" de forma diferente a como la define la página esolang)
El nombre de este idioma no se puede buscar en Google, así que aquí está su artículo de esolang para curiosos.
fuente
PHP,
118113112111 (, -10 puntos de bonificación = 101)(segundo intento, con un
rand()
comportamiento horriblemente predecible y un poco más de eficiencia)Posible resultado:
PHP, 130 (, -10 puntos de bonificación = 120)
(primer intento)
Esto probablemente aún podría ser mucho más eficiente:
Si reemplazo el espacio con un guión bajo (para fines de visualización), este es un posible resultado:
Por extraño que parezca, si lo reemplazo
rand(0,1)
conrand()%2
(PHP 5.4, en Windows XP), el resultado aleatorio siempre cambia de impar a par, y viceversa, en cada próxima iteración, lo que hace que searand()
preocupantemente predecible, en ese sentido, de repente. Este 'error' parece ser uno que se conoce desde 2004 . Sin embargo, no estoy completamente seguro de si es exactamente el mismo 'error'.fuente
J 42 caracteres - 50-10 = -18
Explicación, comenzando por la derecha (algunos conocimientos sobre trenes son útiles):
Tendencia central, -50, ejemplo en más de 1000 carreras:
Ejemplo ejecutado, generando exactamente 30 bytes por línea
fuente
Python 2.7:
126109 -10-50 = 49Se deshizo del punto de partida codificado, ahora comienza en un punto aleatorio. Debido a esto, necesitaba randint, así que decidí usar eso en lugar de elegir el desplazamiento. Usé el truco (-1) ** bool para eso.
Algunas buenas respuestas aquí. Primer intento en Python, pensando en mejoras. No ayudado por la necesidad de una importación.
-10 - sí 30 caracteres + \ n en cada línea
-50 - cuanto más lejos del centro, más probabilidades hay de moverse hacia el otro lado (logrado mediante la creación de una lista con un número diferente de desplazamientos + / i)
Intento previo:
fuente
for
bucle puede estar todo en una línea, pero aún mejor esfor i in[0]*30:
y aún mejoreval"..."*30
.Java -
198caracteresEste es solo un golf simple, directo, directo y poco creativo del ejemplo que usted dio en la pregunta.
fuente
Lote - (288 Bytes - 10) 278
Sin golf:
Para generar espacios en lugar de guiones bajos - 372 Bytes -
Buscando ayuda con la siguiente lógica, seguramente este no es el método más eficiente en cuanto al espacio (! R! Se expandirá a 1 o 2) -
Se juega golf a:
if !r!==1 (if !p! GTR 1 (set/ap-=1)else set/ap+=1)else if !r! LSS 30 (set/ap+=1)else set/ap-=1
fuente
J, 42 caracteres, sin bonificaciones
Ejemplo de ejecución:
fuente
Python 2.7 (126-10 (longitud fija) - 50 (Tendencia central) = 66)
El siguiente programa tiene una tendencia central sobre una muestra más grande
Manifestación
fuente
Javascript
125737260 (120 - 50 - 10)EDITAR: corrige la bonificación de 50 puntos y la bonificación de 10 puntos.
EDIT 2: incluso más corto!
fuente
r=Math.random;s=r()*30|0;for(i=0;i++<30;a=Array(30)){a[s=s>28?28:s?r()<s/30?s-1:s+1:1]='.';console.log(a.join(' '))}
for
embargo, no se pudo obtener la matriz init dentro del trabajo; tuvo que usar un tiempo mientras.D -
167,162144 (154-10)Golfizado :
Sin golf :
EDITAR 1 : no estoy muy seguro de si mi código califica para el bono de -50 o no.
i
no siempre empieza en el medio, pero durante elfor
bucle, el punto no se mueve más de 3 lugares, como cualquier dirección, por lo que cuandoi
no empezar a cerca de la mitad, todo tiende a permanecer allí también.EDITAR 2 : el código ahora califica para la bonificación de -10, ya que imprime una matriz de 29 caracteres seguidos de LF para un total de exactamente 30 caracteres por línea.
fuente
PowerShell, 77-10-50 = 17
Salida
fuente
$x=random 30;1..30|%{' '*($x+=,-1*$x+,1*(29-$x)|random)+'.'|% *ht 30}
. 66 bytes -R, 107 caracteres - 60 puntos de bonificación = 47
i
es el índice del punto.a
es la matriz de 30 espacios. El punto de partida es aleatorio (uniformemente del 1 al 29). En cada iteración agregamos aleatoriamente -1 o +1i
con probabilidades ponderadas:i-1
para-1
y29-i
para+1
(los valores alimentados como probabilidades no necesitan sumar uno), lo que significa que tiende a orientar el punto hacia el centro mientras lo evita desde abajo 1 o superior a 29 (ya que su probabilidad cae a 0 en ambos casos).Ejemplo ejecutado con en
_
lugar de espacios para legibilidad:fuente
i
puede ser uno0
o30
no?s(1:29,1)
pors(29,1)
.C # 184-10-50 = 123
Salida
spacereemplazado _por legibilidad.
fuente
if...else if...else
al final de su código. Además, su salida me hace dudar de que tiende a estar en el medio, pero su código parece ser correcto.r.Next(30)<p?-1:1;
hace que suceda. No estoy seguro de que pueda ir más pequeño con lasif
declaraciones.switch
es grande debido a lo obligatoriobreak
/return
y la finalelse
requiere undefault:{}
caso y eso también es largo.p
es cero,p+=r.Next(30)<p?-1:1;
siempre obtendrá 1, por lo que no es necesarioif(p==0)
. Lo mismo parap==29
.p
nunca será 30, así que puedes deshacerte de élelse if
.PHP
Con la bonificación de centrado: 82 - 50 = 32
Para esta versión (versiones anteriores a continuación), se eliminó la comprobación mínima / máxima, ya que eso se ocupa en el código de centrado.
rand(1,28)
se vuelve importante aquí ya que permite la$i++
que se empuje hasta 29 (máximo real).editar: paréntesis innecesario, código de desplazamiento movido
Algoritmo simple para centrar: genera un nuevo número entre 0 y 29 y lo compara con el actual. Aprovecha la "probabilidad" de obtener un número en el lado más grande para dibujar hacia el centro.
Resultado real: (numeración de línea agregada después)
Archivado:
$i=rand(0,29);for($c=0;$c++<30;){($i<1?$j=1:($i>28?$j=28:$j=rand(0,29)));($j<$i?$i--:$i++);echo pack("A$i",'').".\n";}
119 caracteres$i=rand(0,29);for($c=0;$c++<30;){($i<1?$i++:($i>28?$i--:(rand(0,29)<$i?$i--:$i++)));echo pack("A$i",'').".\n";}
112 caracteresfuente
JavaScript ES6 125-10 (30 líneas de caracteres) - 50 (se desplaza hacia el centro) = 65
Tuve una epifanía subiendo por el ascensor a mi unidad, así que tuve que bajarla antes de que saliera de mi memoria ...
Un poco de barajado de posición variable y un poco de creatividad para calcular la probabilidad de cambio indicada por
x/t
... (¡Gracias Kostronor por señalarlo!) Ahora obtengo la bonificación de -50 por el cambio al medio, y también hice la posición inicial dentro del rango completo de la línea, lo que me permitió afeitar dos bytes!fuente
15+r()*2
que podría ser de 15 a 16.9999999998 más o menos que podría redondear fuera a 17. losx+=r()<.5?-1:1
lanzamientos adicionales arrojan un poco más de aleatoriedad al llevarlo a un rango de 14 a 18, por lo que técnicamente es un número aleatorio que está dentro de la definición de lo que se pidió ... Al doblar esa regla, el flip (+1, -1) en la mayoría de los casos lo traerá de regreso al medio ...;)k, 53-10-50 = -7
Solución 1
Uso
Solución 2
fuente
Scala, 95-10 = 85 bytes
Todavía estoy pensando en el bono de 50 bytes.
Explicación:
fuente
Javascript, 125 (135-10)
Comentarios y consejos son bienvenidos.
fuente
JavaScript
114 caracteres - 10 (30 líneas de caracteres) - 50 (tire del punto hacia el centro) = 54
Sin embargo, noté que una recompensa de 10 caracteres por llenar las líneas con 30 caracteres puede ser un mal negocio; entonces:
102 caracteres - 50 (tire del punto hacia el centro) = 52
Felicitaciones a @WallyWest por la dirección de extracción simplificada condicional
f()>k/29?1:-1
, mi primer borrador usó dos condicionales anidados.fuente
Raqueta 227 bytes (-10 para 30 caracteres, -50 para cambio a línea media = 167)
En cada paso, es más probable que el punto se mueva hacia la línea media que lejos de él:
Sin golf:
Pruebas:
Salida:
fuente