Seu programa precisa imprimir vários espaços, seguidos por um ponto e uma nova linha. O número de espaços é a posição x do seu ponto definido com 0 <x <30
Cada nova linha é uma vez. Seu programa é executado por 30 turnos. Seu programa começa com uma posição x aleatória e a cada turno muda essa posição aleatoriamente em 1 para a esquerda ou direita, enquanto permanece dentro da área definida. A cada volta, seu ponto deve mudar sua posição em 1.
Sua pontuação é o número de caracteres. Você ganha 10 pontos de bônus, se cada linha impressa tiver exatamente 30 caracteres (e nova linha). Você ganha 50 pontos de bônus, se aleatoriamente, seu programa tende a permanecer no meio da área definida.
Editar: Os 50 pontos de bônus destinam-se a puxar o seu ponto para o meio. Por exemplo, isso se aplica se o seu ponto estiver em x = 20 e tiver uma chance de 66% para a esquerda e 33% para a direita. Isso deve ser independente do ponto de partida e só deve ocorrer alterando o valor percentual de esquerda / direita dinamicamente.
Nenhuma entrada de qualquer tipo é permitida; a saída deve estar no console de execução!
Para uma melhor compreensão, aqui está um exemplo legível em java, que lhe daria uma pontuação 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);
deveria ser oint i = 1 + (int)(Math.random()*29);
contrário. Como é, gera um número em0 >= x > 30
vez de0 > x > 30
.Respostas:
APL, 39 - 10 - 50 = –21
Testado em Dyalog com
⎕IO←1
e⎕ML←3
mas deve ser bastante portátil.Explicação
A cada passo, esse código decide se o ponto deve ser movido para a esquerda ou para a direita, dependendo da probabilidade de um número aleatório escolhido entre (1,5 2,5 ... 27,5 28,5) ser menor que a posição atual do ponto.
Portanto, quando a posição atual do ponto (número de espaços à esquerda) é 1, o incremento é sempre +1 (todos esses números 1,5 ... 28,5 são> 1), quando é 29, é sempre -1 (todos esses números são <29); caso contrário, é escolhido aleatoriamente entre +1 e -1, com uma probabilidade de interpolação linear entre esses extremos. Portanto, o ponto está sempre se movendo e sempre mais propenso a se mover para o centro do que para os lados. Se estiver exatamente no meio, ele tem 50% de chance de se mover para qualquer um dos lados.
A redução (dobra à direita) de um valor replicado
{...}/a/b
é apenas um truque que eu inventei para repetir osa-1
tempos de uma função , começando com valueb
e tendo como resultado o resultado de cada iteração o⍵
argumento acumulator ( ) para o próximo. O segundo e o próximo argumento de entrada (⍺
), bem como o resultado final, são ignorados. Acontece que é muito mais curto do que uma chamada recursiva regular com guarda.Exemplo de execução
fonte
+/2×⍳9
é lida "a soma de: duas vezes: as naturais até 9", mas é executado da maneira oposta.⎕←30↑...
irá imprimir 30 caracteres além de uma nova linha, não importa qual seqüência está em...
Mathematica 138 - 10 - 50 = 78
Não estou publicando isso porque acho que é particularmente bom, mas por outros motivos. Ele usa uma definição de Processo de Markov com uma matriz de transição projetada para deixar a bola "centralizada".
O uso de um processo de Markov no Mathematica nos permite calcular algumas estatísticas úteis , como você verá abaixo.
Primeiro o código (espaços não necessários):
Algumas saídas:
A matriz de transição que usei é:
Mas como eu disse, a parte interessante é que o uso
DiscreteMarkovProcess[]
permite capturar uma boa imagem do que está acontecendo.Vamos ver a probabilidade da bola estar
15
a qualquer momento at
partir de um estado aleatório específico :Você pode ver que ele varia entre 0 e um valor próximo de 0,3, porque, dependendo do estado inicial, você pode alcançar apenas 15 em um número ímpar ou par de etapas :)
Agora podemos fazer a mesma coisa, mas dizendo ao Mathematica para considerar a estatística a partir de todos os possíveis estados iniciais. Qual é a probabilidade de ficar
15
depois de um tempot
?Você pode ver que também oscila ... por quê? A resposta é simples: no intervalo,
[1, 29]
existem mais números ímpares do que pares :)A oscilação quase desapareceu se pedirmos a probabilidade da bola estar em
14 OR 15
:E você também pode pedir o limite (no sentido Cesaro) das probabilidades de estado:
Bem, talvez eu mereça alguns votos negativos por uma resposta tão fora de tópico. Fique à vontade.
fonte
Bash, pontuação 21 (81 bytes - bônus 50 - bônus 10)
Nesta resposta, o ponto é "puxado" de volta para o meio. Isso pode ser testado codificando o ponto de partida em 0 ou 30.
fonte
{1..30}
por{P..m}
o
for1
eRANDOM%30
retornar0
? E na próxima iteração também?Ruby
696664-60 = 4Amostra:
fonte
i=rand 30;
vez dei=rand(30);
.Smalltalk,
161159145-60 = 85todas as colunas têm 30 caracteres (operando na sequência mutável b);
a chance de movimento aleatório é ajustada enviesando o valor rnd com p (rnd (0..29) -p), pegando o sinal (-1/0/1) e depois ajustando para (-1 / + 1) via (-1 | 1), que é tomado como delta de movimento (calcula efetivamente: sinal x <= 0 ifTrue: -1 ifFalse: 1). Como o ST usa a indexação baseada em 1, eu tenho que ajustar todas as referências de string em +1 (por favor, aprecie o hack de -1 | 1 bit ;-)).
roubando uma ideia da versão Ruby (thanx & Up @fipgr), posso me livrar da verificação min / max:
output: (Adicionei manualmente os números de coluna e as barras verticais; o código acima não os gera)
fonte
C, 86
Supondo que a propagação da
rand()
função não seja necessária.Explicação:
Em C,
"%*c"
nos*
meios que o comprimento da saída irá ter um comprimento mínimo, e este comprimento mínimo é determinado pelo argumento da chamada de função (neste caso, ele éi+=i==30?-1:i==1||rand()%2?1:-1
. Osc
meios do próximo argumento (46
) é um personagem ( o ponto).Quanto à verificação de limites, peço desculpas por ter esquecido disso. Eu agora adicionei isso à resposta, ao custo de 15 caracteres. O operador ternário funciona da seguinte maneira:
boolean_condition?value_if_true:value_if_false
. Observe que em C verdadeiro é 1 e falso é 0.fonte
printf("%*c\n",i+=rand()%2?1:-1,46)
os espaços são impressos, bem como evita que o ponto passe dos 29. Agradecemos antecipadamente. (Desculpe, eu não sou um programador em C.) #rand()%2
pois é muito previsível (curvas pares / ímpares)? Eu tentei o seurand()%2
na minha solução PHP, e ele exibiu esse comportamento muito previsível (ao contráriorand(0,1)
. Como o PHP faz muito uso das bibliotecas C (se eu estiver correto), eu queria saber se o seu programa C tem a mesma 'falha' .rand()
função. Em C, serand()
não for propagado explicitamente, ele sempre usa a mesma semente todas as vezes. É por isso que é previsível. Se eu tivesse a semente que eu posso fazersrand(time());
que custa 14 caracteresrand()
não precisam mais ser propagadassrand()
, mas ainda mostram esse comportamento estranho .Java:
204183182176175 caracteres - 10 - 50 = 115Primeiro, a posição do ponto deve ser
0 < x < 30
, ou seja, [1-29]. Isso gera um número entre 0 e 28 distribuído uniformemente e, para os propósitos deste programa, [0-28] tem o mesmo efeito que [1-29]:Pessoalmente, preferi que fosse distribuído normalmente por volta dos 14 anos, mas minha resposta seria mais longa:
Segundo, esse código garante que ele tende a estar no meio:
A probabilidade de obter +1 é maior, pois menor é o valor de
i
, e temos o oposto de -1. Sei
for 0, a probabilidade de obter +1 é 100% e a probabilidade de obter -1 é 0%. Sei
for 28, o oposto disso acontecerá.Terceiro, substituindo o
32
no final por'_'
para ver a saída mais fácil, vemos que cada linha tem 30 caracteres mais uma nova linha:Agradecemos a @VadimR (agora, user2846289) por apontar um mal-entendido em uma versão anterior.
Obrigado a @KevinCruijssen por cortar 6 caracteres, mesmo depois de mais de dois anos e meio depois que esta resposta foi postada inicialmente.
fonte
i
chegar0
é ilegal, não é?i
está no intervalo [0-29]. Isso é equivalente a [1-30] ou [288-317], a saída seria a mesma. O que importa é que existem 30 números inteiros no intervalo [0-29].i
não pode ser0
. Eu entendo que é tudo sobre se divertir, mas ainda é triste.i
recebe1
inicialmente, e na primeira iteraçãoMath.random()
é0
, em seguida,i
recebe0
. Por favor, não me interpretem mal, não se trata da sua resposta. Antes, sobre minha incapacidade de ler a maioria dos idiomas que não sejam do tipo C. Então, sem reação (exceto votos positivos) sobre erros, como posso saber se eles estão certos ou não?Mathematica 157-10-50 = 97
Um número aleatório de 1 a 30 é usado para iniciar. Todos os números de colunas restantes do ponto são escolhidos via
RandomChoice[If[c > 15, {2, 1}, {1, 2}] -> {-1, 1}] + c
, que se traduz em: "Se o número da coluna anterior for maior que 15, selecione um número no conjunto {-1,1}, com -1 ponderado 2: 1 em relação a 1; caso contrário, gire os pesos e escolha entre o mesmo conjunto.ReplacePart
substitui o elemento em uma lista de 30 espaços em branco que correspondem à coluna de interesse.fonte
RandomChoice[]
> <>, 358 - 10 = 348
Isso não vai ganhar no codegolf, mas funciona. (No Windows 7 com esse intérprete , que implementa a instrução "p" de maneira diferente da definida pela página esolang)
O nome desse idioma não pode ser pesquisado no Google, então aqui está o artigo esolang para os curiosos.
fonte
PHP,
118113112111 (, -10 pontos de bônus = 101)(segunda tentativa, com
rand()
comportamento terrivelmente previsível e um pouco mais de eficiência)Resultado possível:
PHP, 130 (, -10 pontos de bônus = 120)
(primeira tentativa)
Provavelmente isso ainda pode ser muito mais eficiente:
Se eu substituir o espaço por um sublinhado (para fins de exibição), este é um resultado possível:
Curiosamente, se eu substituir
rand(0,1)
pelorand()%2
(PHP 5.4, no Windows XP), o resultado aleatório sempre muda de ímpar para par e vice-versa, a cada próxima iteração, tornando-orand()
preocupante e previsível, nesse sentido, de repente. Esse 'bug' parece ser um conhecido desde 2004 . Não tenho certeza se é exatamente o mesmo 'bug'.fonte
J 42 caracteres - 50 -10 = -18
Explicação, começando pela direita (alguns conhecimentos sobre trens são úteis):
Tendência central, -50, exemplo em 1000 execuções:
Exemplo de execução, produzindo exatamente 30 bytes por linha
fonte
Python 2.7:
126109 -10-50 = 49Livre-se do ponto de partida codificado - agora começa em ponto aleatório. Por causa disso, eu precisava de randint, então decidi usá-lo em vez da escolha para o deslocamento. Utilizou o truque bool (-1) ** para isso.
Algumas ótimas respostas aqui. Primeira tentativa em Python, pensando em melhorias. Não é ajudado pela necessidade de uma importação.
-10 - sim 30 caracteres + \ n em cada linha
-50 - quanto mais longe do centro, maior a probabilidade de um movimento para o outro lado (realizado através da construção de uma lista com um número diferente de + / i deslocamentos)
Tentativa anterior:
fonte
for
loop pode estar em uma linha, mas ainda melhorfor i in[0]*30:
e melhor aindaeval"..."*30
.Java -
198183 caracteresEste é apenas um exemplo claro, simples, direto e não criativo do exemplo que você deu na pergunta.
fonte
Lote - (288 bytes - 10) 278
Sem golfe:
Para gerar espaços em vez de sublinhados - 372 bytes -
Procurando alguma ajuda com a seguinte lógica, certamente esse não é o método com mais espaço eficiente (! R! Será expandido para 1 ou 2) -
Golfe:
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
fonte
J, 42 caracteres, sem bônus
Exemplo de execução:
fonte
Python 2.7 (126 - 10 (comprimento da correção) - 50 (Tendência central) = 66)
O programa a seguir tem uma tendência central em uma amostra maior
Demo
fonte
Javascript
125737260 (120 - 50 - 10)EDIT: Correção para bônus de 50 pontos e bônus de 10 pontos.
EDIT 2: Ainda mais curto!
fonte
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
trabalho; teve que fazer um tempo.D -
167,162, 144 (154 - 10)Golfe :
Sem golfe :
EDIÇÃO 1 - Não tenho certeza se meu código se qualifica para o bônus -50 ou não.
i
nem sempre começar no meio, mas durante ofor
ciclo, o ponto nunca se move mais do que como 3 lugares qualquer direção, por isso, quandoi
se começar perto do meio, a coisa toda tende a ficar lá também.EDIT 2 - O código agora se qualifica para o bônus -10, pois imprime uma matriz de 29 caracteres seguida por LF para um total de exatamente 30 caracteres por linha.
fonte
PowerShell, 77 - 10 - 50 = 17
Resultado
fonte
$x=random 30;1..30|%{' '*($x+=,-1*$x+,1*(29-$x)|random)+'.'|% *ht 30}
. 66 bytes - 10 - 50 = 6 pontosR, 107 caracteres - bônus de 60 pontos = 47
i
é o índice do ponto.a
é a matriz de 30 espaços. O ponto de partida é aleatório (uniformemente de 1 a 29). Em cada iteração, adicionamos aleatoriamente -1 ou +1 ai
com probabilidades ponderadas:i-1
for-1
e29-i
for+1
(os valores alimentados como probabilidades não precisam somar uma), o que significa que ele tende a orientar o ponto em direção ao centro, impedindo-o de baixo 1 ou acima de 29 (desde que a probabilidade caia para 0 em ambos os casos).Exemplo executado com
_
espaços em vez de legibilidade:fonte
i
pode ser um0
ou outro30
, não?s(1:29,1)
pors(29,1)
.C # 184 - 10 - 50 = 123
Resultado
spacesubstituído _por legibilidade.
fonte
if...else if...else
no final do código. Além disso, sua saída me faz duvidar de que tende a estar no meio, mas seu código parece estar correto.r.Next(30)<p?-1:1;
faz acontecer. Não tenho certeza se você pode ir menor com asif
instruções.switch
é grande por causa do obrigatóriobreak
/return
e a finalelse
exige umdefault:{}
caso e que também é longo.p
for zero, o valorp+=r.Next(30)<p?-1:1;
sempre será 1; portanto, não é necessárioif(p==0)
. O mesmo vale parap==29
.p
nunca terá 30 anos, então você pode se livrar doelse if
.PHP
Com o bônus de centralização: 82 - 50 = 32
Para esta versão (versões antigas abaixo), remova a verificação de mínimo / máximo, conforme o código de centralização.
rand(1,28)
torna-se importante aqui, pois permite o$i++
aumento de até 29 (máximo real).editar: parênteses desnecessários, código de deslocamento movido
Algoritmo simples de centralização: gera um novo número entre 0 e 29 e o compara ao atual. Aproveita a "probabilidade" de obter um número do lado maior para desenhar em direção ao centro.
Resultado real: (numeração de linha adicionada posteriormente)
Arquivado:
$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 caracteresfonte
JavaScript ES6 125 - 10 (30 linhas de caracteres) - 50 (muda para o meio) = 65
Eu tive uma epifania subindo o elevador até a minha unidade, então tive que descer antes que deixasse minha memória ...
Um pouco de shuffling posicional variável e um pouco de criatividade para calcular a probabilidade de deslocamento indicada por
x/t
... (Obrigado Kostronor por apontá-lo!) Agora, ganho o bônus de -50 por deslocamento para o meio e também fiz a posição inicial dentro do gama completa da linha, o que me permitiu barbear dois bytes!fonte
15+r()*2
qual pode haver algo entre 15 e 16.9999999998 ou mais que possa arredondar para 17. o adicionalx+=r()<.5?-1:1
lança um pouco mais de aleatoriedade, elevando-o para um intervalo de 14 a 18, portanto, tecnicamente, um número aleatório que está dentro da definição do que foi solicitado ... Ao dobrar essa regra, o flip (+1, -1), na maioria dos casos trazê-lo de volta para o meio ...;)k, 53 - 10 - 50 = -7
Solução 1
Uso
Solução 2
fonte
Scala, 95 - 10 = 85 bytes
Ainda estou pensando no bônus de 50 bytes.
Explicação:
fonte
Javascript, 125 (135 - 10)
Comentários e conselhos são bem-vindos.
fonte
Javascript
114 caracteres - 10 (30 linhas de caracteres) - 50 (puxe o ponto para o meio) = 54
No entanto, notei que uma recompensa de 10 caracteres por preencher as linhas com 30 caracteres pode ser um mau negócio; assim:
102 caracteres - 50 (puxe o ponto para o meio) = 52
Parabéns a @WallyWest pela condição de direção de extração simplificada
f()>k/29?1:-1
, meu primeiro rascunho usou duas condicionais aninhadas.fonte
Raquete 227 bytes (-10 para 30 caracteres, -50 para deslocamento para a linha média = 167)
A cada passo, o ponto tem duas vezes mais chances de se mover para a linha média do que para longe dele:
Ungolfed:
Teste:
Resultado:
fonte