Há um jogo que eu gosto de jogar. Isso acontece em uma grade de tamanho finito (mas é envolto, como uma esfera). Nessa grade, um ponto aleatório (somente número inteiro) é selecionado. Então, eu, o usuário, sou solicitado a inserir uma coordenada. Se minha entrada corresponde exatamente ao ponto aleatório, disseram-me que venci. Caso contrário, me disseram a distância em pontos entre minha entrada e o ponto aleatório. Por exemplo, se eu adivinhasse (2,2)
e o ponto aleatório estivesse (4,3)
, então a distância seria sqrt[(3-2)^2 + (4-2)^2] = sqrt[5]
.
O jogo continua até que o jogador chegue ao local correto do ponto.
Objetivo Crie uma versão funcional do jogo descrito acima. Você deve criar um programa completo para fazer isso. Aqui está o que seu programa deve fazer:
- Solicite duas entradas: a altura e a largura do quadro. A origem está no canto superior esquerdo do quadro. Essas entradas não excederão
1024
. - Selecione um ponto aleatório nesse quadro; este será o ponto a ser adivinhado.
- Aceite a entrada simulando uma curva. A entrada será um par de números inteiros separados por espaço ou duas entradas inteiras separadas. Em resposta a esta entrada, o programa fará uma de duas coisas:
- Se a entrada corresponder ao ponto aleatório selecionado, envie uma mensagem sinalizando a vitória do usuário. Eu sugeriria "Você ganhou!".
- Caso contrário, imprima a distância entre o ponto de entrada do usuário e o ponto aleatório.
- Depois que o usuário tiver alcançado a vitória, exiba o número de turnos que ele fez. O programa então sai.
Bónus
Os bônus são aplicados na ordem em que aparecem nesta lista
- -150 bytes se o seu programa usa um número inteiro de entrada
D
que descreve a dimensão na qual o jogo ocorre. Por exemplo, seD = 3
você criar um ponto aleatório de3
números inteiros, receber3
entradas inteiras e gerar a distância entre esses pontos. - -50% (ou + 50% se
score < 0
) se você fornecer uma representação gráfica da placa (ASCII ou Figura) que mostre onde o usuário adivinhou anteriormente na grade de determinadas dimensões e no contador de curvas. (Se você optar pelo primeiro bônus, ele se aplicará apenas aos modos2D
e1D
. Se você adicionar uma saída gráfica em 3D, receberá um adicional de -50%.) - -60 bytes se você pode fornecer um modo de jogo (selecionado por uma entrada no início; isto é, quando fornecido
0
, executa o modo de jogo regular; quando determinado1
, executa este modo de jogo) no qual o ponto move 1 unidade em uma direção ortogonal aleatória por turno
Mais sobre embalagem
O empacotamento ocorre apenas quando, no terceiro bônus, o ponto móvel se move através de qualquer um dos limites; neste caso, o ponto móvel é distorcido para o respectivo ponto, assim:
... ...
..R (move right) R..
... ...
Esse comportamento de empacotamento não afeta o palpite do usuário, além do fato de que o ponto mudou de direção.
Entre os melhores
O snippet de pilha na parte inferior desta postagem gera o catálogo a partir das respostas a) como uma lista da solução mais curta por idioma eb) como uma tabela geral de líderes.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
# Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
10x10
, o ponto aleatório é(9,4)
, e eu acho(2,2)
, é a distânciasqrt(13)
ousqrt(53)
? (Observação para o futuro: se você estiver fazendo algo estranho, não inclua aleatoriedade, pois torna quase impossível fornecer casos de teste). 2. No terceiro bônus, a distância deve ser calculada e emitida antes ou depois do ponto se mover?Respostas:
CJam,
-113-139-152-157-159 bytesO programa tem 51 bytes de comprimento e se qualifica para os bônus de -150 bytes e -60 bytes .
O modo de jogo e o número de dimensões são lidos como um argumento da linha de comando, o tamanho em cada dimensão do STDIN. Como a mensagem da vitória é arbitrária , o programa será impresso
0.0
(distância ao objetivo) para indicar que o jogo acabou.Execuções de teste
Como funciona
fonte
Pitão, 91 (-150 -60) = -119
Solução antiga: (54-150 = -96)
Toda entrada ocorre em uma nova linha.
1
ou0
)O primeirosegundo inteiroD
representa as dimensões do jogo.D
entradas representam o tamanho do campoD
entradas a partir deste ponto são suposiçõesExemplo de reprodução (as dicas não aparecem no programa atual):
fonte
J=YmOvwvw
vez deVvwaYOvw;JY
, que é 2 bytes mais curto. Não examinei o outro código, mas acho que você também pode reduzir algumas coisas por lá.Python 2, 210 - 150 = 60
Primeiro desafio apenas até agora. Experimente online
fonte
Pip,
4342 bytes - 150 = -108Toma as dimensões da placa como argumentos de linha de comando (com D implícito no número de argumentos). Adivinha como números separados por espaço em stdin.
Esse código tira grande vantagem dos recursos de programação de array do Pip. A matriz de cmdline args é armazenada em
g
. Geramos o ponto a ser imaginado por mapeamento do operador randrangeRR
sobreg
, e puxar a lista resultante nay
variável. Em seguida, vem o loop while principal, onde a condição é a seguinte:Se a distância for diferente de zero, o interior do loop a imprimirá. Se fosse zero, atingimos o ponto alvo; o loop é interrompido e o programa gera a mensagem de vitória e o número de turnos.
Exemplo de execução:
fonte
R, 134-150 = -16 bytes
fonte
Haskell, 240 - 150 = 90
fonte
Dyalog APL ,
7771-210 = -139Está bem:
Observe que isso é executado na origem do índice 0 (
⎕IO←0
), que é padrão em muitos APLs.Adota o modo booleano como argumento da direita (
M
) e os tamanhos das dimensões como argumento da esquerda (S
).O número de dimensões é
D
, que deve ser definido (por exemploD←3
) antes da chamada, conforme OP).P←?S
o objetivo obtém um ponto aleatório no intervalo 1, embora cada dimensão limite{
…}⍣≢C←0
repita a função até que o resultado seja diferente deC
, que inicialmente obtém o0
?2
número aleatório 0 ou 1¯1 1[
…]
indexe da lista de dois númerosM×
multiplicados por modo; faz0
se o modo for ajustar a meta atual, salvar um novo contador de incremento de pontos de meta0
D↑
pad com0
s para corresponder ao número de dimensões e(?D)⌽
gire a lista aleatoriamente (de 0 a número de dimensões-1)P+
S|
módulo em tamanho de mundo da eP←
C+←1
P≢G←⎕:
palpite de entrada e se for diferente do ponto de meta, então ... asP-G
distâncias em cada dimensão2*⍨
ao quadrado+/
somam a impressão de.5*⍨
raiz quadrada⎕←
que0⊣
retorna 0 (ou seja, idêntico ao valor inicial, repita)C
... caso contrário, retorne o número de suposições ( sendo diferente de 0, interrompe o loop e retorna o último valor)fonte