J'ai une boîte à musique à manivelle pouvant jouer une série de quatre notes. Lorsque je tourne la manivelle, une des quatre cordes est pincée, en fonction de la position de la manivelle et de la direction du virage. Lorsque la manivelle est tournée plein nord, la boîte (avec ses chaînes numérotées de 1 à 4) ressemble à ceci:
1 | 2
|
O
4 3
À partir de là, je peux tourner la manivelle dans le sens des aiguilles d'une montre pour pincer la ficelle n ° 2 et pointer la manivelle vers l'est:
1 2
O---
4 3
Alternativement, j'aurais aussi pu tourner la manivelle dans le sens antihoraire depuis le nord pour jouer la corde n ° 1 et se terminer par une manivelle pointant vers l'ouest:
1 2
---O
4 3
La boîte peut alors jouer à tout moment l'une des deux notes suivantes: la note suivante disponible dans le sens des aiguilles d'une montre ou la note suivante dans le sens inverse des aiguilles d'une montre.
Défi
Votre défi consiste à écrire un programme ou une fonction qui accepte une chaîne de valeurs de note non vides (c.-à-d. Des chiffres à 1
travers 4
) et à déterminer s'il est toujours possible de jouer cette séquence de notes sur la boîte à musique. Produisez un résultat de vérité ou de falsification pour indiquer la possibilité de jouer ou non de l'entrée.
Quelques notes:
L'entrée ne fait aucune hypothèse sur la position de départ initiale. Les entrées
214
(en partant de l’est et en se déplaçant dans le sens contraire des aiguilles d’une montre) et234
(en partant du nord et en se déplaçant dans le sens des aiguilles d’une montre) et valables.La manivelle peut se déplacer librement dans les deux sens après chaque note. Une série de la même note est possible (par exemple
33333
) en se déplaçant d'avant en arrière sur une chaîne. La série1221441
est parfaitement jouable (en partant de l’ouest, en effectuant deux pas dans le sens horaire, puis trois pas dans le sens inverse des aiguilles d’une montre, puis deux pas dans le sens horaire).
Des échantillons
Quelques true
cas:
1
1234
1221
3333
143332
22234
2234
22214
1221441
41233
Quelques false
cas:
13 (note 3 is never available after note 1)
1224 (after `122`, the crank must be north, so 4 is not playable)
121 (after `12` the crank is east; 1 is not playable)
12221 (as above, after `1222` the crank is east)
43221
la source
Réponses:
Pyth,
3027 octetsVoici l'idée:
La manivelle est toujours à un demi-entier
c
. À chaque étape, nous réfléchissons sur une note de position entièren
par réglagec = 2*n-c
. Sin
est valide,c
change de ± 1 mod 8. Sin
est invalide,c
de ± 3 mod 8. Nous réduisons de manière cumulative sur l'entrée pour collecter toutes les valeurs dec
, puis voir si toutes les notes sont valides. Nous faisons cela pour chaque valeur de départ dec
, parce que c'est plus court que de cocher juste celles adjacentes à la première note.Formaté:
Suite de test .
la source
CJam,
34 à31 octetsJe l'ai fait sur mon téléphone, alors je vais devoir donner une explication plus tard.La sortie est non vide si et seulement la vérité.Essayez-le en ligne | Suite de tests
Explication
Le nouveau code modifie légèrement la mise en page:
Les nombres pairs correspondent aux positions des cordes et les nombres impairs correspondent aux positions des manivelles.
Voici ce qui se passe:
La pile est alors automatiquement imprimée à la fin. Toutes les positions possibles de fin seront dans la sortie, par exemple pour l'entrée ,
1
la sortie est31
, ce qui signifie que la manivelle peut se terminer face à gauche ou vers le haut.Si seulement CJam avait un filtre avec paramètre supplémentaire ...
Edit: Revenir temporairement en arrière pendant que je me persuade que ce 29 octets fonctionne:
la source
Haskell,
93 8887 octetsCela donne une fonction anonyme qui prend une chaîne et retourne un booléen. Suite de test ici.
Explication
L'idée est que le lambda sur la droite mappe un nombre
a
sur[[a,a+1],[a+1,a]]
, les deux "mouvements" possibles qui prennent la manivelle sur ce nombre, selon le schéma suivant:Dans la fonction principale anonyme, nous réalisons d’abord
mapM((...).read.pure)
, qui convertit chaque caractère en un entier, lui applique le lambda ci-dessus et choisit l’un des deux mouvements, en renvoyant la liste de toutes les séquences de mouvements obtenues. Ensuite, nous vérifions si l’une de ces séquences a la propriété que le deuxième nombre de chaque déplacement est égal au premier nombre du prochain modulo 4, ce qui signifie qu’il s’agit d’une séquence physiquement possible. Pour ce faire, nouszip
déplaçons chacun une séquence avec la siennetail
, vérifions la conditionall
des paires et voyons si laany
séquence est évaluéeTrue
.la source
Rétine, 50 octets
Je pense que ça marche?
Essayez ici.
la source
Rétine ,
127109 octetsCela imprime
0
ou1
, en conséquence.Essayez-le en ligne! (Ceci est une version légèrement modifiée qui marque toutes les correspondances dans l’entrée au lieu d’être imprimées
0
ou1
.)J'ai essayé de concevoir un algorithme élégant, mais mes premières tentatives n'ont pas réussi à contourner le retour en arrière ... et implémenter le retour en arrière est ennuyant ... solution valable. Malheureusement, le codage est assez détaillé et assez redondant ... Je suis sûr que cela peut être raccourci.
Pendant que j'essaie de trouver quelque chose de plus ordonné, si quelqu'un veut comprendre comment cela fonctionne, voici une version un peu plus lisible:
Et voici un indice:
la source
MATL ,
5755 octetsCeci utilise la version actuelle (10.2.1) , qui est antérieure à ce défi.
EDIT (17 janvier 2017): en raison de changements de langue,
v
doit être remplacé par&v
, ettL3$)
parY)
(d'autres améliorations pourraient en outre être apportées ). Le lien suivant inclut ces deux modificationsEssayez-le en ligne!
Explication
Ceci est basé sur deux de mes outils préférés pour le golf de code: force brute et convolution .
Le code définit le chemin suivi par la manivelle en termes de coordonnées
0.5
,1.5
etc. Chaque nombre indique la position de la manivelle entre les notes. Le code crée d'abord un tableau de chemins avec tous les chemins possibles commençant par la première note de la chaîne d'entrée. Chaque chemin est une colonne de ce tableau. C'est la composante de la force brute .À partir de ce tableau de chemins, un tableau de notes est obtenu, où chaque colonne est une séquence réalisable de notes jouées. Par exemple, le déplacement d'une position
0.5
à1.5
une autre produit1
. Cela consiste à prendre la moyenne entre les positions puis à appliquer une opération modulo 4. La moyenne courante sur chaque colonne est réalisée avec une convolution 2D .Enfin, le programme vérifie si une colonne du tableau de notes coïncide avec l'entrée.
la source
Pyth, 43
Suite de tests
C’est probablement très golfable, et ce n’est pas l’algorithme optimal pour jouer au golf (je pense que tous les chemins seront énumérés plus courts?) ... Quoi qu’il en soit, si vous trouvez une erreur dans l’algorithme, faites-le-moi savoir. 'ai eu tort avant!
Je vais expliquer mon algorithme en utilisant l'exemple de saisie de
1221
. Ce premier programme associe les chiffres contre leurs successeurs, comme suit:[[1,2],[2,2],[2,1]]
. Ensuite , il obtient leurs différences mod4
(Pyth obtient le résultat qui correspond au signe de l'argument de droit%
, donc ce qui est toujours positif):[3,0,1]
. Ensuite , les résultats sont divisés sur0
et ont2
soustrait de chacun d'eux:[[1],[-1]]
.Maintenant que la configuration est terminée, nous créons une liste de
[-1,1,-1...]
et sa négation[1,-1,...]
, les deux ayant la même longueur que le tableau résultant précédent. Ensuite, pour chacune de ces listes, effectuez une soustraction succincte entre les éléments de la liste et la liste générée à l'étape précédente. Ensuite, si l'un des résultats ne contient que des listes vides, nous produisons true.la source
1221221
et1221441
?1221221
est false et1221441
donne true dans l'ensemble, mais si je comprends bien, vous voulez le résultat après cette étape de l'algorithme? Si tel est le cas, cela donne: de[3, 0, 1, 3, 0, 1]
à[[3], [1, 3], [1]]
et[3, 0, 1, 1, 0, 3]
à[[3], [1, 1], [3]]
. Faites-moi savoir si vous voulez quelque chose d'autre expliqué :)[[1], [-1, 1], [-1]]
et à[[1], [-1, -1], [1]]
partir de là, vous pouvez voir que la première ne contient pas de listes alternant entre-1
et1
tandis que l'autre liste le fait, donnant le résultat final. L'algorithme est un peu obtus, mais en gros, il mappe les changements de0
direction en sens+/-1
puis, en vérifiant qu'aucun saut n'est effectué et que les sens ont un sens.Matlab,
279180 octetsUne solution assez paresseuse, mais la plus courte que j'ai pu trouver. J'ai créé matrice spéciale: Lorsque vous codez l'état de la plumeuse et la dernière chaîne qui doit être cueilli, il retourne un vecteur, qui code pour la nouvelle position de la plumeuse, et si la précédente plumer était possible du tout. Nous allons maintenant parcourir toutes les notes des deux positions de départ possibles et voir si l’une d’elles produit une mélodie jouable. Peut probablement être joué au golf beaucoup plus.
Source étendue et expliquée:
la source
ES6,
104 à100 octetsEdit: 4 octets enregistrés grâce à @DigitalTrauma.
C'est une réécriture complète car mon approche précédente était imparfaite.
Je commence par réduire tous les nombres de chiffres à 1 ou 2, selon qu’il s’agisse d’un nombre impair ou pair. Je cherche alors toutes les combinaisons illégales:
13|24|31|42
(côtés opposés)3[24]{2}1
comme3221
et3441
sont illégaux4xx2
,1xx3
et2xx4
oùx
est l'un des chiffres manquants(.).\1
comme des choses comme121
sont illégales (111
a été réduit à1
plus tôt)S'il n'y a pas de paires ou de "triples" illégaux, alors toute la chaîne est légale (la preuve par induction est laissée à titre d'exercice, car il fait tard ici).
J'ai essayé de simplifier en
3[24]{2}1|1[24]{2}3
utilisant une affirmation d'anticipation négative, mais elle s'est avérée être plus longue de cette façon.la source
f("1122") => true
@DigitalTraumaf("1221221")
la mauvaise réponse était renvoyée. Je vais donc devoir repenser.[24][24]
à(2|4)\1
mais je ne l' avais pas testé de manière adéquate. Désolé pour ça.[24][24]
au golf[24]{2}
?JavaScript (ES6), 80 octets
Explication
i%4
est la position actuelle du vilebrequin:Indenté et commenté
Tester
la source
|
fonctionne dans ce cas?(x.map(...),v)
. Cela fonctionne parce que le tableau dans lequel lesmap
retours retournent0
et0|v == v
.Lua ,
146 142 108 162 159 149 144 135 132 118113 octetsRenvoie true ou false pour une chaîne de nombres comprise entre 1 et 4. (Ne gère pas les données inexistantes ou hors limites.
Suit simplement ce qui était le dernier mouvement et vérifie si ce mouvement est une inversion du dernier mouvement (IE, 121 ou 12221) ou si la distance parcourue est plus que possible.
EDIT 1 :
Enregistré 6 octets. J'ai oublié que
if (int) then
renvoie vrai si int est non nul.Ainsi:
changements à:
Également enregistré quelques octets en restructurant.
EDIT 2 :
Je suis en train de comprendre cela lentement. J'ai lu la documentation ici: http://www.lua.org/pil/ Et l'une des pages les plus utiles pour le golf est http://www.lua.org/pil/3.3.html
En particulier, cela est très utile:
Cela signifie pour moi que je peux retirer ma déclaration pour q ( initialement définie sur 0 ), car elle sera considérée comme "fausse" jusqu'à ce qu'elle soit définie. Donc, je sauve quelques octets supplémentaires à travers cela.
Une autre chose à noter, bien que je ne l'utilise pas, est que si vous voulez échanger des valeurs dans Lua, vous pouvez simplement vous
a,b=b,a
passer de la nécessité d'une variable temporaire.EDIT 3
Donc, grâce à une reconstruction intelligente ainsi qu’à une nouvelle fonction, le décompte d’octets a diminué de 9 de plus.
Meilleur mode de réception des entrées
Si vous avez besoin de lire une liste de nombres et d’opérer les opérations l’un après l’autre, vous pouvez utiliser:
Par rapport à votre alternative en utilisant string: sub, vous pouvez voir la valeur pour le golf (ou l’utilisation générale):
Restructurer des fonctions ou des chaînes
Deuxièmement, si vous avez plusieurs déclarations sur une ligne et que l’une des valeurs est une fonction ou si vous avez une condition dans laquelle vous comparez un nombre au résultat d’une fonction comme celle-ci:
en le restructurant de sorte que les parenthèses fermantes constituent le dernier caractère de la condition ou de la déclaration, vous pouvez supprimer un caractère comme suit:
Renvoie des conditions équivalentes à Vrai ou à Faux au lieu de "Vrai" ou "Faux"
J'ai trouvé un moyen assez amusant de réduire mon décompte d'octets encore plus loin. Si vous devez renvoyer true ou false, vous pouvez renvoyer une instruction équivalente à true ou false contenant moins de caractères que "true" ou "false".
Par exemple, comparez:
À:
la source
121
devrait produire faux.MATL, 49 octets (non concurrentes 1 )
1. La réponse (ab) utilise l'indexation moins stricte des nouvelles versions de MATL et n'aurait pas fonctionné au moment où ce défi a été posté.
Essayez-le en ligne! .
J'ai vu ce défi au Best of PPCG 2016 et j'ai pensé que cela pourrait utiliser mon opérateur préféré :
Ou bien,
diff
dans MATLAB / Octave (je vais utiliser librement la terminologie MATLAB / Octave dans mon explication, car elle est plus facile à lire pour les humains). Cette commande calcule la différence entre les éléments dans un vecteur ou, dans ce cas, dans un tableau de caractères.Pour ce problème, les différences présentent un schéma intéressant. Notez que
Pour le motif de différence (ignorer la
1-4
transition pour le moment), cela signifie queJ'ai implémenté cela en trouvant, pour chaque tableau, le premier zéro. Je coupe le zéro et multiplie tous les éléments après
-1
. Pour le résultat final, cela signifie que tous les éléments doivent avoir le même signe. Bien sûr, il y a le petit problème de l'-3
égalisation+1
, et du fait d'2
être interdit en général. J'ai résolu ce problème en prenant l'union d'ensemble du résultat avec[1 -3]
et en vérifiant si elle est de taille 2 (c'est-à-dire qu'aucun élément non autorisé n'a été entré dans l'ensemble par l'intermédiaire de l'union). Répétez l'opération pour[-1 3]
et vérifiez si (ou les deux, dans le cas d'une entrée de 1 longueur) est vraie.la source
M
, la dernière fois que j'ai essayé, cela a fonctionné différemment que prévu, donc je l'ai simplement ignoré pour le moment. Est-il correct de dire que cela doit être3M
parce qu'alors je reçois l'entrée de not)
, not:
mais deq
(sauterw
car ce n'est pas une fonction normale )?w
est sauté parce que ce n'est pas une fonction normale. Les fonctions normales ne nécessitant aucune entrée seraient également ignoréesPython (3.5)
160151150 octetsUne solution récursive
Ungolfed sans lambda
Je tourne toute la boîte au lieu de la manivelle. La position du vilebrequin se situe entre le premier et le deuxième caractère de la chaîne c. Je dois tester toutes les positions de départ de la manivelle.
Astuce utiliser pour faire pivoter la chaîne
La manière habituelle de faire pivoter une chaîne en python (
s[i:]+s[:i]
) nécessite également de répéter index et chaîne. Dans ce cas, je duplique la chaîne et découpe les premiers caractères.Cas de test
la source
3"[i:]) for
.Python 2 , 65 octets
Essayez-le en ligne!
la source
JavaScript (ES2015),
1109515 octets sauvés par Neil! Version originale non-golfée:
Tests: https://jsbin.com/cuqicajuko/1/edit?js,console
la source
(s,d)=>(h=s[0],t=s.slice(1),g=t[0],!g||(d?g==h?p(t,-d):g%4==(h-d)%4&&p(t,d):p(s,1)||p(s,-1)))
Code machine de Turing, 395 octets
Essayez-le en ligne!
Ceci est essentiellement une approche basée sur les états:
a
,b
,c
Etd
sont des « états indécis » qui se produisent seulement au débutN
,E
,S
EtW
sont les "états décidés", debout évidemment pourN
Orth,E
ast,S
outh etW
est.la source
Jeudi, 203 octets
Je ne vois pas comment jouer au golf aussi loin.
Si la séquence de notes est possible, la direction de la sortie sera indiquée, sinon la sortie sera vide.
la source
Prolog (SWI) , 117 octets
Définit un prédicat
p
qui réussit sur les entrées lisibles (donné comme une liste d’entiers) et échoue sur celles qui ne sont pas jouables. Essayez-le en ligne!Explication
a
définit une relation de contiguïté entre la noteN
et la position du pédalierP
. Nous définissons la position p comme étant entre les notes p et p + 1 . Ainsi, une position est adjacente à la noteN
ssiN
(P=N
); ouN=1,P=4
); ou!
) et la position est égale àN-1
(P is N-1
).m
prend une liste de notes et tente de générer une liste de positions qui joueront ces notes.A
est la note qui vient d'être jouée,B
est la note sur le point d'être jouée;X
est la position actuelle du vilebrequin,Y
est la position suivante du vilebrequin. Un déménagement est valable si et seulementa(A,X)
);a(B,X)
);a(B,Y)
); etX\=Y
).Si tout cela tient, recurse. Si nous arrivons à une note (
m([_],_)
), la séquence de notes est jouable.Pour cette question, nous ne nous soucions que de l'existence d'une séquence de mouvements. Nous définissons
p
donc appelerm
et ignorer la liste générée des positions de manivelle.Voir une version non golfée et vérifier tous les cas de test ici .
la source