Dans le jeu de société The Settlers of Catan , il existe cinq types de ressources: brique, bûche, minerai, blé et mouton. La construction d'une colonie coûte une brique, une bûche, un blé et un mouton. Cependant, vous pouvez également échanger quatre ressources identiques pour obtenir une ressource d'un type différent. Par exemple, si vous aviez quatre minerais en main, vous pourriez tous les échanger et obtenir un mouton.
Votre travail consiste à déterminer si oui ou non je peux construire un règlement, compte tenu de ma main.
Ta tâche
Entrée sera une séquence des lettres B
, L
, O
, W
et S
, pris dans tout format raisonnable. Ces lettres correspondent aux cinq types de ressources indiqués ci-dessus. Vous devez indiquer si j'ai ou non les ressources nécessaires pour construire un règlement, en tenant compte de la possibilité de négocier quatre types.
C'est le code-golf , donc le code le plus court en octets gagne.
Remarques
- Vous n'avez pas à générer les transactions que je dois effectuer ou le nombre de colonies que je pourrais construire. Un simple «oui» ou «non» fera l'affaire.
- Vous ne pouvez pas supposer que l'entrée est dans un ordre spécifique. En particulier, vous ne pouvez pas supposer que les ressources du même type sont regroupées, c'est donc
OBLSO
une entrée valide. - C'est un problème de décision , vous pouvez donc utiliser n'importe quelle valeur que vous voulez signifier «oui» et «non», tant que les deux valeurs choisies sont distinctes et cohérentes.
- Les seules règles qui nous intéressent ici sont celles énumérées ci-dessus. Les règles plus compliquées des colons de Catane comme le commerce avec d'autres joueurs ou dans les ports ne sont pas pertinentes ici.
- Les caractères d'entrée (
B
,L
,O
,W
,S
) peuvent être substitués par d' autres valeurs s'il est plus facile pour votre langue particulière de choix, tant il y a cinq entrées distinctes. Si vous utilisez d'autres valeurs d'entrée, veuillez les spécifier dans votre réponse.
Exemples
BLWS -> Yes
OOOOWLB -> Yes (trade four O for a S)
OOW -> No
BBBO -> No
(empty input) -> No
BBBBLW -> No
BBBBBLW -> Yes (trade four B for a S)
OOOOOOOOOOOOOOOO -> Yes (sixteen O; trade for B, L, W, S)
BLBLBLBLBL -> Yes (trade L for W and B for S)
BLSWBLSWBLSW -> Yes (extra, unused resources are ignored)
la source
Réponses:
Python 2 , 54 octets
Essayez-le en ligne!
Pour chacune de nos ressources, nous comptons le nombre de «libertés» accordées en ayant n de cette ressource. Une liberté représente une opportunité de remplir l'un des créneaux de brique-bûche-blé-mouton que nous devons remplir pour nous installer, ce qui explique le fait que nous pouvons convertir nos ressources.
Pour l'ensemble de BLSW, avoir l' une des ressources nous donne une telle liberté, et chaque excès supplémentaire de 4 nous en donne une autre. La règle de comptage des libertés est la suivante:
Donc n briques / billes / blé / mouton donnent ⌊ (n + 3) / 4⌋ libertés.
Pour les minerais, seuls les quatuors en excès comptent. La règle de comptage des libertés est la suivante:
Alors n minerais donnent ⌊n / 4⌋ libertés.
Théorème: nous pouvons régler si et seulement si nous avons ≥ 4 de ces "libertés".
Nous comptons donc nos libertés et vérifions s'il y en a ≥ 4. Pour gérer le comptage des minerais comme ⌊n / 4⌋ mais pour les autres ressources ⌊ (n + 3) / 4⌋, nous gonflons artificiellement les comptes des autres ressources par 3, puis comptons ⌊n / 4⌋ pour chacun d'eux. Nous faisons cela en mappant
(s+"BLSW"*3).count
au lieu des.count
.Preuve :
Supposons que nous puissions nous installer. Ensuite, pour chacun de [B, L, S, W], nous avons (a) utilisé 1 de cette ressource que nous avions déjà, ou (b) sacrifié 4 d'une autre ressource (y compris des minerais) pour la créer. Dans les deux cas, nous comptons au moins 1 liberté selon les règles ci-dessus. Nous avons donc ≥ 4 libertés.
Supposons que nous ayons 4 libertés, dont k sont dues à des «excès» (toute liberté vis-à-vis des minerais est un excès, et toute liberté par rapport aux autres ressources après la première l'est également) et dont 4-k témoignent de la possession d'au moins une brique / bûche / blé / mouton (celui qui a donné la «première liberté»). Ensuite, nous remplissons 4 k emplacements avec la brique / bûche / blé / mouton qui nous a donné notre première liberté, et remplissons les k emplacements restants en convertissant nos excès. Les 4 emplacements sont occupés et nous pouvons nous installer. Nous pouvons évidemment continuer à le faire si nous avons plus de 4 libertés.
Cette preuve est nul, mais j'ai sommeil. Je suis sûr qu'il y a une meilleure explication.
la source
s
estOOOOBLW
, vous finissez par obtenirsum(n/4for n in map(("OOOOBLWBBBLLLSSSWWW").count,"BLSWO"))>3
... donc pour chacun deBLOWS
vous compter combien de fois il apparaît dans cette chaîne de démarrage de"BLWS"*3
, somme alors vers le haut."OOOOBLWBLSWBLSWBLSW"
, en fait, mais les nombres sont les mêmes, bien sûr.)in"BLSWO"
est inutile en Python, n'est-ce pas? Semble travailler dans TIO au moins ..Python 2 ,
5251 octets-1 octet grâce à Luke (remplacer
>=0
par<0
, inverser lesFalse
/True
résultats)Une fonction sans nom prenant une chaîne de caractères B , O , W , L et S (comme dans l'OP) et retournant
False
si vous pouvez régler ouTrue
sinon.Essayez-le en ligne! (contraint la sortie vers
yes/no
l'OP).Comment?
Ceci est un port de ma réponse Jelly. Nous devons compenser tout B , W , L ou S manquant du reste après avoir utilisé l'un d'eux. En tant que tel, nous pouvons ajouter un O supplémentaire à notre main, puis réduire tous les décomptes d'un, puis l'entier diviser tous les décomptes par quatre, puis additionner - si le résultat est zéro ou plus, nous pouvons régler (soit parce qu'il n'y avait pas de ressources requises manquantes ou parce que nous pouvons échanger pour acquérir le ou les manquants).
la source
False
pour'yes'
etTrue
pour'no'
? Ensuite, vous pouvez passer>=
à<
, en économisant 1 octet.Pyth , 14 octets
Essayez-le ici! ou Vérifiez tous les cas de test.
Pyth ,
31 27 1716 octetsVérifiez les cas de test.
Comment ça marche?
Explication # 1
Explication # 2
Ce sont les codes utilisés par mon programme:
la source
+%ld4/ld4
->s.Dld4
//Q4 4
peut être ,/Q16
mais je ne suis pas vraiment sûr ...BBBO
, par exemple4
et diviser par4
.Gelée ,
1312 octetsUn lien monadique acceptant une liste de numéros représentant les ressources que vous possédez et vous renvoyant
1
si vous pouvez vous installer ou0
non.Les ressources sont
1, 2, 3, 4, 5
où5
représente le minerai .Essayez-le en ligne! ou voir la suite de tests (en utilisant l'OP IO).
Comment?
L'idée est de compter d'abord les ressources par type, puis de réduire tous les comptes de B , L , W et S de un - si nous n'en comptons aucun pour l'un de ces quatre, ils auront maintenant des entrées de -1 - nous devons acquérir les à partir de nos ressources restantes (Ceci est en fait réalisé en ajoutant un O supplémentaire (
5
) et en réduisant les cinq comptes de 1 ). Ensuite, nous divisons toutes ces valeurs par quatre pour voir combien d'unités nous pouvons échanger avec chacun de nos décomptes restants par type de ressource sans affecter les décomptes -1 et 0 (notez que -1 entier divisé par quatre est-1 , pas 0 ). Enfin, nous additionnons les valeurs et vérifions si le résultat est supérieur ou égal à zéro (ici supérieur à -1 peut être utilisé car nous avons toujours des entiers).la source
Java 8, 101 octets
Lambda de
int[]
àboolean
. Attribuer àFunction<int[], Boolean>
.Essayez-le en ligne
Entrée et sortie
L'entrée est un tableau d'entiers de 0 à 4 inclus. 4 représente Ore, et les autres mappings sont sans importance. Mes cas de test sont des traductions directes de ceux de la question, avec 0 comme brique, 1 comme bûche, 2 comme blé et 3 comme mouton.
La sortie est de savoir si un règlement peut être construit.
Non golfé
Explication
h
est le nombre de quadruples de ressources disponibles pour le commerce. Nous itérons sur chaque type de ressource (sauf Ore), en incrémentanth
pour chaque quadruple de ressources supplémentaires que nous avons et en décrémentant là où aucune ressource n'est présente. Ensuite, notre résultat est de savoir sih
est non négatif.La ligne
s'ajuste de
h
manière appropriée, qu'il n'y ait pas de ressources (pénurie) ou qu'il y ait au moins une ressource (excédent).f[i]
est décrémenté pour tenir compte de la ressource requise dans le cas d'excédent, produisant -1 dans le cas de pénurie. Le décalage vers la droite signé réduit l'expression à 0 (cas d'excédent) ou -1 (cas de pénurie), de sorte qu'un OU au niveau du bit avec le nombref[i++] / 4
de quadruples excédentaires (dans le cas d'excédent) n'a aucun effet dans le cas de pénurie mais se traduit par le nombre lui-même dans le cas excédentaire.Remerciements
la source
...for(h=f[4]/4;i<4;h+=f[i++]/4)n+=--f[i]>>-1;return~h<n;
.a->{int h,f[]=new int[5],i=0;for(int x:a)f[x]++;for(h=f[4]/4;i<4;h+=f[i++]/4)h+=--f[i]>>-1;return~h<0;}
a->{int h,f[]=new int[5],i=0;for(int x:a)f[x]++;for(h=f[4]/4;i<4;)h+=--f[i]>>-1|f[i++]/4;return~h<0;}
Rétine , 34 octets
Essayez-le en ligne! Explication: La construction d'une colonie nécessite 4 ressources qui sont soit vos premières B, L, W ou S, soit 4 autres ressources du même type. Cela équivaut à ajouter trois de chacun de ces quatre types de ressources, puis à compter pour voir si vous disposez de quatre ensembles de quatre.
la source
Gelée , 23 octets
Essayez-le en ligne!
Reportez-vous au tableau suivant pour les valeurs:
la source
Rétine , 43 octets
Essayez-le en ligne!
la source
Python 3 ,
7978 octetsEdit: -1 octet grâce à @ Mr.Xcoder
Essayez-le en ligne!
la source
MATL , 19 octets
L'entrée est un vecteur de ligne numérique où les lettres sont représentées comme des nombres comme suit:
La sortie est
1
pour la vérité,0
pour la fausse.Essayez-le en ligne!: Vérifiez tous les cas de test .
Comment ça marche
BLWS
) sont différents de zéro. Cela donne un nombre c .Code commenté
la source
> <> , 61 octets
Essayez-le en ligne!
Utilise le mappage de ressources suivant:
Peu importe le mappage utilisé, tant qu'ils sont dans la plage
0-4
, et0
est utilisé pour O. Utilise le fait que la recherche de la combinaisonBLWS
est la même que la recherche de la combinaisonOBLWS
tout en ayant déjà unO
in main.la source
05AB1E , 19 octets
0 -> Minerai
1 -> Brique
2 -> Bûche
3 -> Blé
4 -> Mouton
Renvoie 0 lorsqu'elle est fausse et 1 sinon.
Essayez-le en ligne!
Explication:
Solution non compétitive: 17 octets
Il y avait un bogue dans 05AB1E lorsque j'ai soumis cette solution pour la première fois, où certains opérateurs ont mal géré les entrées vides. Cela a conduit cette solution à répondre
1
sur une entrée vide. Cela a maintenant été corrigé, donc cette solution fonctionne très bien.La différence ici est que nous ajoutons un minerai avant de retirer une de chaque ressource, sans distinction, en comptant le nombre de ressources supprimées de cette façon. Nous décrémentons ensuite le compteur de 1 pour obtenir le nombre correct de B, L, W et S.
Essayez-le en ligne!
la source
JavaScript (SpiderMonkey) , 116 octets
Essayez-le en ligne!
Super mauvaise réponse. Je suis sûr qu'il pourrait être nettoyé davantage. Méthode inspirée de la réponse de Lynn dans ce fil.
la source
Kotlin ,
131129 octetsSoumission
Tester
Ne peut pas fonctionner sur TryItOnline, mais fonctionne sur try.kotlinlang.org
la source