Zastąpienie magnesu na lodówkę

29

Pisząc wiadomość za pomocą magnesów na lodówkę, często zdarza się, że zamieniasz ją 1na I. W tym wyzwaniu Twoim celem jest sprawdzenie, czy wiadomość można napisać przy użyciu liter innej wiadomości. Dozwolone podstawienia to:

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

Na przykład, wiadomość CIRCA 333może zostać zmieniona na pisownię ICE CREAM, gdzie pierwsze dwa 3s są obracane o 180 stopni, aby uzyskać dwa Es, a ostatnie 3jest obracane o 90 stopni przeciwnie do ruchu wskazówek zegara, aby zrobić M. Białe wiadomości mogą być zawarte w wiadomościach, ale nie powinny być uwzględniane w twoim rozwiązaniu, ponieważ są tworzone przez umieszczenie magnesów na lodówce.

Wkład

Dwa ciągi (lub tablice znaków). Wszystkie wiadomości będą pasować^[A-Z0-9 ]+$

Wydajność

Prawda, jeśli dwa ciągi wejściowe są poprawnymi wzajemnymi układami, w przeciwnym razie falsey.

Przykłady

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

Bardziej realistyczne przykłady

To są wszystkie 15+ literowe słowa, które odwzorowują na inne słowo. Niektóre są trywialnymi zamiennikami, ale zawarłem wszystko, co znalazłem.

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

Ponieważ jest to wyzwanie dla golfa, wygrywa najkrótsze rozwiązanie! Przyjmę najkrótsze rozwiązanie w ciągu 7 dni od opublikowania. Miłej gry w golfa!

Przykładowy roztwór bez golfa

Związane z

EDYCJA : Popełnił błąd w podstawieniach, miał G = 6i 6 = 9jako oddzielne podstawienia, połączył je w jedno.

maxb
źródło
2
Myślę, że 48 godzin to trochę za mało. Co z ludźmi, którzy grają w golfa tylko w weekendy?
Adám
Dobra uwaga, dam ci tydzień.
maxb
1
Inne podstawienia, które możesz rozważyć, to 7 dla T, H dla I (ale nie 1 dla H) i 2 dla N lub Z
Jeff Zeitlin
1
@JeffZeitlin Rozmawialiśmy o tym w piaskownicy wyzwania i postanowiłem wykluczyć wszystkie podstawienia, które nie są odwracalne. Ponieważ Ti Lnie można ich wymienić, nie mogę dodać T = 7. To samo dotyczy N = Z = 2, co implikuje to N = Z = R = 2. Jednak proponowane przez Ciebie zmiany podstawiłyby trudniejszą wersję tego wyzwania, którą mogę opublikować później. Chciałem tylko sprawdzić, czy tego rodzaju wyzwania zostałyby najpierw dobrze przyjęte.
maxb
1
@ 3D1T0R tak, podstawienie musi przebiegać w obie strony. Sprawdzenie polega na tym, czy dwa ciągi znaków są wzajemnie poprawnymi układami . Twój przykład wróci false.
maxb

Odpowiedzi:

4

Japt , 38 36 33 30 bajtów

Pobiera dane wejściowe jako tablicę 2 ciągów znaków.

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

Wypróbuj lub uruchom wszystkie przypadki testowe

3 bajty zapisane dzięki 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
Kudłaty
źródło
Fajna, obecnie bijąca galaretkę! Myślę, że możesz zrobić na końcu, aby zaoszczędzić 3 bajty.
ETHprodukcje
O tak, zapomniałem o tym. Dzięki, @ETHproductions.
Kudłaty
10

Python 2 , 145 131 130 129 125 bajtów

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

Wypróbuj online!

Alt:

Python 2 , 125 bajtów

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

Wypróbuj online!

TFeld
źródło
10

Ruby , 99 72 71 bajtów

->a{!!a.map{|x|x.tr("0-9UZMW","OIREASGLBGCNE").chars.sort-[" "]}.uniq!}

Wypróbuj online!

Pobiera tablicę ciągów, przyjmuje dane pisane wielkimi literami, jak we wszystkich przypadkach testowych.

-1 bajt golfowany przez benj2240.

Kirill L.
źródło
Podoba mi się to podejście! Dodaj trochę więcej, !aby uratować bajt
benj2240
Tak, to działa, dzięki.
Kirill L.,
9

JavaScript (ES6), 102 100 bajtów

Pobiera dane wejściowe jako dwie tablice znaków w składni curry (a)(b). Zwraca wartość logiczną.

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

Wypróbuj online!

W jaki sposób?

Używając funkcji pomocniczej g () , dla każdego wejścia s :

  • Cyfry od 0 do 8 oraz litery X , Y i Z pozostają niezmienione. Cała reszta jest wyraźnie przetłumaczona.

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

    Kod:

    s.map(c => '648UD3F6H1JK73Z0PQ25TUV3'[parseInt(c, 36) - 9] || c)
  • Sortujemy postacie (na początku wszystkie spacje), łączymy je i usuwamy wszystkie wiodące białe znaki.

    Kod:

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

Na koniec porównujemy oba wyniki.

Arnauld
źródło
6

Retina 0.8.2 , 42 bajty

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

Wypróbuj online! Pobiera dane wejściowe w osobnych wierszach, ale Link zawiera przypadki testowe i nagłówek. Wyjaśnienie:

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

Zamapuj wszystkie litery na minimalny zestaw, usuwając spacje.

%O`.

Posortuj każdy ciąg w kolejności.

^(.*)¶\1$

Porównaj dwie wartości.

Neil
źródło
5

APL (Dyalog Unicode) , 49 bajtów SBCS

-1 dzięki ngn.

Anonimowa ukryta funkcja prefiksu.

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

Wypróbuj online!

⎕R PCRE R eplace:
'UMWZ ' te pięć znaków
⎕D, poprzedzonych cyframi
 osobno (każdy z nich tworzy ciąg, a nie pojedynczy znak)
 z:
⊂⍬ nic
'OIREASGLBGCEEN', poprzedzonego tymi znakami

() Zastosuj do tego następującą milczącą funkcję:

( Zastosuj następującą milczącą funkcję do każdego:

   załączyć (traktować jako całość)

  ⍋⌷¨ użyj każdego z indeksów, który by go posortował, aby zindeksować cały ciąg (sortowanie)

≡/ czy są identyczni? (lit. zmniejszenie dopasowania)

Adám
źródło
''->
ngn
@ngn Nie wiem, dlaczego to działa, ale i tak dziękuję.
Adám
5

Python 2 , 108 bajtów

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

Wypróbuj online!

Istnieją 23 klasy równoważności znaków. Używając ciągu 36 znaków '85930A4614012B3C4D5EF6378GH9AI2J3KL7', mapujemy każdy znak na jego klasę równoważności (ignorując spacje), a następnie sortujemy wynikową tablicę. Dwa ciągi znaków są równoważne, jeśli powstałe listy są równe.

Chas Brown
źródło
4

Java 10, 262 260 258 216 208 174 bajtów

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 bajty dzięki @Arnauld .
-76 bajtów dzięki @ OlivierGrégoire .

Wypróbuj online.

Wyjaśnienie:

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
źródło
2
"A4B8CUEMEWE3G6G9I1L7NZO0R2S5".split("(?<=\\G.{2})")wydaje się działać ... chociaż nie jestem nawet pewien, jak dokładnie. : p
Arnauld
@Arnauld Dzięki, -2 bajty, i {2}może być .na kolejne -2 bajty. Nie jestem też w 100% pewien, jak to działa. Wiem, że (?<= ... )służy do dzielenia, ale zachowuję ogranicznik końcowy na element . Ale jestem trochę zdezorientowany, dlaczego (?=\\G..)(kontynuuj ogranicznik) nie działa w tym zakresie. A także tak naprawdę nie wiem, jak działa \\G..vs ..w tym podziale. Zobaczę, czy mogę gdzieś to rozgryźć, bo nie jestem ciekawy. ; p Dziękujemy w obu przypadkach za zapisane bajty. Trzeba pamiętać o \\Gdzieleniu na bloki o równej wielkości. :)
Kevin Cruijssen
1
@Arnauld Jeśli chcesz poznać tło (?<=\\G..)wewnątrz podziału, zadałem pytanie StackoverFlow, które rzuciło nieco światła. Zasadniczo jest to niezdefiniowane zachowanie działające inaczej w prawie każdym języku. Chociaż \Gw Javie ma zerową długość, z pozytywnym spojrzeniem za siebie w podziale, niejako koliduje z obiema regułami, powodując zachowanie, które tutaj widzimy. Dla mnie nadal jest to trochę niejasne, ale przynajmniej zaoszczędziło 4 bajty w tej odpowiedzi. ;)
Kevin Cruijssen
1
217 bajtów . Może jednak zaoszczędzić więcej bajtów.
Olivier Grégoire
1
174 bajty .
Olivier Grégoire
3

R , 123 bajty

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

Wypróbuj online!

utf8ToInt konwertuje ciąg znaków na wektor punktów kodu Unicode.

!sd(a-b)jest o jeden bajt krótszy niż,all(a==b) ale to nie pomaga tutaj, ponieważ mam do czynienia z liczbami całkowitymi, a nie logicznymi.

ngm
źródło
Bardzo dobrze! Myślę, że potrzebujesz !anyzamiast tego, !sdponieważ elementy mogą być wszystkie równe, ale do 1. Spróbuj:f(list("BCDEF","ABCDE"))
JayCe
2

J , 56 bajtów

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

Wypróbuj online!

Wyjaśnienie:

& zarówno dla argumentów lewego, jak i prawego

-.&' ' usuwa spacje z wejścia,

rplc zastępuje

'0123456789UMWZ';"0'OIREASGLBGCEEN'"1 znaki na wejściu poprzez zastąpienie znaków w lewej kolumnie znakami w prawej: (tutaj transponowano dla zaoszczędzenia miejsca)

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

/:~@ i sortuje powstałe ciągi

-: czy posortowane ciągi są równe?

Moje wstępne rozwiązanie:

J , 77 73 bajtów

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

Wypróbuj online!

Wyjaśnienie:

(' '-.~]) usuwa spacje z obu argumentów i

e."1 sprawdza każdą postać pod kątem członkostwa w poniższej tabeli:

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

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

1#. dodaje tabele porównawcze dla każdego argumentu

-:& czy oni pasują?

Galen Iwanow
źródło
2

Python 2 , 111 bajtów

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

Wypróbuj online!

116 bajtów

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)

Wypróbuj online!

Lynn
źródło
2

Galaretka , 39 34 bajtów

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

Wypróbuj online!

Erik the Outgolfer
źródło
1

05AB1E , 38 33 bajtów

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

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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

Zobacz moją wskazówkę 05AB1E (sekcje Jak kompresować ciągi znaków, które nie są częścią słownika? I Jak kompresować duże liczby całkowite? ), Aby zrozumieć, dlaczego .•2Θ`ĆĀÑεÉ•jest "abemwgilorsuz"i •B/óÕ¦•jest 48333917025.

Kevin Cruijssen
źródło