Membalik Algoritma Kubus Rubik

19

Setiap kali Anda bergerak di Rubik's Cube, ada gerakan mundur yang membatalkan langkah pertama. Karena itu, setiap algoritma (serangkaian gerakan) memiliki algoritma terbalik yang membatalkan algoritma pertama.

Tujuan dari tantangan ini adalah untuk menemukan kebalikan dari algoritma yang diberikan.

Spesifikasi:

Input terdiri dari berbagai gerakan individu. Setiap gerakan adalah string dengan panjang 1 atau 2. Tentu saja, Anda dapat menggunakan format input apa pun yang paling masuk akal dalam bahasa Anda. Setiap gerakan terdiri dari struktur Xatau X'atau X2, di mana Xhuruf besar atau kecil.

Untuk membalikkan X, cukup ganti dengan X'. Demikian juga, X'menjadi X. X2di sisi lain tidak berubah.

Untuk membuat output, membalikkan setiap gerakan, lalu membalikkan array.

Contoh (string dipisahkan oleh spasi):

R => R'

D U' => U D'

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

A2 B2 => B2 A2

Mencetak:

Ini adalah kode-golf, sehingga jumlah byte terkecil yang menang. Tidak ada celah standar.

Julian Lachniet
sumber
Apakah R2-> R2'atau B-> B3diizinkan?
CalculatorFeline
2
Harus menangani X3atau X1akan menjadi tambahan yang bagus untuk tantangan.
Shaggy
1
"Karena ini, setiap algoritma (serangkaian gerakan) memiliki algoritma terbalik yang membatalkan algoritma pertama" apakah ini benar untuk setiap algoritma? Karena saya pikir algoritma hashing adalah satu cara. Berarti tidak memiliki algoritma terbalik, kan? tolong beri tahu saya
Avishek Saha
4
@AvishekSaha: Untuk masalah Rubik's Cube, "algoritma" terbatas pada arti "urutan gerakan yang dapat Anda lakukan pada Cube". Dalam pengertian ini, tidak ada yang namanya algoritma hashing satu arah pada Cube.
Ross Presser
5
Seharusnya D2R2sebagai kasus uji ...
Neil

Jawaban:

7

Python 2 , 71 57 54 53 byte

-15 bytes terima kasih untuk ovs! -3 byte terima kasih kepada Rod.

lambda l:[i.strip("'")+" '"[len(i):]for i in l[::-1]]

Cobalah online!

String I / O, 70 byte

lambda s:' '.join(i.strip("'")+"'"*(len(i)<2)for i in s.split()[::-1])

Cobalah online!

benar-benar manusiawi
sumber
1
53 byte
ovs
7

V , 13 10 byte

æGÇä/á'Ó''

Cobalah online!

3 byte disimpan berkat @nmjmcman menunjukkan fitur favorit saya. Penjelasan:

æ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
DJMcMayhem
sumber
Apakah äsuka mewakili regex saat dikompilasi ke vim?
Downgoat
@Downgoat Ya! Itu benar. Diterjemahkan ke dalam vim, solusi ini adalah :g!/\d/norm A'<CR>:%s/''//g<CR>gg:g/^/m0<CR>Informasi lebih lanjut tentang bagaimana V memampatkan ekspresi reguler dapat ditemukan di sini
DJMcMayhem
@DJMcMayhem Bukankah akhiran implisit seperti fitur favorit Anda? Cobalah online!
nmjcman101
3
Saya tahu ini agak terlambat, tetapi ini tidak berhasil untuk saya. Ini mengubah R2 menjadi 2R, yang tidak valid
Jamie Sanborn
7

Retina 0.8.2 , 27 26 byte

\w
$&'
''

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan: Tahap pertama menambahkan tanda kutip setelah setiap alfanumerik. Ini menghasilkan apostrof ganda (dengan atau tanpa 2 inklusif) yang perlu dihapus. Tahap akhir membalikkan gerakan.

Neil
sumber
Bisakah ini diperbaiki dengan rilis Retina 1.0 ?
MD XF
@MDXF Tampaknya itu O$^sebenarnya masih cara terbaik untuk membalik daftar pertandingan, sehingga jumlah byte sebenarnya tidak berubah di Retina 1.
Neil
5

JavaScript (ES6), 45 byte

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

Solusi terpendek adalah dengan mengambil Array IO. Penggunaan penghancuran argumen yang sederhana dan tepat.

Output string adalah +8 byte untuk .join` `.

Input string, Keluaran array: 69 byte

(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>

Conor O'Brien
sumber
Bagus Mengapa saya tidak pernah berpikir untuk merusak parameter fungsi ?! :(
Shaggy
Anda harus bisa mengganti .reverse()dengan ::reversemenghemat 1 byte tetapi membuat ES7
Downgoat
@Downgoat Ada tempat di mana saya bisa menguji ES7?
Conor O'Brien
@ ConorO'Brien Anda dapat menggunakan REPL babel online (centang eksekusi dan semua kotak preset untuk semua fitur): babeljs.io/repl
Downgoat
4

Jeli , 11 byte

ḟ;ċ?”'ḣ2µ€Ṛ

Tautan monadik yang mengambil kembali daftar daftar karakter ("array" dari "string").

Cobalah online! (Footer menghindari menghancurkan output, menampilkan daftar split dengan spasi.)

Bagaimana?

ḟ;ċ?”'ḣ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"]
Jonathan Allan
sumber
10 byte dengan Jelly baru.
user202729
4

JavaScript (ES6), 46 byte

Mengambil input sebagai array gerakan.

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

Menguji

Masukkan daftar gerakan yang dipisahkan koma.

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>


Penjelasan

a=>

Fungsi anonim mengambil array gerakan sebagai argumen melalui parameter a.

a.map(m=>                       )

Peta di atas array, melewati setiap string melalui fungsi, di mana mstring saat ini.

 m[1]?

Periksa apakah string berisi karakter kedua ( "'"atau "2") kedua.

+m[1]?

Jika itu mencoba untuk melemparkan string karakter itu ke integer. Jika string itu"2" , itu menjadi 2, yang benar. Jika string itu "'", itu menjadi NaN, yang merupakan falsey.

m

Jika tes sebelumnya benar, cukup kembali m.

:m[0]

Jika tidak, kembalikan karakter pertama m.

:m+"'"

Jika string tidak mengandung karakter kedua, maka kembalilah m ditambahkan dengan a '.

.reverse()

Membalikkan array yang dimodifikasi.

Shaggy
sumber
Maaf, saya baru melihat ini. Jawaban saya sendiri mirip dengan jawaban Anda: P
Conor O'Brien
2

Python ,  51  48 byte

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

Fungsi tanpa nama mengambil dan mengembalikan daftar string.

Cobalah online!

Membalik daftar input dengan a[::-1]; menambahkan a 'ke setiap entri dengan v+"'"; mengepalai masing-masing karakter 1 atau 2 tergantung pada apakah aslinya memiliki 'atau tidak dengan [:2-("'"in v)].

Jonathan Allan
sumber
2

Python 3 , 91 89 72 70 69 65 byte

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

Cobalah online! (Dengan testcases)

Tampaknya Anda tidak perlu mengambil input dan output sebagai string, sehingga solusi 69 byte dimungkinkan

sagiksp
sumber
AFAIK Anda dapat menghapus spasi setelahlen(i)==1
Stephen
@StepHen Huh, tidak tahu itu diizinkan (Tahu bahwa beberapa penerjemah mengizinkannya, hanya tidak tahu itu diizinkan dalam codegolf)
sagiksp
2
Bahasa didefinisikan oleh penerjemah mereka di sini jadi, jika itu berfungsi dalam salah satu penerjemah, itu valid.
Shaggy
Jika penerjemah memungkinkan, Anda dapat melakukannya. Itu semua peduli kode-golf;)
Stephen
len(i)-2lebih pendek dari len(i)==1(ingat 0 adalah falsey)
Stephen
1

Haskell , 43 byte

map f.reverse
f[x]=x:"'"
f[x,c]=x:[c|c>'1']

Cobalah online! Menyatakan fungsi anonim map f.reverse. Ikat gdan gunakan sebagai g["S","T","A","C","K"].

Laikoni
sumber
1

PHP , 81 byte

<?foreach(array_reverse($_GET)as$v)$r[]=$v[1]?$v[1]<2?$v[0]:$v:"$v'";print_r($r);

Cobalah online!

Jörg Hülsermann
sumber
1

05AB1E , 13 byte

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

Cobalah online!

Penjelasan

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 '  
Datboi
sumber
1

J, 25 byte

J menangani yang satu ini dengan baik, selain dari urutan pelarian yang disayangkan yang diperlukan untuk mewakili satu kutipan:

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

Kita perlu mewakili daftar menggunakan data kotak, karena merupakan campuran dari satu dan dua item karakter, karenanya:

  • &.> - "under unbox", yang berarti unbox setiap elemen, melakukan operasi yang mengikuti (yaitu, simbol yang dijelaskan di bawah) dan kemudian rebox ketika selesai
  • (''''={:) "Jika karakter ke-2 adalah kutipan tunggal" ....
  • @. (Kata kerja agenda J, semacam pernyataan terner general, atau pernyataan kasus) "lalu lakukan item kedua pada daftar agenda, jika tidak lakukan yang pertama"
  • }: (item ke-2 dalam daftar agenda), "hapus karakter terakhir", yaitu, kutipan tunggal
  • `(J's tie verb) Anda dapat menganggap ini sebagai pemisah item agenda
  • ,&'''' (item pertama pada daftar agenda) "tambahkan satu kutipan ke akhir"
  • |. "membalikkan"

Cobalah online!

Jonah
sumber
0

Ruby , 44 byte

->a{a.reverse.map{|i|i[1]?i.tr(?',''):i+?'}}

Cobalah online!

Asone Tuhid
sumber
0

Java 8, 141 128 126 byte

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

Mengambil input sebagai tunggal Stringtanpa spasi (yaitu RUR'URU2R'U).

Penjelasan:

Cobalah online.

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

Contoh langkah-langkah di atas, dengan masukan yang diberikan: 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'
Kevin Cruijssen
sumber