冷蔵庫用マグネットの代替


29

冷蔵庫用マグネットとのメッセージを書くとき、あなたは、多くの場合、自分が代わりに見つける1ためにI。この課題の目標は、別のメッセージの文字を使用してメッセージを作成できるかどうかを確認することです。許可される置換は次のとおりです。

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

たとえば、メッセージCIRCA 333はspell ICE CREAMに再配置できます。最初の2つ3は180度回転して2つを作成Eし、最後の2つ3は反時計回りに90度回転してを作成しMます。空白はメッセージに含めることができますが、冷蔵庫に磁石を置くことで作成されるため、ソリューションで考慮する必要はありません。

入力

2つの文字列(または文字配列)。すべてのメッセージが一致します^[A-Z0-9 ]+$

出力

2つの入力文字列が互いに有効な再配置である場合は真実、そうでない場合は偽です。

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

より巧妙な例

これらはすべて、別の単語にマップされる15文字以上の単語です。いくつかは取るに足らない置換ですが、私が見つけたものをすべて含めました。

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

これはコードゴルフチャレンジであるため、最短のソリューションが勝ちです!投稿から7日以内に最短の解決策を受け入れます。ハッピーゴルフ!

サンプルソリューション、非ゴルフ

関連する

EDITは:、置換でエラーをしていたG = 6し、6 = 9別の置換として、1にそれらを合併しました。


2
48時間は少し短いと思います。週末だけゴルフをする人はどうですか?
アダム

良い点、私はそれを一週間与えます。
maxb

1
あなたができるように検討するかもしれないことを他の置換は、I用T、Hのための7(ただし、1 H用)、およびNまたはZ 2です
ジェフザイトリン

1
@JeffZeitlinチャレンジサンドボックスでこれについて議論しましたが、元に戻せないすべての置換を除外することにしました。以来TL交換可能ではありません、私は追加することはできませんT = 7。同じN = Z = 2ことが当てはまりN = Z = R = 2ます。しかし、あなたが提案する種類の置換は、この挑戦​​のより難しいバージョンを作るでしょう、それは後で投稿するかもしれません。この種の課題が最初に受け入れられるかどうかを見たかっただけです。
maxb

1
@ 3D1T0Rはい、置換は両方の方法で行わなければなりません。チェックは2つのストリングが互いの有効な再配置であるかどうかです。あなたの例は戻りfalseます。
maxb

回答:


4

Japt38 36 33 30バイト

入力を2つの文字列の配列として受け取ります。

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

試してみるかすべてのテストケースを実行してください

ETHProductionsのおかげで3バイト節約

®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

ニース、現在ゼリーを破っています!最後に3バイトを節約することができると思います。
-ETHproductions

ああ、そう、私はそれを忘れていた。ありがとう、@ ETHproductions。
シャギー


10

ルビー99 72 71バイト

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

オンラインでお試しください!

文字列の配列を受け取り、すべてのテストケースのように入力が大文字であると想定します。

-1バイトはbenj2240によってゴルフされます。



うん、うまくいきました、ありがとう。
キリルL.

9

JavaScriptの(ES6)、102の 100バイト

入力をカリー化構文の2つの文字配列として受け取ります(a)(b)。ブール値を返します。

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

オンラインでお試しください!

どうやって?

各入力sに対してヘルパー関数g()を使用します。

  • 数字08及び文字XY及びZは変更されません。その他はすべて明示的に翻訳されます。

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

    コード:

    s.map(c => '648UD3F6H1JK73Z0PQ25TUV3'[parseInt(c, 36) - 9] || c)
  • 文字を並べ替え(先頭にすべてのスペースが表示されます)、それらを結合して、先頭の空白をすべて削除します。

    コード:

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

最後に、両方の出力を比較します。


6

Retina 0.8.2、42バイト

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

オンラインでお試しください!別の行で入力を取りますが、リンクにはテストケースとヘッダーが含まれます。説明:

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

すべての文字を最小限のセットにマッピングして、スペースを削除します。

%O`.

各文字列を順番に並べ替えます。

^(.*)¶\1$

2つの値を比較します。


5

APL(Dyalog Unicode)、49 バイトSBCS

-1 ngnに感謝します。

匿名の暗黙の接頭辞関数。

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

オンラインでお試しください!

⎕R PCRE Rの eplace:
'UMWZ ' これら5文字
⎕D, の数字が前に
 個別に(むしろ単一の文字であることよりも、列にそれぞれを作る)
 :で
⊂⍬ 何も
'OIREASGLBGCEEN', これらの文字が先行

() 次の暗黙関数を適用します:

( 次の暗黙関数をそれぞれに適用します。

   囲む(全体として扱うため)

  ⍋⌷¨ 並べ替える各インデックスを使用して、文字列全体にインデックスを付けます(並べ替え)

≡/ それらは同一ですか?(点灯一致の削減)


''->
ngn

@ngnそれがなぜ機能するのかはわかりませんが、とにかく感謝します。
アダム

5

Python 2、108バイト

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

オンラインでお試しください!

文字には23の等価クラスがあります。36文字の文字列を使用して、'85930A4614012B3C4D5EF6378GH9AI2J3KL7'各文字をその等価クラスにマップし(スペースは無視)、結果の配列をソートします。結果のリストが等しい場合、2つの文字列は同等です。


4

Java 10、262 260 258 216 208 174バイト

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);}

@Arnauldのおかげで-2バイト。@OlivierGrégoireに
感謝-76バイト。

オンラインでお試しください。

説明:

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})")動作しているようです...私は正確にどのように確信していませんが。:p
アーナウド

@Arnauldおかげで、-2バイト、{2}とすることができる.別-2バイトため。私はそれがどのように機能するのか100%も確信していません。私(?<= ... )分割するために使用されますが、アイテムごとに末尾の区切り文字を保持することを知っています。しかし(?=\\G..)、その点で(先頭の区切り文字を保持する)が機能しない理由は少し混乱しています。また、ここでの分割で\\G..vs がどのように..機能するのかもよくわかりません。私は興味がないので、私はどこかでそれを理解できるかどうかを確認します。; pいずれにせよ、保存されたバイトをありがとう。\\G偶数サイズのブロックで分割するときは覚えておく必要があります。:)
ケビンクルーイセン

1
@Arnauld (?<=\\G..)スプリット内部の背景を知りたい場合は、StackoverFlowの質問に答えてみました。基本的に、ほとんどすべての言語で異なる動作をする未定義の動作です。が\Gゼロ長である、スプリット内部の正ルックの背後にあるとJavaで、それはちょっと私たちはここを参照してください行動を起こし両方のルールを競合します。個人的にはまだ少し曖昧ですが、少なくともこの回答では4バイト節約できました。;)
ケビンクルーイッセン

1
217バイト。ただし、より多くのバイトを節約できます。
オリビエグレゴワール


3

R、123バイト

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

オンラインでお試しください!

utf8ToInt 文字列をUnicodeコードポイントのベクトルに変換します。

!sd(a-b)は1バイト短くなりますall(a==b)が、実際には論理ではなく整数を扱っているため、ここでは役に立ちません。


非常に素晴らしい!要素はすべて等しくなる可能性があるので!any、代わりに必要だと思います!sd。ただし、1にしてくださいf(list("BCDEF","ABCDE"))
。– JayCe

2

J、56バイト

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

オンラインでお試しください!

説明:

& 左引数と右引数の両方について

-.&' ' 入力からスペースを削除します。

rplc 置き換える

'0123456789UMWZ';"0'OIREASGLBGCEEN'"1 左の列の文字を右の列の文字に置き換えることによる入力内の文字:(ここではスペースを節約するために転置されています)

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

/:~@ 結果の文字列をソートします

-: ソートされた文字列は等しいですか?

私の最初の解決策:

J77 73バイト

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

オンラインでお試しください!

説明:

(' '-.~]) 両方の引数からスペースを削除し、

e."1 次の表のメンバーシップについて各文字をテストします。

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

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

1#. 各引数の比較表を合計します

-:& 彼らは一致しますか?






1

05AB1E38 33 バイト

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

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

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

この05AB1Eのヒント(辞書の一部ではない文字列を圧縮する方法および大きな整数を圧縮する方法?を参照して、.•2Θ`ĆĀÑεÉ•is "abemwgilorsuz"および•B/óÕ¦•is を理解してください48333917025

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.