逆转魔方算法


19

每当您在魔方魔方上移动时,都会有一个反向移动,它会撤消第一个移动。因此,每个算法(一组动作)都有一个反向算法,该算法会取消第一个算法。

这项挑战的目标是找到给定算法的反面。

规格:

输入包含单个动作的数组。每一步都是一个长度为1或2的字符串。当然,您可以使用最适合您的语言的任何输入格式。每个动作都由结构XX'或组成X2,其中X是大写或小写字母。

要反转X,只需将其替换为X'。同样,X'变为XX2另一方面不会改变。

若要创建输出,请反转每个动作,然后反转数组。

示例(用空格分隔的字符串):

R => R'

D U' => U D'

S T A C K => K' C' A' T' S'

A2 B2 => B2 A2

得分:

这是代码高尔夫球,因此赢得的字节数最少。不允许出现标准漏洞。


是否允许R2-> R2'B-> B3
CalculatorFeline

2
不得不处理X3X1将是对挑战的很好补充。
毛茸茸的

1
“因此,每个算法(一组动作)都有一个反向算法,该反向算法会取消第一个算法”对于每个算法都是这样吗?因为我认为哈希算法是一种方法。意味着它没有任何反向算法,对吗?请让我知道
Avishek Saha'7

4
@AvishekSaha:对于Rubik的多维数据集问题,“算法”的含义仅限于“可以在多维数据集上执行的一系列动作”。从这个意义上讲,在多维数据集上不存在单向哈希算法。
Ross Presser

5
应该有D2R2一个测试用例……
尼尔(Neil)

Answers:



7

V13 10字节

æGÇä/á'Ó''

在线尝试!

感谢@nmjmcman指出了我最喜欢的功能,节省了3个字节。说明:

æG          " Revere the order of every line
  Ç         " On every line not containing...
   ä/       " a digit:
     á'     "   Append an '
       Ó    "   Remove every instance on this line
        ''  "     Of two single quotes

难道ä当编译VIM等代表一个正则表达式?
Downgoat'7

@Downgoat是的!是的 转换为vim,此解决方案是:g!/\d/norm A'<CR>:%s/''//g<CR>gg:g/^/m0<CR>有关V如何压缩正则表达式的更多信息,请参见此处
DJMcMayhem

@DJMcMayhem不像您喜欢的功能那样隐式结尾吗?在线尝试!
nmjcman101

3
我知道这已经很晚了,但这对我不起作用。它将R2变成2R,这是无效的
Jamie Sanborn

7

视网膜0.8.227 26个字节

\w
$&'
''

'2'
2
O$^`.'?2?

在线尝试!链接包括测试用例。说明:第一阶段在每个字母数字后添加撇号。这导致需要删除双撇号(带有或不包括两个)。最后阶段逆转了动作。


是否可以通过Retina 1.0发行版来改善?
MD XF

@MDXF看来,O$^事实上,这仍然是反转比赛清单的最佳方法,因此在Retina 1中字节数实际上没有变化。–
Neil

5

JavaScript(ES6),45个字节

s=>s.map(([a,b])=>b?+b?a+b:a:a+"'").reverse()

最短的解决方案是采用阵列IO。简单而适当地使用参数销毁。

字符串输出为+8个字节 .join` `

字符串输入,数组输出:69个字节

(s,k=[])=>s.replace(/\S\S?/g,([a,b])=>k.unshift(b?+b?a+b:a:a+"'"))&&k

f=

(s,k=[])=>s.replace(/\S\S?/g,([a,b])=>k.unshift(b?+b?a+b:a:a+"'"))&&k

;

console.log(["R", "D U'", "S T A C K", "A2 B2"].map(e => `${e} => ${f(e)}`));
<textarea oninput="out.value=(f(this.value)||[]).join` `" placeholder="input here"></textarea>
<textarea id="out" readonly></textarea>


好一个。为什么我从不认为要分解功能参数?:(
毛茸茸的

您应该可以节省1个字节来代替.reverse()::reverse但可以制作ES7
Downgoat

@Downgoat我可以在哪里测试ES7?
科纳·奥布莱恩

@ ConorO'Brien,您可以使用babel在线REPL(勾选执行和所有功能的所有预设框):babeljs.io/repl
Downgoat

4

果冻,11 字节

ḟ;ċ?”'ḣ2µ€Ṛ

单子链接,返回一个字符列表(“字符串”的“数组”)列表。

在线尝试!(页脚避免粉碎输出,显示用空格分隔的列表。)

怎么样?

ḟ;ċ?”'ḣ2µ€Ṛ - Link: list of lists of characters             e.g. ["F'", "D2" , "R"]
        µ€  - perform the chain to the left for €ach turn instruction:
    ”'      -   literal "'" character
   ?        -   if:
  ċ         -     count (number of "'" in the instruction) i.e.:  1   , 0    , 0
ḟ           -   then: filter out                                  "F"
 ;          -   else: concatenate                                       "D2'", "R'"
      ḣ2    -   head to index 2                                   "F" , "D2" , "R'"
          Ṛ - reverse                                            ["R'", "D2" , "F"]

10字节,带有新果冻。
user202729

4

JavaScript(ES6),46个字节

将输入作为移动数组。

a=>a.map(m=>m[1]?+m[1]?m:m[0]:m+"'").reverse()

测试一下

输入以逗号分隔的动作列表。

o.innerText=(f=
a=>a.map(m=>m[1]?+m[1]?m:m[0]:m+"'").reverse()
)((i.value="S,T,A,C,K").split`,`);oninput=_=>o.innerText=f(i.value.split`,`)
<input id=i><pre id=o>


说明

a=>

匿名函数,将移动数组作为参数通过parameter传递a

a.map(m=>                       )

映射数组,将每个字符串传递给一个函数,其中m当前字符串为。

 m[1]?

检查字符串是否包含第二个第二个字符("'""2")。

+m[1]?

如果确实存在,请尝试将该字符串转换为整数。如果字符串为"2",则变为2,这是正确的。如果字符串是"'",则变为NaN,这是错误的。

m

如果先前的测试是正确的,只需返回m

:m[0]

否则,返回的第一个字符m

:m+"'"

如果字符串不包含第二个字符,则返回并m附加一个'

.reverse()

反转修改后的数组。


抱歉,我刚刚看到了这个。我自己的答案类似于您的答案:P
Conor O'Brien

2

Python 51  48字节

lambda a:[(v+"'")[:2-("'"in v)]for v in a[::-1]]

一个未命名的函数,用于接收和返回字符串列表。

在线尝试!

a[::-1]; 反转输入列表;'每个条目后面加上一个v+"'"; 根据原稿的'in或不带的标题分别以1或2个字符开头[:2-("'"in v)]


2

Python 3中91个 89 72 70 69 65字节

lambda s:[i[0]+(len(i)-2and"'"or"2"*("2"==i[1]))for i in s[::-1]]

在线尝试!(带有测试用例)

显然,您不需要将输入和输出作为字符串,因此可以使用69字节的解决方案


AFAIK,您可以在len(i)==1
Stephen

@StepHen Huh,不知道这是允许的(知道有些解释器允许它,只是不知道在codegolf中是允许的)
sagiksp

2
语言是在这里由其解释器定义的,因此,如果在任何一种解释器中都有效,则该语言有效。
毛茸茸的

如果翻译允许,则可以执行此操作。这就是所有代码高尔夫球关心的问题;)
Stephen

len(i)-2短于len(i)==1(记住0为假)
Stephen



1

05AB1E,13个字节

RεÐ1èQ''si«ëK

在线尝试!

说明

RεÐ1èQ''si«ëK
R             # Reverse input array
 ε            # Map over each element...
  Ð1èQ         # Is the second char in the element the first one? (Uses the fact that in python indexing loops)
      ''       # Push '
        s      # Swap top items of stack
         i     # If the question above is true...
          «     # Concatenate
           ë   # Else
            K   # Push element without '  

1

J,25个字节

J很好地处理了这一点,但不幸的是,转义序列代表了一个单引号:

|.,&''''`}:@.(''''={:)&.>

我们需要使用装箱的数据来表示列表,因为它是一个字符项和两个字符项的混合,因此:

  • &.> -“取消装箱”,表示取消对每个元素的装箱,执行随后的操作(即以下说明的符号),然后在完成后重新装箱
  • (''''={:) “如果第二个字符是单引号”。
  • @. (J的议程动词,一种广义的三元陈述或个案陈述)“然后执行议程列表中的第二项,否则执行第一项”
  • }: (议程列表中的第二项),“删除最后一个字符”,即单引号
  • `(J的领带动词)您可以将其视为议程项目分隔符
  • ,&'''' (议程列表上的第一个项目)“末尾加一个引号”
  • |. “相反”

在线尝试!




0

爪哇8,141个 128 126字节

a->new StringBuffer(a.replaceAll("(.)","$1'").replace("'''","").replaceAll("(.)'","'$1").replaceAll("'(.)'2","2$1")).reverse()

将输入作为单个String无空格(即RUR'URU2R'U)输入。

说明:

在线尝试。

a->new StringBuffer(           // Method with String parameter and StringBuffer return-type
  a.replaceAll("(.)","$1'")    //1  Add an apostrophe after every character
   .replace("'''","")          //2  Remove all occurrences of three adjacent apostrophes
   .replaceAll("(.)'","'$1")   //3  Reverse letter+apostrophe to apostrophe+letter
   .replaceAll("'(.)'2","2$1") //4  Reverse letter+2 to 2+letter and remove aphostrophes
  ).reverse()                  //5 Reverse everything

在给定输入的情况下,上述步骤的示例: RUR'URU2R'U

  1. RUR'URU2R'UR'U'R'''U'R'U'2'R'''U'
  2. R'U'R'''U'R'U'2'R'''U'R'U'RU'R'U'2'RU'
  3. R'U'RU'R'U'2'RU''R'UR'U'R'U'2R'U
  4. 'R'UR'U'R'U'2R'U'R'UR'U'R2UR'U
  5. 'R'UR'U'R2UR'UU'RU2R'U'RU'R'
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.