Jouez au scrabble avec le tableau périodique

13

Vous avez un ensemble de tuiles avec les symboles du tableau périodique. Chaque symbole apparaît une fois. Vous pensez à des mots à faire mais vous voulez savoir si c'est possible ou non.

Le défi

Écrivez un programme dans votre langue préférée qui prendra une chaîne comme paramètre d'entrée. Vous pouvez supposer que l'entrée n'est pas nulle, n'a pas d'espaces et se compose de caractères ASCII.

Votre programme doit prendre cette chaîne et produire une valeur véridique si ce mot peut être composé de symboles du tableau périodique des éléments, et une valeur de falsey si le mot ne le peut pas.

Pour rendre ce défi plus difficile, vous ne pouvez pas utiliser deux fois un symbole. Donc, si vous utilisez de l'azote, Nvous ne pouvez pas l'utiliser à Nnouveau dans le même mot.

Règles

Les échappatoires standard ne sont pas autorisées. Vous pouvez utiliser les symboles des éléments 1-118 (Hydrogène à Ununoctium). Vous pouvez trouver une liste de tous les éléments ici . Vous pouvez lire la liste des symboles dans un fichier ou saisir des arguments si vous le souhaitez.

Cas de test:

Laos - true (LaOs)
Amputation - true (AmPuTaTiON)
Heinous - true (HeINoUS)
Hypothalamus - true (HYPoThAlAmUS)
Singapore - true (SiNGaPoRe)
Brainfuck - true (BRaInFUCK)
Candycane - false

Il s'agit d'un défi de golf de code, le code le plus court gagne.

AVANT DE FERMER COMME DUPLICAT: Bien que cela puisse sembler similaire à ce défi , je pense que c'est différent car ce n'est pas 'Générer une liste de tous les mots qui sont possibles à partir du tableau périodique', c'est 'Prendre une entrée arbitraire et déterminer si il peut être fait à partir du tableau périodique »

JamesENL
la source
2
Il y a cela qui est plus étroitement lié mais qui a lui-même été fermé en tant que doublon du défi que vous avez lié. Je pense que le fait que vous ne pouvez utiliser un symbole qu'une seule fois est la plus grande différence entre les défis. En termes de golf, je doute qu'il existe un meilleur moyen que de forcer tous les mots possibles et de vérifier si l'entrée en fait partie.
Martin Ender
1
"Vous pouvez lire la liste des symboles d'un fichier si vous le souhaitez." - comment le comptons-nous? La taille du fichier est-elle ajoutée à la longueur du code? Ou pouvons-nous l'utiliser gratuitement?
Qwertiy
2
Pouvons-nous prendre la liste des éléments comme argument du programme?
Emigna
1
@Qwertiy, la taille du fichier est libre, mais pas les octets pour le lire.
JamesENL
9
Bore, radium, iode, azote, fluor, uranium, carbone, potassium.
Neil

Réponses:

3

05AB1E, 16 octets

œvyŒ€J})˜Ùvy²Q}O

Expliqué

œv                # for each permutation of the list of elements
  yŒ              # get all sublist of elements
    €J            # join as strings to form the words possible to spell
      })˜Ù        # convert to list of unique spellable strings
          vy²Q}   # compare each word with input word
               O  # sum giving 1 if the word is found, else 0

Avertissement: extrêmement lent. Je recommande de tester sur un sous-ensemble d'éléments beaucoup plus petit dans l'interpréteur en ligne.

Prend la liste des éléments comme premier argument.
Prend le mot à tester comme deuxième argument.
Renvoie 1 pour vrai et 0 pour faux.

Essayez-le en ligne sur un petit sous-ensemble d'éléments

Emigna
la source
3

Brachylog , 7 octets

spc~@l.

Appelez avec la liste des symboles (tous en minuscules) comme entrée et le mot comme sortie, par ex. run_from_atom('spc~@l.', ["he":"n":"o":"li"], "Nohe"). .

Attention: cela est extrêmement inefficace lorsque tous les symboles sont dans la liste.

Explication

spc        Create a string from a permutation of a subset of the Input
   ~@l.    This string can unify with the lowercase version of the Output
Fatalize
la source
4
@Souci du votant d'expliquer?
Fatalize
1

JavaScript (Firefox 48 ou version antérieure), 103 octets

f=(w,e=`
H
He
... (list of elements not included in the byte count) ...
Uus
Uuo
`)=>!w||e.match(/\w+/g).some(s=>!w.search(s,`i`)&&f(w.slice(s.length),e.replace(`
${s}
`,`
`)))
Neil
la source
1

Pyth - 13 octets

Vérifie simplement si une partition d'entrée en minuscules contient toutes les parties du tableau périodique.

sm.A}RQd./rzZ

Sur mobile, impossible de configurer une véritable suite de tests, mais essayez ceci .

Maltysen
la source
1
Vous avez écrit ça sur un téléphone!?
JamesENL
Cela ne garantit pas qu'un élément n'est pas utilisé plusieurs fois. Exemple.
PurkkaKoodari
1

Pyth, 11 octets

s}RySQSM./z

Essayez-le en ligne. Suite de tests.

Écrit sur mon téléphone, mais devrait fonctionner. Très lent pour un grand nombre d'éléments ou une longue chaîne.

Explication

  • Prenez toutes les partitions ( ./) de l'entrée ( z).
  • Trier ( S) chaque partition ( M).
  • Pour chaque partition (R ), voyez si elle se trouve dans ( }) la liste de tous les sous-ensembles ( y) du Stableau périodique trié ( ) donnée en entrée ( Q).
  • Sum ( s) la liste résultante des booléens.
PurkkaKoodari
la source