Austausch des Kühlschrankmagneten


29

Wenn Sie eine Nachricht mit Kühlschrankmagneten schreiben, werden Sie häufig feststellen, dass Sie ein 1durch ein ersetzen I. In dieser Herausforderung besteht Ihr Ziel darin, herauszufinden, ob eine Nachricht mit den Buchstaben einer anderen Nachricht geschrieben werden kann. Die erlaubten Substitutionen sind:

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

Zum Beispiel kann die Nachricht CIRCA 333kann buchstabieren werden neu geordnet ICE CREAM, wobei die ersten beiden 3s um 180 Grad gedreht sind zwei zu machen Es, und die letzten 3gedreht um 90 Grad entgegen dem Uhrzeigersinn eine machen M. Leerzeichen können in den Nachrichten enthalten sein, sollten jedoch in Ihrer Lösung nicht berücksichtigt werden, da sie durch Platzieren der Magnete auf dem Kühlschrank erstellt werden.

Eingang

Zwei Zeichenfolgen (oder Zeichenarrays). Alle Nachrichten stimmen überein^[A-Z0-9 ]+$

Ausgabe

Wahrheit, wenn die beiden Eingabezeichenfolgen gültige Umlagerungen voneinander sind, sonst falsch.

Beispiele

["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

Weitere Beispiele

Dies sind alle Wörter mit mehr als 15 Buchstaben, die einem anderen Wort zugeordnet sind. Einige sind triviale Substitutionen, aber ich habe alles eingeschlossen, was ich gefunden habe.

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

Da dies eine Code-Golf-Herausforderung ist, gewinnt die kürzeste Lösung! Ich akzeptiere die kürzeste Lösung innerhalb von 7 Tagen nach der Veröffentlichung. Viel Spaß beim Golfen!

Musterlösung, nicht golfen

verbunden

BEARBEITEN : Fehler in den Ersetzungen gemacht, hatte G = 6und 6 = 9als separate Ersetzungen, sie zu einer zusammengeführt.


2
Ich denke, 48 Stunden sind ein bisschen kurz. Was ist mit Leuten, die nur am Wochenende Golf spielen?
Adám

Guter Punkt, ich gebe es eine Woche.
Maxb

1
Andere Substitutionen, die Sie in Betracht ziehen könnten, sind 7 für T, H für I (aber nicht 1 für H) und 2 für N oder Z
Jeff Zeitlin

1
@ JeffZeitlin Wir hatten eine Diskussion darüber in der Challenge-Sandbox, und ich habe mich dafür entschieden, alle Substitutionen auszuschließen, die nicht umkehrbar sind. Da Tund Lnicht austauschbar sind, kann ich nicht hinzufügen T = 7. Das gleiche gilt N = Z = 2, was dies implizieren würde N = Z = R = 2. Die Art der von Ihnen vorgeschlagenen Substitutionen würde jedoch zu einer schwierigeren Version dieser Herausforderung führen, die ich zu einem späteren Zeitpunkt veröffentlichen könnte. Ich wollte nur sehen, ob solche Herausforderungen zuerst gut aufgenommen werden.
Maxb

1
@ 3D1T0R ja, die Ersetzung muss in beide Richtungen erfolgen. Es wird geprüft, ob zwei Zeichenfolgen gültige Umordnungen voneinander sind . Ihr Beispiel würde zurückkehren false.
Maxb

Antworten:


4

Japt , 38 36 33 30 Bytes

Übernimmt die Eingabe als Array von 2 Zeichenfolgen.

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

Probieren Sie es aus oder führen Sie alle Testfälle aus

Dank ETHProductions 3 Bytes gespart

®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

Schön, gerade gegen Jelly! Ich denke, Sie können am Ende tun , um 3 Bytes zu sparen.
ETHproductions

Oh ja, das habe ich vergessen. Vielen Dank, @ETHproductions.
Shaggy

10

Python 2 , 145 131 130 129 125 Byte

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'))

Probieren Sie es online!

Alt:

Python 2 , 125 Bytes

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

Probieren Sie es online!



9

JavaScript (ES6), 102 100 Byte

Nimmt die Eingabe als zwei Zeichenfelder in der aktuellen Syntax an (a)(b). Gibt einen Booleschen Wert zurück.

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

Probieren Sie es online!

Wie?

Verwenden Sie die Hilfsfunktion g () für jeden Eingang s :

  • Die Ziffern 0 bis 8 und die Buchstaben X , Y und Z bleiben unverändert. Alles andere wird explizit übersetzt.

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

    Code:

    s.map(c => '648UD3F6H1JK73Z0PQ25TUV3'[parseInt(c, 36) - 9] || c)
  • Wir sortieren die Zeichen (die am Anfang alle Leerzeichen enthalten), fügen sie zusammen und entfernen alle führenden Leerzeichen.

    Code:

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

Schließlich vergleichen wir beide Ausgaben.


6

Retina 0,8,2 , 42 Bytes

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

Probieren Sie es online! Nimmt Eingaben in separaten Zeilen vor, Link enthält jedoch Testfälle und Header. Erläuterung:

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

Ordnen Sie alle Buchstaben einem minimalen Satz zu und löschen Sie die Leerzeichen.

%O`.

Sortieren Sie jede Zeichenfolge in der Reihenfolge.

^(.*)¶\1$

Vergleichen Sie die beiden Werte.


5

APL (Dyalog Unicode) , 49 Byte SBCS

-1 danke an ngn.

Anonyme implizite Präfixfunktion.

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

Probieren Sie es online!

⎕R PCRE R eplace:
'UMWZ ' diese fünf Zeichen
⎕D, durch die Ziffern voran
 getrennt (stellen jeweils in eine Zeichenfolge , anstatt ein einzelnes Zeichen sein)
 mit:
⊂⍬ nichts
'OIREASGLBGCEEN', von diesen Zeichen voran

() Wenden darauf folgende implizite Funktion an:

( Wenden auf jede folgende stillschweigende Funktion an:

   umschließe es (um es als Ganzes zu behandeln)

  ⍋⌷¨ Verwenden Sie jeden der Indizes, die ihn sortieren würden, um den gesamten String zu indizieren (sortieren).

≡/ sind sie identisch? (Lit. Match Reduktion)


''->
15.

@ngn Nicht sicher, warum das funktioniert, aber trotzdem danke.
Adám,

5

Python 2 , 108 Bytes

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

Probieren Sie es online!

Es gibt 23 Äquivalenzklassen von Zeichen. Mit der 36-stelligen Zeichenfolge ordnen '85930A4614012B3C4D5EF6378GH9AI2J3KL7'wir jedes Zeichen seiner Äquivalenzklasse zu (wobei Leerzeichen ignoriert werden) und sortieren dann das resultierende Array. Zwei Zeichenfolgen sind äquivalent, wenn die resultierenden Listen gleich sind.


4

Java 10, 262 260 258 216 208 174 Bytes

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 Bytes dank @Arnauld .
-76 Bytes dank @ OlivierGrégoire .

Probieren Sie es online aus.

Erläuterung:

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

2
"A4B8CUEMEWE3G6G9I1L7NZO0R2S5".split("(?<=\\G.{2})")scheint zu funktionieren ... obwohl ich nicht mal genau weiß wie. : p
Arnauld

@ Arnauld Danke, -2 Bytes, und {2}kann .für weitere -2 Bytes sein. Ich bin mir auch nicht 100% sicher, wie es funktioniert. Ich weiß, (?<= ... )wird verwendet, um zu teilen, aber nachgestellte Begrenzer pro Element zu behalten . Aber ich bin ein bisschen verwirrt, warum (?=\\G..)(führendes Trennzeichen beibehalten) diesbezüglich nicht funktioniert. Und weiß auch nicht so recht, wie sich das \\G..vs hier ..im Split verhält. Mal sehen, ob ich es irgendwo rauskriegen kann, weil ich nicht neugierig bin. ; p Wie auch immer, danke für die gespeicherten Bytes. Muss \\Gbeim Teilen von Blöcken mit gerader Größe beachtet werden. :)
Kevin Cruijssen

1
@Arnauld Wenn Sie Hintergrundinformationen zu (?<=\\G..)einer Teilung benötigen , habe ich eine StackoverFlow-Frage erstellt, die etwas Licht ins Dunkel bringt . Grundsätzlich ist es undefiniertes Verhalten, das in fast jeder Sprache anders funktioniert. Obwohl \Ges sich bei Java um eine Null-Länge handelt, mit dem positiven Blick hinter die Aufteilung, widerspricht es in gewisser Weise beiden Regeln, die das hier gezeigte Verhalten verursachen. Es ist mir persönlich immer noch ein bisschen vage, aber zumindest hat es in dieser Antwort 4 Bytes gespart. ;)
Kevin Cruijssen

1
217 Bytes . Kann jedoch mehr Bytes einsparen.
Olivier Grégoire


3

R , 123 Bytes

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

Probieren Sie es online!

utf8ToInt wandelt einen String in einen Vektor von Unicode-Codepunkten um.

!sd(a-b)ist ein Byte kürzer als,all(a==b) aber das hilft hier nicht weiter, weil es sich tatsächlich um Ganzzahlen und nicht um logische Werte handelt.


Sehr schön! Ich denke, Sie müssen !anyanstelle von, !sdwie die Elemente alle gleich sein könnten, aber 1. Versuchen Sie:f(list("BCDEF","ABCDE"))
JayCe

2

J , 56 Bytes

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

Probieren Sie es online!

Erläuterung:

& für beide linken und rechten Argumente

-.&' ' entfernt Leerzeichen aus der Eingabe,

rplc ersetzt

'0123456789UMWZ';"0'OIREASGLBGCEEN'"1 die Zeichen in der Eingabe durch Ersetzen der Zeichen in der linken Spalte durch die Zeichen in der rechten: (hier aus Platzgründen transponiert)

      |:'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│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

/:~@ und sortiert die resultierenden Zeichenfolgen

-: Sind die sortierten Zeichenfolgen gleich?

Meine anfängliche Lösung:

J , 77 73 Bytes

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

Probieren Sie es online!

Erläuterung:

(' '-.~]) Entfernt Leerzeichen aus beiden Argumenten und

e."1 testet jedes Zeichen auf Mitgliedschaft in der folgenden Tabelle:

[:(,a.,.@-.,)'EMW3','G69',9 2$'A4B8CUI1L7NZO0R2S5'"1 die Referenz:

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

1#. addiert die Vergleichstabellen für jedes Argument

-:& passen sie zusammen






1

05AB1E , 38 33 Bytes

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

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

ε                   # 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)

Sehen Sie sich meinen Tipp 05AB1E an (Abschnitte So komprimieren Sie Zeichenfolgen, die nicht Teil des Wörterbuchs sind, und So komprimieren Sie große Ganzzahlen ), um zu verstehen, warum dies so .•2Θ`ĆĀÑεÉ•ist "abemwgilorsuz"und •B/óÕ¦•ist 48333917025.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.