ルービックキューブアルゴリズムの反転


19

ルービックキューブで移動するたびに、最初の移動を取り消す逆方向の移動があります。このため、すべてのアルゴリズム(一連の移動)には、最初のアルゴリズムを元に戻す逆アルゴリズムがあります。

この課題の目標は、特定のアルゴリズムの逆を見つけることです。

仕様:

入力は、個々の動きの配列で構成されます。各移動は長さ1または2の文字列です。もちろん、言語で最も意味のある入力形式を使用できます。各移動は、構造XまたはX'またはX2で構成されXます。ここで、は大文字または小文字です。

逆にするにはX、単にに置き換えX'ます。同様に、にX'なりXます。X2一方、変更されません。

出力を作成するには、各移動を逆にしてから、配列を逆にします。

例(スペースで区切られた文字列):

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
「このため、すべてのアルゴリズム(一連の動き)には、最初のアルゴリズムを元に戻す逆アルゴリズムがあります」これはすべてのアルゴリズムに当てはまりますか?? 原因ハッシュアルゴリズムは1つの方法だと思います。リバースアルゴリズムがないことを意味しますか?教えてください
アヴィシェクサハ

4
@AvishekSaha:ルービックキューブの問題の場合、「アルゴリズム」は「キューブで実行できる一連の動き」という意味に制限されます。この意味で、キューブには一方向のハッシュアルゴリズムのようなものはありません。
ロスプレッサー

5
D2R2テストケースとして持つべき
ニール

回答:



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はい!します。VIMに翻訳、この解決策はある:g!/\d/norm A'<CR>:%s/''//g<CR>gg:g/^/m0<CR>Vは正規表現を圧縮する方法の詳細については見つけることができ、ここで
DJMcMayhem

@DJMcMayhemあなたのお気に入りの機能のような暗黙のエンディングではありませんか?オンラインでお試しください!
nmjcman101

3
私はこれがかなり遅いことを知っていますが、これは私にはうまくいきません。R2を2Rに変更しますが、これは無効です
ジェイミーサンボーン

7

網膜0.8.227の 26バイト

\w
$&'
''

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

オンラインでお試しください!リンクにはテストケースが含まれます。説明:最初の段階では、すべての英数字の後にアポストロフィが追加されます。これにより、二重アポストロフィ(2を含むまたは含まない)を削除する必要があります。最終段階では動きが逆になります。


Retina 1.0のリリースでこれを改善できますか?
MD XF

@MDXFそれはそれはそうO$^バイトカウントが網膜1に実際に変更されていないので、まだ実際には試合のリストを逆転させる最良の方法である
ニール

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 @あなたはバベルのオンライン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番目の2番目の文字("'"または"2")が含まれているかどうかを確認します。

+m[1]?

その文字列を整数にキャストしようとした場合。文字列がの場合"2"、それはになり2、これは真実です。文字列の場合"'"、それはなりNaNfalseyあります。

m

前のテストが真実である場合、単に戻りmます。

:m[0]

そうでなければ、の最初の文字を返しmます。

:m+"'"

文字列に2番目の文字が含まれていない場合はm'

.reverse()

変更した配列を逆にします。


申し訳ありませんが、私はこれを見ました。私自身の答えはあなたに似ている:P
コナー・オブライエン

2

Python 51  48バイト

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

文字列のリストを取得して返す無名の関数。

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

入力リストをa[::-1];で反転します。ですべてのエントリにa 'を追加します。は、オリジナルにが付いているかどうかに応じて、それぞれ1文字または2文字になります。v+"'"'[:2-("'"in v)]


2

Pythonの391の 89 72 70 69 65バイト

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

オンラインでお試しください!(テストケース付き)

どうやら入力と出力を文字列として受け取る必要がないので、69バイトのソリューションが可能です


知っているあなたは後にスペースを削除することができますlen(i)==1
スティーブン

@StepHen Huh、それが許可されていることを知らなかった(一部のインタープリターが許可していることを知っていたが、コードゴルフで許可されていることを知らなかった)
-sagiksp

2
ここで言語はインタープリターによって定義されているため、いずれかのインタープリターで機能する場合は有効です。
シャギー

通訳者が許可している場合、それを行うことができます。それはすべてコードゴルフが気にすることです;)
スティーブン

len(i)-2より短いlen(i)==1(0は偽であることに注意してください)
スティーブン



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は、単一引用符を表すために必要な不幸なエスケープシーケンスを除き、これをうまく処理します。

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

リストは1つと2つの文字項目が混在しているため、ボックス化されたデータを使用してリストを表す必要があります。したがって、

  • &.> -「アンボックス解除」は、各要素のボックス化を解除し、後続の操作(つまり、以下で説明する記号)を実行し、完了時に再ボックス化します
  • (''''={:) 「2番目の文字が単一引用符の場合」....
  • @. (Jのアジェンダ動詞、一種の一般化された三項ステートメント、またはcaseステートメント)「アジェンダリストの2番目の項目を実行します。
  • }: (アジェンダリストの2番目の項目)、「最後の文字を削除する」、つまり一重引用符
  • `(Jのタイ語動詞)これはアジェンダ項目セパレータと考えることができます
  • ,&'''' (アジェンダリストの最初の項目)「最後に一重引用符を追加する」
  • |. "逆"

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




0

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