冰箱贴替代


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可以将邮件重新排列为拼写ICE CREAM,其中前两个3s旋转180度以形成两个Es,最后一个s 3逆时针旋转90度以形成M。消息中可以包含空格,但是不应在解决方案中考虑空格,因为空格是通过将磁铁放在冰箱上制成的。

输入值

两个字符串(或字符数组)。所有消息都将匹配^[A-Z0-9 ]+$

输出量

如果两个输入字符串相互有效重排,则为真,否则为假。

例子

["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天内接受最短的解决方案。打高尔夫球快乐!

样品溶液,无粉刺

有关

编辑:在替代中有一个错误,有G = 66 = 9作为单独的替代,将它们合并为一个。


2
我认为48小时有点短。那那些只在周末打高尔夫球的人呢?
阿达姆(Adám)

好点,我给它一个星期。
maxb

1
您可能考虑允许的其他替代方案是T代表7,I代表H(但H代表1),N或Z代表2
杰夫·泽特林

1
@JeffZeitlin我们在挑战沙箱中对此进行了讨论,我选择排除所有不可逆的替换。由于TL不可交换,因此我无法添加T = 7。同样N = Z = 2,这暗示着N = Z = R = 2。但是,您建议的替代方式会使该挑战的难度更大,我可能会在以后发布。我只是想看看这些挑战是否会首先被接受。
maxb

1
@ 3D1T0R是的,替换必须同时进行。支票是两个字符串是否有效的重排彼此。您的示例将返回false
maxb

Answers:


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

Python 2中145个 131 130 129 125字节

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

在线尝试!

替代:

Python 2,125个字节

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

在线尝试!


10

红宝石99 72 71字节

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

在线尝试!

与所有测试用例一样,采用字符串数组,并假设输入为大写。

-1字节被benj2240打高尔夫球。


我喜欢这种方法!!
再撒

是的,行得通,谢谢。
Kirill L.

9

的JavaScript(ES6),102个 100字节

以currying语法将输入作为两个字符数组(a)(b)。返回一个布尔值。

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

在线尝试!

怎么样?

对于每个输入s,使用辅助函数g()

  • 数字08以及字母XYZ保持不变。其他所有内容均已明确翻译。

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

    码:

    s.map(c => '648UD3F6H1JK73Z0PQ25TUV3'[parseInt(c, 36) - 9] || c)
  • 我们对字符进行排序(开头带有所有空格),将它们加入并删除所有前导空格。

    码:

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

最后,我们比较两个输出。


6

视网膜0.8.2,42字节

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

在线尝试!在单独的行上进行输入,但是Link包括测试用例和标头。说明:

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

将所有字母映射到最小集,删除空格。

%O`.

将每个字符串排序。

^(.*)¶\1$

比较两个值。


5

APL(Dyalog Unicode),49 字节SBCS

-1感谢ngn。

匿名默认前缀功能。

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

在线尝试!

⎕R PCRE ř E放置:
'UMWZ ' 这些五个字符
⎕D, 由数字前面
 分开(使每个成字符串而不是一个单个字符)
 用:
⊂⍬ 没有
'OIREASGLBGCEEN', 由这些字符之前

(…… ) 对此应用以下默认功能:

(……  对每个应用以下默认功能:

   封闭(将其作为一个整体)

  ⍋⌷¨ 使用将对它进行排序的每个索引来索引整个字符串(排序)

≡/ 他们是相同的吗?(减少照明量匹配)


''->
ngn

@ngn不确定为什么可以,但是还是谢谢。
阿达姆(Adám)'18年

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',我们将每个字符映射到其等效类(忽略空格),然后对所得数组进行排序。如果结果列表相等,则两个字符串相等。


4

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

-2个字节感谢@Arnauld
-76个字节,感谢@OlivierGrégoire

在线尝试。

说明:

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

@Arnauld谢谢,-2个字节,{2}可以.用于另一个-2个字节。我也不是100%知道它是如何工作的。我知道(?<= ... )是用来拆分的,但每个项目后面都要保留定​​界符。但是我有点困惑为什么(?=\\G..)(保持领先的分隔符)在这方面不起作用。而且也不太了解\\G..vs ..在这里的拆分方式。会看看我是否能在某个地方弄清楚,因为不是我很好奇。; p两种方式都可以保存字节。\\G在均匀大小的块上分割时需要记住。:)
Kevin Cruijssen

1
@Arnauld如果您想了解(?<=\\G..)拆分内的一些背景知识,我提出了一个StackoverFlow问题,该问题为您带来了一些启示。基本上,这是未定义的行为,几乎在每种语言中其工作方式都不同。尽管\G长度为零,但在Java中在拆分内部具有正向后视的情况下,它有点冲突两个规则,导致我们在此处看到的行为。就我个人而言,这仍然有些模糊,但至少在此答案中节省了4个字节。;)
Kevin Cruijssen



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)all(a==b)短1个字节,但这在这里无济于事,因为我实际上是在处理整数而不是逻辑。


非常好!我认为您需要!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#. 汇总每个参数的比较表

-:& 他们匹配吗?



2

Python 2,111字节

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

在线尝试!

116字节

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)

在线尝试!




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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.