Vous avez une pile de crêpes sur une assiette avec une boule de sirop sur le dessus tellement épaisse qu’elle ne peut pas couler sur les côtés. Vous ne serez pas heureux de manger jusqu'à ce que les deux faces de chaque crêpe aient au moins touché le sirop, mais à l'heure actuelle, une seule face de la crêpe supérieure l'a.
Vous savez que le sirop ne pénètrera jamais dans un seul pancake, mais il peut être transféré indéfiniment via un contact direct entre deux pancakes. Une fois qu'une face d'une crêpe a touché le sirop, elle est considérée comme étant recouverte de sirop pour toujours et fera en sorte que toute face non enrobée de sirop qui la touche touche également l'enrobage. Il est également possible de transférer du sirop vers le haut et vers le haut de la plaque.
Pour recouvrir chaque face de crêpes de sirop, insérez une spatule sous un ou plusieurs crêpes et renversez-les, exactement comme pour le tri des crêpes . (Malheureusement, cette spatule est résistante au sirop et ne permet pas de le distribuer en touchant les faces des pancakes.) Malheureusement, vous ne savez pas quelles faces des pancakes ont touché le sirop, mais vous vous souvenez des retournements que vous avez faits.
Compte tenu de votre passé, pouvez-vous déterminer si vos crêpes sont toutes encore enrobées de sirop?
Défi
Ecrivez un programme qui prend un entier positif N pour le nombre de crêpes et une liste d’entiers positifs (tous <= N) pour les retournements effectués jusqu’à présent. Chaque nombre dans la liste représente le nombre de crêpes retournées. Affiche une valeur de vérité si les crêpes sont cuites et une valeur de fausseté sinon. ( définition de la vérité ou de la fausseté )
L'entrée doit provenir de stdin ou de la ligne de commande et la sortie doit aller à stdout (ou aux alternatives les plus proches). C'est bien si votre entrée nécessite un formatage supplémentaire: par exemple, [1, 1, 2, 2]
au lieu de 1 1 2 2
pour la liste.
Exemples
Supposons que N = 2, nous avons donc une pile de deux crêpes sur une assiette, en commençant par le sirop.
Si la liste est 1 1 2 2
, cela signifie que nous ...
- retourner la crêpe supérieure - recouvrir la face supérieure de la crêpe inférieure
- retourner le haut à nouveau - enduire la face inférieure originale de la crêpe supérieure
- retourner les deux - recouvrir la plaque
- retournez les deux à nouveau - en recouvrant la face inférieure originale de la crêpe inférieure
Puisque les quatre faces sont revêtues, la sortie serait quelque chose comme True
ou 1
.
Si la liste est 1 2 2 1
, cela signifie que nous ...
- retourner la crêpe supérieure - recouvrir la face supérieure de la crêpe inférieure
- retourner les deux - rien ne recouvre
- retourner à nouveau les deux - rien ne recouvre
- retourner le haut à nouveau - enduire la face inférieure originale de la crêpe supérieure
Puisque le visage touchant la plaque est toujours exempt de sirop, le résultat serait quelque chose comme False
ou 0
.
Remarques
- La liste de retournement peut être arbitrairement longue et vide, auquel cas la sortie est faussée.
- La plaque sert de support à sirop mais peu importe qu’elle soit enrobée ou non. (En fait , toute solution chiquenaude sera manteau de la plaque parce que le visage de crêpe il touche doit être revêtue, mais peu importe.)
- La plaque ne peut pas être retournée.
- Vous pouvez supposer que ces crêpes sont des disques unitaires sans côtés à proprement parler, seulement deux faces opposées.
Notation
C'est du code-golf. La solution la plus courte en octets gagne.
Put syrup on the pancakes!
Réponses:
CJam,
323029 octetsEssayez-le en ligne.
Cas de test
Comment ça marche
la source
Haskell,
929086841141109998l'exigence d'un programme complet est tellement ennuyeuse. Je me demande pourquoi quelqu'un aurait besoin de cela.
cette solution fonctionne en représentant le tas de crêpes par une liste des côtés, lorsque des crêpes adjacentes partagent le même côté. chaque côté est un nombre et un côté est revêtu s'il a une valeur zéro.
courir comme:
la source
Python, 92 octets
Je pense que cela fonctionne:
Il utilise une liste de faces de crêpes (assiette incluse) pour rappeler celles qui sont enrobées de sirop. Les pancakes sont retournés en inversant une partie de la liste, mais tout sirop est d'abord transféré entre la face supérieure et le visage nouvellement révélé.
Usage:
la source
Python 2: 75
Une simplification de la solution de grc et feersum.
Le stockage de l’état sirop des
2*n+1
bords de la crêpe est redondant car les bords touchant sont toujours les mêmes. Cela rappelle l’état de chacune desn+1
jonctions des pancakes. De cette façon, le transfert de sirop est automatiquement comptabilisé.La seule mise à jour nécessaire consiste à conserver le sirop à la
x
jonction lorsqu'un flip le coupe. Ceci est fait en ornant le sirop post-retournement0
dansx
.La saisie deux fois n’affecte pas le nombre de caractères.
la source
Python 2, 93 octets
Au début, j'allais publier ma réponse, mais le groupe en avait déjà posté une très similaire une minute auparavant. J'ai donc essayé de proposer des améliorations. Le seul que j'ai pu trouver est d'utiliser une comparaison de liste lexicographique au lieu de
all()
.Éditer: Correction d'une erreur introduite en essayant sans succès différentes méthodes de saisie qui ne changeait pas le nombre de caractères.
Échantillon entrée / sortie:
la source
APL, 77
la source
Python 2, 107
la source
Haskell,
129 à125Probablement pas encore complètement joué au golf, mais cela fonctionne sans manipuler une liste de côtés revêtus. Au lieu de cela, il fait son chemin en arrière pour déterminer si un côté donné d’une crêpe donnée est jamais entré en contact avec tout ce qui était au sommet au début.
foldr
parcourt effectivement la liste des retournements, il n’ya donc pas dereverse
.Voici donc l'algorithme: Nous cartographions tous les côtés pertinents (
[0..m]
) et faisons une liste des côtés dont notre côté hérite du sirop à chaque étape, en commençant par le dos: initialement, la liste est juste[i]
, mais avec un revers den
pancakes, chaque entrée devient[n-i]
sii<n
,[n,0]
sii==n
et[i]
sii>n
. Le côté en question a été revêtu si et seulement si la liste résultante après tous les retournements contient un0
(any (<1)
).all
fait le reste, etmain
convertit tout cela en un programme exécutable.Le programme prend son entrée
stdin
sous forme de[n_pancakes, flip1, flip2, flip3, ...]
, terminé par une nouvelle ligne.la source
n%i|i>n=[i]|i<n=[n-i]|0<1=[n,0]
-à- dire au lieu d’foldr($)[].map(n%)
avoir(=<<).(%)
, qui mappera tous les héritages et les joindra.[0..]
et représenter un pancake enrobé comme étant 0 au lieu de faire des pancakes non nuls enrobés. Merci!