Substitusi magnet kulkas

29

Saat menulis pesan dengan magnet kulkas, Anda akan sering menemukan diri Anda mengganti sebuah 1untuk I. Dalam tantangan ini, tujuan Anda adalah untuk mengetahui apakah suatu pesan dapat ditulis menggunakan huruf-huruf dari pesan lain. Pergantian yang diizinkan adalah:

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

Misalnya, pesan CIRCA 333dapat disusun ulang untuk mengeja ICE CREAM, di mana dua 3s pertama diputar 180 derajat untuk membuat dua Es, dan yang terakhir 3diputar 90 derajat berlawanan arah jarum jam untuk membuat M. Ruang putih dapat dimasukkan dalam pesan, tetapi mereka tidak harus diperhitungkan dalam solusi Anda, karena dibuat dengan menempatkan magnet di lemari es.

Memasukkan

Dua string (atau array karakter). Semua pesan akan cocok^[A-Z0-9 ]+$

Keluaran

Benar jika dua string input adalah pengaturan ulang yang valid satu sama lain, falsey sebaliknya.

Contohnya

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

Lebih banyak contoh menarik

Ini adalah semua 15 kata kata yang memetakan ke kata lain Beberapa substitusi sepele, tetapi saya memasukkan semua yang saya temukan.

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

Karena ini adalah tantangan kode golf, solusi terpendek menang! Saya akan menerima solusi terpendek dalam 7 hari dari posting. Selamat bermain golf!

Solusi sampel, non-golf

Terkait

EDIT : Membuat kesalahan dalam pergantian, memiliki G = 6dan 6 = 9sebagai pergantian terpisah, menggabungkan mereka menjadi satu.

maks
sumber
2
Saya pikir 48 jam agak singkat. Bagaimana dengan orang yang hanya bermain golf di akhir pekan?
Adám
Poin bagus, saya akan memberikannya seminggu.
Maks
1
Pergantian lain yang Anda mungkin mempertimbangkan untuk mengizinkan adalah 7 untuk T, H untuk I (tetapi tidak 1 untuk H), dan 2 untuk N atau Z
Jeff Zeitlin
1
@JeffZeitlin Kami berdiskusi tentang ini di sandbox tantangan, dan saya memilih untuk mengecualikan semua substitusi yang tidak dapat dibalik. Karena Tdan Ltidak bisa ditukar, saya tidak bisa menambahkan T = 7. Hal yang sama berlaku untuk N = Z = 2, yang akan menyiratkan hal itu N = Z = R = 2. Namun, jenis pengganti yang Anda sarankan akan membuat versi yang lebih sulit dari tantangan ini, yang mungkin saya posting di lain waktu. Saya hanya ingin melihat apakah tantangan seperti ini akan diterima dengan baik terlebih dahulu.
Maks
1
@ 3D1T0R ya, substitusi harus berjalan dua arah. Cek adalah jika dua string adalah pengaturan ulang yang valid satu sama lain . Teladan Anda akan kembali false.
Maks

Jawaban:

4

Japt , 38 36 33 30 byte

Mengambil input sebagai array dari 2 string.

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

Cobalah atau jalankan semua test case

3 byte disimpan berkat 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
Shaggy
sumber
Bagus, saat ini mengalahkan Jelly! Saya pikir Anda bisa melakukannya di akhir untuk menghemat 3 byte.
ETHproduksi
Oh, ya, aku lupa itu. Terima kasih, @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'))

Cobalah online!

Alt:

Python 2 , 125 byte

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

Cobalah online!

TFeld
sumber
10

Ruby , 99 72 71 byte

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

Cobalah online!

Mengambil array string, menganggap input dalam huruf besar seperti dalam semua kasus uji.

-1 byte golf oleh benj2240.

Kirill L.
sumber
Saya suka pendekatan ini! Taburkan beberapa lagi !untuk menyimpan byte
benj2240
Ya, itu berhasil, terima kasih.
Kirill L.
9

JavaScript (ES6), 102 100 byte

Mengambil input sebagai dua larik karakter dalam sintaks currying (a)(b). Mengembalikan boolean.

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

Cobalah online!

Bagaimana?

Menggunakan fungsi helper g () , untuk setiap input s :

  • Digit 0 hingga 8 dan huruf X , Y dan Z tidak berubah. Yang lainnya diterjemahkan secara eksplisit.

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

    Kode:

    s.map(c => '648UD3F6H1JK73Z0PQ25TUV3'[parseInt(c, 36) - 9] || c)
  • Kami mengurutkan karakter (yang membawa semua spasi di awal), bergabung dengan mereka dan menghapus semua spasi putih terkemuka.

    Kode:

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

Akhirnya, kami membandingkan kedua output.

Arnauld
sumber
6

Retina 0.8.2 , 42 byte

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

Cobalah online! Mengambil input pada baris yang berbeda, tetapi Tautan menyertakan case uji dan header. Penjelasan:

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

Petakan semua huruf ke set minimal, hapus spasi.

%O`.

Urutkan setiap string ke dalam urutan.

^(.*)¶\1$

Bandingkan kedua nilai tersebut.

Neil
sumber
5

APL (Dyalog Unicode) , 49 byte SBCS

-1 terima kasih kepada ngn.

Fungsi awalan diam-diam anonim.

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

Cobalah online!

⎕R PCRE R eplace:
'UMWZ ' lima karakter ini
⎕D, didahului oleh digit
 secara terpisah (membuat masing-masing menjadi string daripada menjadi karakter tunggal)
 dengan:
⊂⍬ tidak ada yang
'OIREASGLBGCEEN', didahului oleh karakter ini

(... ) terapkan fungsi tersembunyi berikut untuk itu:

(...  terapkan fungsi tersembunyi berikut untuk masing-masing:

   lampirkan (untuk memperlakukannya secara keseluruhan)

  ⍋⌷¨ gunakan setiap indeks yang akan mengurutkannya untuk mengindeks ke seluruh string

≡/ apakah mereka identik? (lit. pengurangan pertandingan)

Adm
sumber
''->
ngn
@ ngn Tidak yakin mengapa itu berhasil, tapi terima kasih.
Adam
5

Python 2 , 108 byte

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

Cobalah online!

Ada 23 kelas karakter ekuivalensi. Menggunakan string 36 karakter '85930A4614012B3C4D5EF6378GH9AI2J3KL7', kami memetakan setiap karakter ke kelas ekivalennya (mengabaikan ruang), lalu mengurutkan array yang dihasilkan. Dua string setara jika daftar yang dihasilkan sama.

Chas Brown
sumber
4

Java 10, 262 260 258 216 208 174 byte

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 byte terima kasih kepada @Arnauld .
-76 byte terima kasih kepada @ OlivierGrégoire .

Cobalah online.

Penjelasan:

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
sumber
2
"A4B8CUEMEWE3G6G9I1L7NZO0R2S5".split("(?<=\\G.{2})")tampaknya bekerja ... walaupun saya bahkan tidak yakin persis bagaimana caranya. : p
Arnauld
@Arnauld Terima kasih, -2 byte, dan {2}bisa .untuk -2 byte lainnya. Saya juga tidak 100% yakin cara kerjanya. Saya tahu (?<= ... )digunakan untuk membagi tetapi tetap mengikuti pembatas per item . Tapi saya agak bingung mengapa (?=\\G..)(tetap memimpin pembatas) tidak bekerja dalam hal itu. Dan juga tidak benar-benar tahu bagaimana tindakan \\G..vs ..di split di sini. Akan melihat apakah saya bisa mengetahuinya di suatu tempat, karena bukan saya penasaran. ; p Terima kasih baik untuk byte yang disimpan. Perlu diingat \\Gsaat membelah blok yang berukuran rata. :)
Kevin Cruijssen
1
@Arnauld Jika Anda ingin latar belakang tentang (?<=\\G..)di dalam split, saya telah membuat pertanyaan StackoverFlow yang memberi sedikit cahaya. Pada dasarnya itu adalah perilaku tidak terdefinisi yang bekerja secara berbeda di hampir setiap bahasa. Meskipun \Gpanjangnya nol, di Jawa dengan tampilan positif di dalam perpecahan, agak konflik kedua aturan menyebabkan perilaku yang kita lihat di sini. Ini masih agak samar bagi saya secara pribadi, tetapi setidaknya itu menghemat 4 byte dalam jawaban ini. ;)
Kevin Cruijssen
1
217 byte . Dapat menyimpan lebih banyak byte.
Olivier Grégoire
1
174 byte .
Olivier Grégoire
3

R , 123 byte

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

Cobalah online!

utf8ToInt mengubah string menjadi vektor titik kode Unicode.

!sd(a-b)adalah satu byte lebih pendek dariall(a==b) tetapi itu tidak membantu di sini karena saya sebenarnya berurusan dengan bilangan bulat dan bukan logika.

ngm
sumber
Sangat bagus! Saya pikir Anda perlu !anydi tempat !sdsebagai elemen bisa semua sama, tetapi untuk 1. Cobalah:f(list("BCDEF","ABCDE"))
Jayce
2

J , 56 byte

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

Cobalah online!

Penjelasan:

& untuk argumen kiri dan kanan

-.&' ' menghapus spasi dari input,

rplc menggantikan

'0123456789UMWZ';"0'OIREASGLBGCEEN'"1 karakter dalam input dengan mengganti karakter di kolom kiri dengan yang di kanan: (di sini dialihkan untuk menghemat ruang)

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

/:~@ dan mengurutkan string yang dihasilkan

-: apakah string yang diurutkan sama?

Solusi awal saya:

J , 77 73 byte

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

Cobalah online!

Penjelasan:

(' '-.~]) menghapus spasi dari argumen dan

e."1 menguji setiap karakter untuk keanggotaan dalam tabel berikut:

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

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

1#. menjumlahkan tabel perbandingan untuk setiap argumen

-:& apakah mereka cocok?

Galen Ivanov
sumber
2

Perl 6 , 55 byte

{[eq] .map:{sort TR/0..9UZMW/OIREASGLBGCNEE/~~m:g/\S/}}

Cobalah online!

Bekerja dengan sejumlah string yang berubah-ubah.

nwellnhof
sumber
2

Python 2 , 111 byte

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

Cobalah online!

116 byte

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)

Cobalah online!

Lynn
sumber
2

Python 3 , 105 byte

lambda a,b:X(a)==X(b)
X=lambda s:sorted(("ABCEEEGGILNORS"+c)["48UMW36917Z025".find(c)]for c in s if' '<c)

Cobalah online!

RootTwo
sumber
2

Jelly , 39 34 byte

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

Cobalah online!

Erik the Outgolfer
sumber
1

05AB1E , 38 33 byte

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

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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

Lihat tip tambang 05AB1E ini (bagian Bagaimana mengompresi string bukan bagian dari kamus? Dan Bagaimana mengompresi bilangan bulat besar? ) Untuk memahami mengapa .•2Θ`ĆĀÑεÉ•ini "abemwgilorsuz"dan •B/óÕ¦•sekarang 48333917025.

Kevin Cruijssen
sumber