Contribution
- Une matrice binaire représentant les murs d'un cachot.
- La position du joueur dans le donjon.
- La direction laquelle le joueur est actuellement confronté (0 = Nord, 1 = Est, 2 = Sud, 3 = Ouest)
Sortie
Une représentation pseudo-3D des murs qui se trouvent dans le champ de vision du lecteur, sous forme d'art ASCII de caractères.
Vous trouverez ci-dessous plusieurs cadres de sortie possibles, ainsi que la carte et la boussole correspondantes pour vous aider à bien les comprendre (mais dessiner la carte et la boussole ne fait pas partie du défi).
spécification
Champ de vision
Le joueur a murs dans son champ de vision, étiquetés de à . Ci-dessous sont les positions des murs par rapport au joueur (en jaune), dans toutes les directions possibles.
Dessiner les murs
Les murs sont supposés être dessinés de à dans cet ordre exact, étant donné que toute partie dessinée précédemment peut être remplacée par des murs plus proches. Vous pouvez bien sûr l'implémenter différemment tant que le résultat final est le même.
La production totale est tracé avec 7 caractères distincts: " "
, "'"
, "."
, "|"
, "-"
, "_"
et ":"
.
Parce que détailler les formes des murs dans le corps de ce défi le rendrait trop long, ils sont plutôt fournis dans le lien TIO suivant:
Les caractères qui ne font pas partie d'un mur donné sont marqués d'un a "?"
dans ces diagrammes. Ils doivent être traités comme des caractères «transparents» qui ne sont pas du tout dessinés. D'autre part, tous les espaces d'un mur sont "pleins" et doivent écraser tous les autres caractères qui ont été dessinés auparavant.
Règles
A propos de l'entrée
- Vous pouvez prendre , , et dans n’importe quel format raisonnable.
- Vous pouvez utiliser des coordonnées indexées 0 ou 1.
- Vous pouvez utiliser 4 valeurs distinctes de votre choix pour les directions.
- La matrice est garantie d’être au moins .
- Vous pouvez supposer qu'il y aura toujours des murs d'enceinte sur les bords.
- Le joueur est assuré d'être situé sur une case vide.
- L'entrée est garantie pour être valide.
A propos de la sortie
- Les murs doivent être dessinés exactement comme décrit.
- Toutefois, le format de sortie est également flexible: chaîne unique, tableau de chaînes, matrice de caractères, etc.
- Les espaces de début et de fin sont acceptables tant qu'ils sont cohérents.
C'est du code-golf .
Cas de test
Tous les cas de test utilisent la matrice suivante:
[ [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
[ 1, 0, 1, 1, 1, 0, 0, 0, 0, 1 ],
[ 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 ],
[ 1, 0, 0, 0, 0, 0, 1, 1, 0, 1 ],
[ 1, 0, 0, 1, 0, 0, 0, 1, 0, 1 ],
[ 1, 0, 0, 1, 1, 0, 1, 1, 0, 1 ],
[ 1, 1, 1, 1, 0, 0, 0, 0, 0, 1 ],
[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ] ]
x=3, y=3, d=0
x=6, y=4, d=3
x=4, y=4, d=1
x=1, y=5, d=2
x=7, y=7, d=3
x=6, y=6, d=1
x=8, y=1, d=2
x=7, y=6, d=1
Résultats attendus:
------------------------------ ------------------------------
x=3, y=3, d=0: x=6, y=4, d=3:
------------------------------ ------------------------------
__ __ '. .'
|'. .'| | |
| '.--------------.' | |----. |
| | | | | | '.--------. |
| | | | | | | | |
| | | | | | | | |
| | | | | | .'--------' |
| .'--------------'. | |----' |
__|.' '.|__ | |
.' '.
------------------------------ ------------------------------
x=4, y=4, d=1: x=1, y=5, d=2:
------------------------------ ------------------------------
.' __ ________________________ .'
| | |
-------. .----| | |
| '.--------.' | | | |
| | | | | | |
| | | | | | |
| .'--------'. | | | |
-------' '----| | |
| __|________________________|
'. '.
------------------------------ ------------------------------
x=7, y=7, d=3: x=6, y=6, d=1:
------------------------------ ------------------------------
'. '.
|'. |'.
| '. | '.
| | '. .- | |--.--------.--------.-
| | |: :| | | | | |
| | |: :| | | | | |
| | .' '- | |--'--------'--------'-
| .' | .'
|.' |.'
.' .'
------------------------------ ------------------------------
x=8, y=1, d=2: x=7, y=6, d=1:
------------------------------ ------------------------------
'. __ '.
|'. .'| |
| '. .' | |----.--------------.-------
| | '. .' | | | | |
| | |: :| | | | | |
| | |: :| | | | | |
| | .' '. | | | | |
| .' '. | |----'--------------'-------
|.' '.|__ |
.' .'
Défi connexe:
Ce défi de 2013 est étroitement lié. Mais il a un critère de gain différent (code-challenge), une spécification beaucoup plus souple de la sortie et nécessite des E / S interactives.
la source
Réponses:
Nettoyer (avec Snappy ),
800785670644 octets460402 octets de code +360littéraux de chaîne de 242 octets(échappés ici et sur TIO car ce n'est pas valide UTF-8)
Vous pouvez vérifier la longueur du littéral ici.
Essayez-le en ligne!
La compression Snappy fonctionne plutôt bien dans ce cas, malgré la vitesse, car il y a tellement de passages à un caractère dans la chaîne en cours de compression.
La chaîne non compressée (
#
remplacée par\n
pour plus de clarté) est la suivante:Cela code les versions de gauche des différents composants d’écran avec
!
au lieu de nouvelles lignes et~
au lieu de?
, lesquelles sont ensuite~
complétées à droite avec 30 caractères avant d’être ajoutées et leurs inversions de ligne ajoutées à une liste de recherche.Le reste du code gère simplement la recherche de coordonnées avec les cas hors limites ignorés.
la source
Python 2 ,
864854848826810 octetsEssayez-le en ligne!
la source
Charbon de bois ,
500332 octetsEssayez-le en ligne! Le lien est vers la version verbeuse du code. Une approche quelque peu ennuyeuse, j'en ai peur; beaucoup d'impression de littéraux de chaîne compressés. Explication:
Tapez le tableau avec deux points supplémentaires
0
de chaque côté.Tranche une
7x7
sous - section du tableau centré sur les coordonnées données.Faites pivoter la matrice en fonction de la direction donnée.
(espace de fin de note) Dessinez une zone vide
30×10
de sorte que la sortie ait toujours une taille cohérente.Dessinez chaque moitié séparément, en réfléchissant entre les deux.
Prenez un tableau de descripteurs de mur, scindé en morceaux de (chaîne, coordonnée y, coordonnée x), filtrez les morceaux qui ont un mur à la position appropriée dans la moitié correspondante du tableau et passez en boucle sur les murs. La position est calculée en extrayant 12 murs du tableau et en les indexant à l'aide de l'indice de bloc car il est plus facile que de localiser le mur directement à l'aide de l'indice de bloc.
Sautez aux coordonnées du mur et imprimez-le. Notez que la réflexion annule les coordonnées X de
[0, 30)
à, de(-30, 0]
sorte qu'en une seule opération, la trame est effectivement décalée de 29 caractères vers la gauche.la source
Ruby ,
412 391 385383 octetsEssayez-le en ligne!
Prend les entrées comme un tableau de valeurs de vérité / fausseté (la note
0
est la vérité en Ruby, maisnil
est faussée.)Sort un tableau de caractères.
Explication
Les blocs sont dessinés d'avant en arrière avec une distance
n
décroissante et une position latérale passant d'un côté à l'autrem
à-1,1,0
gauche, à droite et au milieu. Le bloc du milieu E dans la rangée la plus éloignée est en fait dessiné deux fois, car nous devons vérifier les blocs A / B et les blocs C / D.n,m
etd
sont utilisés pour modifier les valeursx
andy
dans le tableau de recherchea
. Ifx
is out of rangenil
est renvoyé pour une cellule out of range et aucune erreur n'est générée, mais ify
is out of rangenil
sera renvoyé pour la ligne et Ruby générera une erreur de type lorsqu'il tentera de rechercher la cellule. Pour éviter cela, la matrice est triplée dans la direction verticale avant la recherche. Si une valeur de vérité est trouvée, un bloc est tracé.La sortie est construite dans un tableau
b
de tableaux de 10 éléments représentant les colonnes de la sortie et est transposée en 10 lignes à la fin de la fonction. La face avant complète de tous les blocs est dessinée (qu'elle apparaisse dans la fenêtre ou non), de sorte que de l'espace supplémentaire est nécessaire dans le tableau pour éviter les erreurs hors de portée. La plage dej
valeurs dans la fenêtre d'affichage va de-15
à+14
, elle est décalée de 15 lors de l'enregistrement dans le tableau pour donner une plage de0
à29
. Pour chaque bloc dessiné, trois valeurs sont calculées:p
etq
pour les coins gauche et droit du mur avant, respectivement, etr
pour l'arrière du mur latéral.j
est itéré du minimum au maximum de ces trois valeurs en dessinant les colonnes tour à tour.Il existe 3 types de lignes: horizontal
-
ou_
, verticaux|
ou:
, en diagonale et avec une répétition" .'"
motif. Où lesp < j < q
colonnes contenant des espaces coiffés-
ou_
dessinés pour former la face avant. Oùj
est en dehors de cette plage, les colonnes contenant un espace,|
ou:
sont dessinées coiffées de symboles à partir det=" .'"
pour former les bords et / ou la face latérale. Elle est gérée par la variablek=j
oùj
est positif ouk=-j-1
oùj
est négatif. Le nombre de caractères entre les majuscules supérieure et inférieure estk/3*2
. Afin de manipuler correctement les bords extérieurs des blocs les plus éloignésn=3
,k
il faut prendre le modulo 9, mais cela ne doit pas être fait pour des valeurs plus petites den
.k
est donc pris modulo36/-~n
, où-~n
évalue àn+1
.Code non-liquéfié
la source