Substitution d'aimant de réfrigérateur

29

Lorsque vous écrivez un message avec des aimants pour réfrigérateur, vous vous retrouverez souvent à remplacer un 1par un I. Dans ce défi, votre objectif est de savoir si un message peut être écrit en utilisant les lettres d'un autre message. Les substitutions autorisées sont:

A = 4
B = 8
C = U
E = M = W = 3
G = 6 = 9
I = 1
L = 7
N = Z
O = 0
R = 2
S = 5

Par exemple, le message CIRCA 333peut être réorganisé pour épeler ICE CREAM, où les deux premiers 3s sont tournés de 180 degrés pour faire deux Es, et le dernier 3est tourné de 90 degrés dans le sens antihoraire pour faire un M. Les espaces blancs peuvent être inclus dans les messages, mais ils ne doivent pas être pris en compte dans votre solution, car ils sont créés en plaçant les aimants sur le réfrigérateur.

Contribution

Deux chaînes (ou tableaux de caractères). Tous les messages correspondront^[A-Z0-9 ]+$

Sortie

Vrai si les deux chaînes d'entrée sont des réarrangements valides l'une de l'autre, sinon falsey.

Exemples

["CIRCA 333", "ICE CREAM"] => true
["DCLV 00133", "I LOVE CODE"] => true
["WE ARE EMISSARIES", "33   423    3315542135"] => true
["WE WANT ICE CREAM", "MET CIRCA 334 MEN"] => true
["I HAVE ICE CREAM", "HAVE 2 ICE CREAMS"] => false

Des exemples plus véridiques

Ce sont tous les mots de plus de 15 lettres qui correspondent à un autre mot. Certains sont des substitutions triviales, mais j'ai inclus tout ce que j'ai trouvé.

["ANTHROPOMORPHISE","ANTHROPOMORPHISM"]
["ANTIPHILOSOPHIES","ANTIPHILOSOPHISM"]
["CIRCUMSTANTIALLY","ULTRAMASCULINITY"]
["DECENTRALIZATION","DENEUTRALIZATION"]
["DIMETHYLNITROSAMINE","THREEDIMENSIONALITY"]
["INSTITUTIONALISE","INSTITUTIONALISM"]
["INTERCRYSTALLINE","INTERCRYSTALLIZE"]
["INTERNATIONALISE","INTERNATIONALISM"]
["OVERCENTRALIZATION","OVERNEUTRALIZATION"]
["OVERCENTRALIZING","OVERNEUTRALIZING"]
["PREMILLENNIALISE","PREMILLENNIALISM"]
["TRANSCENDENTALIZE","TRANSCENDENTALIZM"]

Comme il s'agit d'un défi de golf de code, la solution la plus courte l'emporte! J'accepterai la solution la plus courte dans les 7 jours suivant la publication. Bon golf!

Exemple de solution, sans golf

en relation

EDIT : fait une erreur dans les substitutions, avait G = 6et en 6 = 9tant que substitutions distinctes, les a fusionnées en une seule.

maxb
la source
2
Je pense que 48 heures, c'est un peu court. Et les gens qui ne jouent au golf que le week-end?
Adám
Bon point, je vais lui donner une semaine.
maxb
1
D'autres substitutions que vous pourriez envisager d'autoriser sont 7 pour T, H pour I (mais pas 1 pour H) et 2 pour N ou Z
Jeff Zeitlin
1
@JeffZeitlin Nous avons eu une discussion à ce sujet dans le bac à sable du défi, et j'ai choisi d'exclure toutes les substitutions qui ne sont pas réversibles. Depuis Tet Lne sont pas échangeables, je ne peux pas ajouter T = 7. Il en va de même N = Z = 2, ce qui impliquerait cela N = Z = R = 2. Cependant, le type de substitutions que vous proposez rendrait la version plus difficile de ce défi, que je pourrais poster ultérieurement. Je voulais juste voir si ce genre de défis serait bien accueilli en premier.
maxb
1
@ 3D1T0R oui, la substitution doit aller dans les deux sens. La vérification est de savoir si deux chaînes sont des réarrangements valides l'un de l'autre . Votre exemple reviendrait false.
maxb

Réponses:

4

Japt , 38 36 33 30 octets

Prend l'entrée comme un tableau de 2 chaînes.

®d`z³m`i`oiglbg`í)Ôu)ñ xÃr¶

Essayez-le ou exécutez tous les cas de test

3 octets économisés grâce à ETHProductions

®d`z...m`i`o...g`í)Ôu)ñ xÃr¶
                                 :Implicit input of array U
®                                :Map each Z
 d                               :  For each pair of characters in the following string,
                                 :  replace all occurrences of the 1st character in Z with the 2nd
  `z...m`                        :    The compressed string "znewem"
         i                       :    Prepend
          `o...g`                :      The compressed string "oireasglbg"
                 í               :      Interleave 0-based indices
                  )              :    End prepend
                   Ô             :    Reverse
                    u            :    Convert to uppercase
                     )           :  End replace
                      ñ          :  Sort
                        x        :  Trim
                         Ã       :End map
                          r      :Reduce
                           ¶     :  By testing equality
Hirsute
la source
Nice, bat actuellement Jelly! Je pense que vous pouvez faire à la fin pour économiser 3 octets.
ETHproductions
Oh, ouais, j'oubliais ça. Merci, @ETHproductions.
Shaggy
10

Python 2 , 145 131 131 130 129 125 octets

lambda*a:all(len({sum(map(w.count,x))for w in a})<2for x in'A4 B8 CU EMW3 G69 I1 L7 NZ O0 R2 S5'.split()+list('DFHJKPQTVXY'))

Essayez-le en ligne!

Alt:

Python 2 , 125 octets

lambda*a:len({(x,sum(map(w.count,x)))for x in'A4 B8 CU EMW3 G69 I1 L7 NZ O0 R2 S5'.split()+list('DFHJKPQTVXY')for w in a})<23

Essayez-le en ligne!

TFeld
la source
9

JavaScript (ES6), 102 100 bytes

Prend l'entrée comme deux tableaux de caractères dans la syntaxe de curry (a)(b). Renvoie un booléen.

a=>b=>(g=s=>s.map(c=>'648UD3F6H1JK73Z0PQ25TUV3'[parseInt(c,36)-9]||c).sort().join``.trim())(a)==g(b)

Essayez-le en ligne!

Comment?

En utilisant la fonction d'assistance g () , pour chaque entrée s :

  • Les chiffres 0 à 8 et les lettres X , Y et Z restent inchangés. Tout le reste est explicitement traduit.

    0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
             ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    .........648UD3F6H1JK73Z0PQ25TUV3...
    

    Code:

    s.map(c => '648UD3F6H1JK73Z0PQ25TUV3'[parseInt(c, 36) - 9] || c)
  • Nous trions les caractères (ce qui apporte tous les espaces au début), les joignons et supprimons tous les espaces de tête.

    Code:

    .sort().join``.trim()

Enfin, nous comparons les deux sorties.

Arnauld
la source
6

Retina 0.8.2 , 42 octets

T` dUZMW`_\OIR\EASG\LBGCN\E
%O`.
^(.*)¶\1$

Essayez-le en ligne! Prend des données sur des lignes distinctes, mais Link inclut des cas de test et un en-tête. Explication:

T` dUZMW`_\OIR\EASG\LBGCN\E

Mappez toutes les lettres à un ensemble minimal, en supprimant les espaces.

%O`.

Triez chaque chaîne dans l'ordre.

^(.*)¶\1$

Comparez les deux valeurs.

Neil
la source
5

APL (Dyalog Unicode) , 49 octets SBCS

-1 grâce à ngn.

Fonction de préfixe tacite anonyme.

(≡/(⍋⌷¨⊂)¨)(,¨⎕D,'UMWZ ')⎕R('OIREASGLBGCEEN',⊂⍬)

Essayez-le en ligne!

⎕R PCRE R eplace:
'UMWZ ' ces cinq caractères
⎕D, précédés des chiffres
 séparément (transformez chacun en une chaîne plutôt qu'en un seul caractère)
 avec:
⊂⍬ rien
'OIREASGLBGCEEN', précédé de ces caractères

() Appliquer à cela la fonction tacite suivante:

( Appliquer à chacun la fonction tacite suivante:

   l'enfermer (pour le traiter dans son ensemble)

  ⍋⌷¨ utiliser chacun des indices qui le trierait pour indexer dans la chaîne entière (trie)

≡/ sont-ils identiques? (réduction d'allumettes allumée)

Adam
la source
''->
ngn
@ngn Je ne sais pas pourquoi cela fonctionne, mais merci quand même.
Adám
5

Python 2 , 108 octets

lambda a,b:g(a)==g(b)
g=lambda s:sorted('85930A4614012B3C4D5EF6378GH9AI2J3KL7'[int(c,36)]for c in s if'!'<c)

Essayez-le en ligne!

Il existe 23 classes d'équivalence de caractères. À l'aide de la chaîne de 36 caractères '85930A4614012B3C4D5EF6378GH9AI2J3KL7', nous mappons chaque caractère à sa classe d'équivalence (en ignorant les espaces), puis trions le tableau résultant. Deux chaînes sont équivalentes si les listes résultantes sont égales.

Chas Brown
la source
4

Java 10, 262 260 258 216 208 208 174 octets

a->b->n(a).equals(n(b));String n(String s){return s.chars().mapToObj(x->x<48?"":"OIREASGLBG.......ABCDEFGHIJKLENOPQRSTCVEXYN".split("")[x-48]).sorted().reduce("",(a,b)->a+b);}

-2 octets grâce à @Arnauld .
-76 octets grâce à @ OlivierGrégoire .

Essayez-le en ligne.

Explication:

a->b->                      // Method with two String parameters and boolean return-type
  n(a).equals(n(b))         //  Return if both Strings are equal in the end

String n(String s){         // Separated method with String as both parameter return-type
  return s.chars()          //  Loop over all characters as integers
          .mapToObj(x->x<48?//   If the current character is a space:
             ""             //    Replace it with an empty String to skip it
            :               //   Else:
             "OIREASGLBG.......ABCDEFGHIJKLENOPQRSTCVEXYN".split("")[x-48]
                            //    Convert multi-substitution characters to a single one
          .sorted()         //  Sort all of the converted characters
          .reduce("",(a,b)->a+b);}
                            //  And join all of them together as single String
Kevin Cruijssen
la source
2
"A4B8CUEMEWE3G6G9I1L7NZO0R2S5".split("(?<=\\G.{2})")semble fonctionner ... même si je ne sais même pas exactement comment. : p
Arnauld
@Arnauld Merci, -2 octets, et {2}peut être .pour un autre -2 octets. Je ne sais pas non plus à 100% comment cela fonctionne. Je sais qu'il (?<= ... )est utilisé pour diviser mais garder un délimiteur de fin par élément . Mais je suis un peu confus pourquoi (?=\\G..)(garder le délimiteur principal) ne fonctionne pas à cet égard. Et aussi, je ne sais pas vraiment comment le \\G..vs ..agit dans la division ici. Je vais voir si je peux le comprendre quelque part, car je ne suis pas curieux. ; p Merci dans les deux cas pour les octets enregistrés. Besoin de se rappeler \\Glors de la division sur des blocs de taille égale. :)
Kevin Cruijssen
1
@Arnauld Si vous voulez des informations sur l' (?<=\\G..)intérieur d'une scission, j'ai fait une question StackoverFlow qui jette un peu de lumière. Fondamentalement, c'est un comportement non défini qui fonctionne différemment dans presque toutes les langues. Bien qu'il \Gsoit de longueur nulle, en Java avec le derrière positif à l'intérieur de la scission, il entre en conflit avec les deux règles provoquant le comportement que nous voyons ici. C'est encore un peu vague pour moi personnellement, mais au moins cela a sauvé 4 octets dans cette réponse. ;)
Kevin Cruijssen
1
217 octets . Peut économiser plus d'octets, cependant.
Olivier Grégoire
1
174 octets .
Olivier Grégoire
3

R , 123 octets

function(x,y=chartr("48UMW36917Z025","ABCEEEGGILNORS",gsub(" ","",x)))all(g(y[1])==g(y[2]))
g=function(z)sort(utf8ToInt(z))

Essayez-le en ligne!

utf8ToInt convertit une chaîne en un vecteur de points de code Unicode.

!sd(a-b)est un octet plus court que cela,all(a==b) mais cela n'aide pas ici parce que je traite en fait des entiers et non des logiques.

ngm
la source
Très agréable! Je pense que vous avez besoin !anyà la place !sdcar les éléments peuvent être tous égaux, mais à 1. Essayez:f(list("BCDEF","ABCDE"))
JayCe
2

J , 56 octets

-:&(-.&' '/:~@rplc'0123456789UMWZ';"0'OIREASGLBGCEEN'"1)

Essayez-le en ligne!

Explication:

& pour les arguments gauche et droit

-.&' ' supprime les espaces de l'entrée,

rplc remplace

'0123456789UMWZ';"0'OIREASGLBGCEEN'"1 les caractères en entrée par substitution des caractères de la colonne de gauche par ceux de la droite: (ici transposés pour gagner de la place)

      |:'0123456789UMWZ';"0'OIREASGLBGCEEN'
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│0│1│2│3│4│5│6│7│8│9│U│M│W│Z│
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│O│I│R│E│A│S│G│L│B│G│C│E│E│N│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

/:~@ et trie les chaînes résultantes

-: les chaînes triées sont-elles égales?

Ma première solution:

J , 77 73 octets

-:&(1#.(' '-.~])e."1[:(,a.,.@-.,)'EMW3','G69',9 2$'A4B8CUI1L7NZO0R2S5'"1)

Essayez-le en ligne!

Explication:

(' '-.~]) supprime les espaces des arguments et

e."1 teste l'appartenance de chaque personnage à la table suivante:

[:(,a.,.@-.,)'EMW3','G69',9 2$'A4B8CUI1L7NZO0R2S5'"1 le référence:

EMW3
G69 
A4  
B8  
CU  
I1  
L7  
NZ  
O0  
R2  
S5  
.
.
.  
All other symbols one in a row

1#. additionne les tableaux de comparaison pour chaque argument

-:& correspondent-ils?

Galen Ivanov
la source
2

Python 2 , 111 octets

lambda*t:2>len({`sorted(s.translate(dict(map(None,map(ord,'48UMW36917Z025 '),u'ABCEEEGGILNORS'))))`for s in t})

Essayez-le en ligne!

116 octets

lambda a,b:g(a)==g(b)
g=lambda s,y='4A8BUCMEWE3E6G9G1I7LZN0O2R5S ':y and g(s.replace(y[0],y[1:2]),y[2:])or sorted(s)

Essayez-le en ligne!

Lynn
la source
2

Gelée , 39 34 octets

ØB“¡Œ5a`@ẓRɼ9ẓ“%-/İ"aU5®’ṃyḟ⁶ṢɗⱮ⁸E

Essayez-le en ligne!

Erik le Outgolfer
la source
1

05AB1E , 38 33 octets

εðK.•2Θ`ĆĀÑεÉ•u6«•B/óÕ¦•…CN9«‡{}Ë

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

ε                   # Map each value in the (implicit) input-list by:
 ðK                 #  Remove all spaces
   .•2Θ`ĆĀÑεÉ•      #  Push compressed string "abemwgilorsuz"
              u     #  To uppercase: "ABEMWGILORSUZ"
               6«   #  Append a 6: "ABEMWGILORSUZ6"
   B/óÕ¦•          #  Push compressed integer 48333917025
          CN9«     #  Append "CN9": "48333917025CN9"
                   #  Transliterate; map all characters in "ABEMWGILORSUZ" in the
                    #  map-string to "48333917025CN9" at the same indices
    {               #  Then sort all characters
}                   # Close the map
 Ë                  # And check if both are equal (which is output implicitly)

Voir cette astuce 05AB1E (sections Comment compresser des chaînes ne faisant pas partie du dictionnaire? Et Comment compresser de grands entiers? ) Pour comprendre pourquoi .•2Θ`ĆĀÑεÉ•est "abemwgilorsuz"et •B/óÕ¦•est 48333917025.

Kevin Cruijssen
la source