Voici un simple rubis d' art ASCII :
___
/\_/\
/_/ \_\
\ \_/ /
\/_\/
En tant que bijoutier pour l'ASCII Gemstone Corporation, votre travail consiste à inspecter les rubis nouvellement acquis et à laisser une note sur les défauts que vous trouvez.
Heureusement, seuls 12 types de défauts sont possibles, et votre fournisseur garantit qu'aucun rubis n'aura plus d'un défaut.
Les 12 défauts correspondent au remplacement de l' un des 12 internes _
, /
ou des \
caractères du rubis avec un caractère d'espace ( ). Le périmètre extérieur d'un rubis n'a jamais de défauts.
Les défauts sont numérotés selon le caractère intérieur qui a une place à sa place:
Donc, un rubis avec défaut 1 ressemble à ceci:
___
/\_/\
/_/ _\
\ \_/ /
\/_\/
Un rubis avec défaut 11 ressemble à ceci:
___
/\_/\
/_/ \_\
\ \_/ /
\ _\/
C'est la même idée pour tous les autres défauts.
Défi
Écrivez un programme ou une fonction qui prend la chaîne d'un seul rubis potentiellement défectueux. Le numéro de défaut doit être imprimé ou retourné. Le numéro de défaut est 0 s'il n'y a pas de défaut.
Prenez l'entrée d'un fichier texte, stdin ou un argument de fonction de chaîne. Renvoyez le numéro du défaut ou imprimez-le sur stdout.
Vous pouvez supposer que le rubis a une nouvelle ligne de fin. Vous ne pouvez pas supposer qu'il comporte des espaces de fin ou des nouvelles lignes de début.
Le code le plus court en octets gagne. ( Compteur d'octets pratique. )
Cas de test
Les 13 types exacts de rubis, suivis directement par leur sortie attendue:
___
/\_/\
/_/ \_\
\ \_/ /
\/_\/
0
___
/\_/\
/_/ _\
\ \_/ /
\/_\/
1
___
/\ /\
/_/ \_\
\ \_/ /
\/_\/
2
___
/\_/\
/_ \_\
\ \_/ /
\/_\/
3
___
/\_/\
/_/ \_\
\ _/ /
\/_\/
4
___
/\_/\
/_/ \_\
\ \ / /
\/_\/
5
___
/\_/\
/_/ \_\
\ \_ /
\/_\/
6
___
/\_/\
/_/ \ \
\ \_/ /
\/_\/
7
___
/\_ \
/_/ \_\
\ \_/ /
\/_\/
8
___
/ _/\
/_/ \_\
\ \_/ /
\/_\/
9
___
/\_/\
/ / \_\
\ \_/ /
\/_\/
10
___
/\_/\
/_/ \_\
\ \_/ /
\ _\/
11
___
/\_/\
/_/ \_\
\ \_/ /
\/_ /
12
la source
Réponses:
CJam,
2723 octetsConvertissez la base 11, prenez le mod 67, prenez le mod 19 du résultat puis trouvez l'index de ce que vous avez dans le tableau
La magie!
Essayez-le en ligne .
la source
Ruby 2.0, 69 octets
Hexdump (pour afficher fidèlement les données binaires dans la chaîne):
Explication:
-Kn
option lit le fichier source commeASCII-8BIT
(binaire).-0
option permetgets
de lire l'intégralité de l'entrée (et pas seulement une ligne).-rdigest
option charge ledigest
module, qui fournitDigest::MD5
.la source
Julia,
9059 octetsCertainement pas le plus court, mais la belle demoiselle Julia prend grand soin de l'inspection des rubis royaux.
Cela crée une fonction lambda qui accepte une chaîne
s
et renvoie le numéro de défaut rubis correspondant. Pour l'appeler, donnez-lui un nom, par exemplef=s->...
.Non golfé + explication:
Exemples:
Notez que les barres obliques inverses doivent être échappées dans l'entrée. J'ai confirmé avec @ Calvin'sHobbies que ça allait.
Faites-moi savoir si vous avez des questions ou des suggestions!
Edit: enregistré 31 octets avec l'aide d'Andrew Piliser!
la source
search
et de l'indexation des tableaux.s->(d=reshape([18 10 16 24 25 26 19 11 9 15 32 34],12);search(s[d],' '))
. Je n'aime pas la refonte, mais je ne pouvais pas penser à un moyen plus court d'obtenir un tableau 1d.reshape()
à utiliservec()
. :)> <> (Poisson) , 177 octets
Il s'agit d'une solution longue mais unique. Le programme ne contient aucune arithmétique ou ramification à part l'insertion de caractères d'entrée à des endroits fixes dans le code.
Notez que tous les caractères de construction de rubis inspectés (
/ \ _
) peuvent être des "miroirs" dans le code> <> qui changent la direction du pointeur d'instruction (IP).Nous pouvons utiliser ces caractères d'entrée pour construire un labyrinthe à partir d'eux avec l'instruction de modification de code
p
et à chaque sortie (créée par un miroir manquant dans l'entrée), nous pouvons imprimer le numéro correspondant.Les
S B U
lettres sont/ \ _
respectivement modifiées . Si l'entrée est un rubis complet, le code final devient:Vous pouvez essayer le programme avec cet excellent interprète visuel en ligne . Comme vous ne pouvez pas y saisir de sauts de ligne, vous devez utiliser des caractères fictifs à la place, vous pouvez donc saisir un rubis complet comme par exemple
SS___LS/\_/\L/_/S\_\L\S\_/S/LS\/_\/
. (Les espaces ont également changé en S à cause du démarque.)la source
CJam,
41 31 2928 octetsComme d'habitude, pour les caractères non imprimables, suivez ce lien .
Essayez-le en ligne ici
Explication bientôt
Approche précédente:
Je suis sûr que cela peut être réduit en changeant la logique des chiffres / conversion. Mais voici la première tentative:
Comme d'habitude, utilisez ce lien pour les caractères non imprimables.
La logique est assez simple
"Hash for each defect":i
- Cela me donne le hachage par défaut comme indexqN-"/\\_ "4,er
- cela convertit les caractères en nombres4b1e3%A/
- c'est le nombre unique dans le nombre converti de base#
Ensuite, je trouve simplement l'index du numéro unique dans le hachageEssayez-le en ligne ici
la source
.h
ce moment est inutile car il utilise le peu fiable et mauvais intégréhash()
), jusque-là je ne peux pas faire mieux.Slip ,
123108+ 3 = 111 octetsExécutez avec les drapeaux
n
eto
, c.-à-d.Vous pouvez également l' essayer en ligne .
Slip est un langage de type regex qui a été créé dans le cadre du défi de correspondance de motifs 2D . Slip peut détecter l'emplacement d'un défaut avec le
p
drapeau de position via le programme suivant:qui recherche l'un des modèles suivants (ici
S
indique ici que le match commence):Essayez-le en ligne - les coordonnées sont sorties sous forme de paire (x, y). Tout se lit comme une expression régulière, sauf que:
`
est utilisé pour s'échapper,<>
tourner le pointeur de match respectivement vers la gauche / droite,^6
place le pointeur de correspondance face à gauche, et\
fait glisser le pointeur de correspondance orthogonalement vers la droite (par exemple, si le pointeur est orienté vers la droite, il descend d'une ligne)Mais malheureusement, nous avons besoin d'un numéro unique de 0 à 12 indiquant quel défaut a été détecté, pas où il a été détecté. Slip n'a qu'une seule méthode pour sortir un seul numéro - le
n
drapeau qui sort le nombre de correspondances trouvées.Donc, pour ce faire, nous développons l'expression régulière ci-dessus pour correspondre au nombre correct de fois pour chaque défaut, à l'aide du
o
mode de correspondance qui se chevauchent. Décomposés, les composants sont:Oui, c'est une utilisation excessive de
?
pour obtenir les bons chiffres: Pla source
JavaScript (ES6), 67
72Recherche simplement les blancs dans les 12 emplacements donnés
Modifier 5 octets enregistrés, thx @apsillers
Tester dans la console Firefox / FireBug
Sortie
la source
C,
9884 octetsMISE À JOUR: Un peu plus intelligent sur la chaîne et correction d'un problème avec les rubis non défectueux.
Démêlé:
Assez simple et un peu moins de 100 octets.
Pour tester:
Entrée dans STDIN.
Comment ça marche
Chaque défaut dans le rubis est situé à un caractère différent. Cette liste montre où chaque défaut se produit dans la chaîne d'entrée:
Comme créer un tableau de
{17,9,15,23,24,25,18,10,8,14,31,33}
coûts coûte beaucoup d'octets, nous trouvons un moyen plus court de créer cette liste. Notez que l'ajout de 30 à chaque numéro donne une liste d'entiers pouvant être représentés sous forme de caractères ASCII imprimables. Cette liste est la suivante:"/'-5670(&,=?"
. Ainsi, nous pouvons définir un tableau de caractères (dans le code,c
) pour cette chaîne, et simplement soustraire 30 de chaque valeur que nous récupérons de cette liste pour obtenir notre tableau d'origine d'entiers. Nous définissonsa
être égal àc
pour garder une trace de la longueur de la liste que nous avons obtenue. La seule chose qui reste dans le code est lafor
boucle. Il vérifie que nous n'avons pas encore touché la finc
, puis vérifie si le caractère deb
at the currentc
est un espace (ASCII 32). Si tel est le cas, nous définissons le premier élément inutilisé deb
au numéro de défaut et le renvoyer.la source
Python 2,
146888671 octetsLa fonction
f
teste chaque emplacement de segment et renvoie l'index du segment défectueux. Un test sur le premier octet de la chaîne d'entrée garantit que nous retournons0
si aucun défaut n'est trouvé.Nous regroupons maintenant les décalages de segments dans une chaîne compacte et les utilisons
ord()
pour les récupérer:Test avec un rubis parfait:
Test avec le segment 2 remplacé par un espace:
EDIT: Merci à @xnor pour la belle
sum(n*bool for n in...)
technique.EDIT2: Merci à @ Sp3000 pour des conseils de golf supplémentaires.
la source
sum(n*(s[...]==' ')for ...)
.<'!'
au lieu d'==' '
un octet. Vous pouvez également générer la liste avecmap(ord, ...)
, mais je ne suis pas sûr de ce que vous pensez des non imprimables :)Pyth,
353128 octetsNécessite un Pyth corrigé , la dernière version actuelle de Pyth a un bug
.z
qui supprime les caractères de fin.Cette version n'utilise pas de fonction de hachage, elle abuse de la fonction de conversion de base en Pyth pour calculer un hachage très stupide mais fonctionnel. Ensuite, nous convertissons ce hachage en caractère et recherchons son index dans une chaîne.
La réponse contient des caractères non imprimables, utilisez ce code Python3 pour générer le programme avec précision sur votre machine:
la source
Haskell, 73 octets
Même stratégie que de nombreuses autres solutions: rechercher des espaces aux emplacements donnés. La recherche renvoie une liste d'index dont je prends le dernier élément, car il y a toujours un hit pour l'index 0.
la source
05AB1E , 16 octets
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Voir cette astuce 05AB1E (sections Comment compresser les grands entiers? Et Comment compresser les listes d'entiers? ) Pour comprendre pourquoi
•W)Ì3ô;4(•
est2272064612422082397
et•W)Ì3ô;4(•₆в
est[17,9,15,23,24,25,18,10,8,14,31,33]
.la source