Il y a un jeu auquel j'aime jouer. Cela se produit sur une grille de taille finie (mais elle est enveloppée, comme une sphère). Sur cette grille, un point aléatoire (entier uniquement) est sélectionné. Ensuite, moi, l'utilisateur, je suis invité à entrer des coordonnées. Si ma contribution correspond exactement au point aléatoire, on me dit que j'ai gagné. Sinon, on me dit la distance point par point entre mon entrée et le point aléatoire. Par exemple, si je devinais (2,2)
et que le point aléatoire était à (4,3)
, alors la distance serait sqrt[(3-2)^2 + (4-2)^2] = sqrt[5]
.
Le jeu continue jusqu'à ce que le joueur arrive au bon endroit du point.
Objectif Créer une version fonctionnelle du jeu décrit ci-dessus. Pour ce faire, vous devez créer un programme complet. Voici ce que votre programme devrait faire:
- Demandez deux entrées: la hauteur et la largeur de la planche. L'origine se trouve en haut à gauche du plateau. Ces entrées ne dépasseront pas
1024
. - Sélectionnez un point au hasard sur cette planche; ce sera le point à deviner.
- Acceptez une entrée simulant un virage. L'entrée sera soit une paire d'entiers séparés par des espaces, soit deux entrées entières distinctes. En réponse à cette contribution, le programme fera l'une des deux choses suivantes:
- Si l'entrée correspond au point aléatoire sélectionné, émettez un message signalant la victoire de l'utilisateur. Je dirais "Tu as gagné!".
- Sinon, affichez la distance entre le point d'entrée de l'utilisateur et le point aléatoire.
- Une fois que l'utilisateur a remporté la victoire, affichez le nombre de tours qu'il a pris. Le programme se ferme ensuite.
Bonus
Les bonus sont appliqués dans l'ordre dans lequel ils apparaissent dans cette liste
- -150 octets si votre programme prend un entier d'entrée
D
qui décrit la dimension dans laquelle le jeu se déroule. Par exemple, siD = 3
, alors vous créez un point aléatoire d'3
entiers, prenez3
des entrées entières et affichez la distance entre ces points. - -50% (ou + 50% si
score < 0
) si vous fournissez une représentation graphique de la carte (ASCII ou Image) qui montre où l'utilisateur a déjà deviné sur la grille de dimensions données et le compteur de tours. (Si vous optez pour le premier bonus, ce bonus ne s'applique qu'aux modes2D
et1D
. Si vous ajoutez une sortie graphique 3D, vous obtenez un supplément de -50%.) - -60 octets si vous pouvez fournir un mode de jeu (sélectionné par une entrée au début; c'est-à-dire, lorsqu'il est donné
0
, effectuer le mode de jeu normal; lorsqu'il est donné1
, effectuer ce mode de jeu) dans lequel le point se déplace de 1 unité dans une direction orthogonale aléatoire par tour
Plus sur l'emballage
L'habillage ne se produit que lorsque, dans le troisième bonus, le point mobile se déplace à travers l'une des limites; dans ce cas, le point mobile est déformé au point respectif, comme suit:
... ...
..R (move right) R..
... ...
Ce comportement d'habillage n'affecte pas la supposition de l'utilisateur, mis à part le fait que le point a changé de direction.
Classement
L'extrait de pile au bas de cet article génère le catalogue à partir des réponses a) en tant que liste des solutions les plus courtes par langue et b) en tant que classement général.
Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle de démarque suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre en les rayant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou si vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
# Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de code:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
10x10
, le point aléatoire est(9,4)
, et je suppose(2,2)
, la distancesqrt(13)
ousqrt(53)
? (Remarque pour l'avenir: si vous faites quelque chose de bizarre, n'incluez pas le hasard car il est presque impossible de fournir des cas de test). 2. Dans le troisième bonus, la distance doit-elle être calculée et émise avant ou après le déplacement du point?Réponses:
CJAM,
-113-139-152-157-159 octetsLe programme est long de 51 octets et se qualifie pour les bonus de -150 octets et -60 octets .
Le mode de jeu et le nombre de dimensions sont lus comme un argument de ligne de commande, la taille dans chaque dimension de STDIN. Le message de victoire étant arbitraire , le programme imprimera
0.0
(distance jusqu'au but) pour indiquer que la partie est terminée.Essais
Comment ça fonctionne
la source
Pyth, 91 (-150 -60) = -119
Ancienne solution: (54-150 = -96)
Toutes les entrées ont lieu sur une nouvelle ligne.
1
ou0
)Le premierdeuxième entierD
représente les dimensions du jeu.D
entrées suivantes représentent la taille du champD
entrées à partir de ce moment sont des suppositionsExemple de lecture (les indices n'apparaissent pas dans le programme réel):
la source
J=YmOvwvw
au lieu deVvwaYOvw;JY
, ce qui est 2 octets plus court. Je n'ai pas regardé l'autre code, mais je suppose que vous pouvez également y raccourcir quelques éléments.Python 2, 210 - 150 = 60
Premier défi jusqu'à présent. Essayez-le en ligne
la source
Pip,
4342 octets - 150 = -108Prend les dimensions de la carte comme arguments de ligne de commande (avec D implicite du nombre d'arguments). Prend des suppositions sous forme de nombres séparés par des espaces sur stdin.
Ce code profite largement des fonctionnalités de programmation de tableaux de Pip. Le tableau d'arguments cmdline est stocké dans
g
. Nous générons le point à deviner en cartographiant l'opérateur plageAleatoireRR
surg
et Yank la liste résultant dans lay
variable. Vient ensuite la boucle principale tandis que la condition est la suivante:Si la distance n'était pas nulle, l'intérieur de la boucle l'imprime. Si c'était zéro, nous avons atteint le point cible; la boucle s'arrête et le programme génère le message de gain et le nombre de tours.
Exemple d'exécution:
la source
R, 134-150 = -16 octets
la source
Haskell, 240-150 = 90
la source
Dyalog APL ,
7771-210 = -139D'accord:
Notez que cela s'exécute dans l'index d'origine 0 (
⎕IO←0
) qui est par défaut dans de nombreux APL.Prend le mode booléen comme argument de droite (
M
) et les tailles de dimension comme argument de gauche (S
).Le nombre de dimensions est
D
, qui doit être défini (par exempleD←3
) avant l'appel, conformément à l'OP). enregistrer une nouvelle estimation de l'entrée du compteur d'incrément du point d'objectif , et s'il est différent du point d'objectif, alors ... distances dans chaque dimensionP←?S
le but obtient un point aléatoire dans la plage 1 bien que chacune des limites de dimension{
...}⍣≢C←0
répète la fonction jusqu'à ce que le résultat soit différent deC
, ce qui obtient initialement0
?2
un nombre aléatoire 0 ou 1¯1 1[
...]
index de la liste de deux nombresM×
multiplié par mode; fait0
si le mode est0
D↑
pad avec0
s pour correspondre au nombre de dimensions ajuster le module de taille mondiale de l' objectif actuel(?D)⌽
tourner la liste au hasard (0 à nombre de dimensions-1)P+
S|
P←
C+←1
P≢G←⎕:
P-G
2*⍨
carré les+/
additionnent en.5*⍨
racine carrée⎕←
qui0⊣
retournent 0 (c'est-à-dire identiques à la valeur initiale, donc répétez)C
... sinon, retourne le nombre de suppositions (qui, étant différent de 0, arrête la boucle et retourne la dernière valeur)la source