Rubik Küp Algoritmasını Tersine Çevirme


19

Bir Rubik Küpü üzerinde bir hamle yaptığınızda, ilk hamleyi geri alan bir ters hamle olur. Bu nedenle, her algoritmanın (hamle kümesi) ilk algoritmayı geri alan bir ters algoritması vardır.

Bu zorluğun amacı belirli bir algoritmanın tersini bulmaktır.

Şartname:

Giriş, ayrı ayrı hareketlerden oluşur. Her hareket 1 veya 2 uzunluğunda bir dizedir. Tabii ki, dilinizde en mantıklı olan giriş biçimini kullanabilirsiniz. Her hareket yapısı oluşur Xya da X'ya da X2, Xbir büyük veya küçük harf.

Tersine çevirmek Xiçin ile değiştirin X'. Aynı şekilde X'olur X. X2diğer yandan değişmez.

Çıktı oluşturmak için, her hareketi tersine çevirin ve ardından diziyi ters çevirin.

Örnekler (boşluklarla ayrılmış dizeler):

R => R'

D U' => U D'

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

A2 B2 => B2 A2

puanlama:

Bu kod golf, bu yüzden en az bayt miktarı kazanır. Standart boşluklara izin verilmez.


Is R2> - R2'ya B-> B3izin?
CalculatorFeline

2
Ele almak zorunda X3ya X1da meydan okuma için güzel bir ek olurdu.
Shaggy

1
"Bu nedenle, her algoritma (hamle kümesi) ilk algoritmayı geri alır ters bir algoritma vardır" her algoritma için bu doğru mu ?? Çünkü karma algoritmaların bir yolu olduğunu düşünüyorum. Ters algoritması olmadığı anlamına gelir, değil mi? lütfen bana bildirin
Avishek Saha

4
@AvishekSaha: Rubik Küp problemleri için "algoritma", "Küp üzerinde yapabileceğiniz bir dizi hamle" anlamına gelir. Bu anlamda, Küp üzerinde tek yönlü karma algoritması diye bir şey yoktur.
Ross Presser

5
D2R2Bir test vakası olarak olmalıydı ...
Neil

Yanıtlar:



7

V , 13 10 bayt

æGÇä/á'Ó''

Çevrimiçi deneyin!

@Nmjmcman benim favori özelliği işaret sayesinde 3 bayt kaydedildi. Açıklama:

æ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'e derlendiğinde beğeniler normal ifadeyi temsil ediyor mu ?
Downgoat

@Downgoat Evet! Öyle. :g!/\d/norm A'<CR>:%s/''//g<CR>gg:g/^/m0<CR>
Vim'e çevrilen

@DJMcMayhem En sevdiğiniz özellik gibi örtülü sonlar değil mi? Çevrimiçi deneyin!
nmjcman101

3
Bunun çok geç olduğunu biliyorum, ama bu benim için işe yaramıyor. Bir R2'yi 2R'ye dönüştürüyor, bu geçerli değil
Jamie Sanborn

7

Retina 0.8.2 , 27 26 bayt

\w
$&'
''

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

Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. Açıklama: İlk aşama her alfasayısaldan sonra kesme işareti ekler. Bu, çıkarılması gereken çift kesme işaretiyle (kapsayıcı 2 ile veya kapsayıcı 2 olmadan) sonuçlanır. Son aşama hamleleri tersine çevirir.


Retina 1.0'ın piyasaya sürülmesiyle bu iyileştirilebilir mi?
MD XF

@MDXF Görünüşe göre O$^hala bir eşleşme listesini tersine çevirmenin en iyi yolu, bu nedenle bayt sayısı aslında Retina 1'de değişmedi
Neil

5

JavaScript (ES6), 45 bayt

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

En kısa çözüm Array IO'yu kullanmaktır. Argüman imhasının basit ve uygun kullanımı.

Dize çıktısı için +8 bayt .join` `.

Dize girişi, Dizi çıkışı: 69 bayt

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


Güzel. Neden asla fonksiyon parametrelerini yok etmeyi düşünmüyorum ?! :(
Shaggy

Sen yerine gerekir .reverse()ile ::reverseES7 1 byte tasarrufu ancak yapım
Downgoat

@Downgoat ES7'yi test edebileceğim bir yer var mı?
Conor O'Brien

@ ConorO'Brien babel online REPL'i kullanabilirsiniz (tüm özellikler için kene yürütme ve tüm önceden ayarlanmış kutuları): babeljs.io/repl
Downgoat

4

Jöle , 11 bayt

ḟ;ċ?”'ḣ2µ€Ṛ

Karakter listelerinin ("dizelerin" bir "dizisi") listesini döndüren monadik bir bağlantı.

Çevrimiçi deneyin! (Altbilgi, çıktıyı parçalamaktan, listeyi boşluklarla ayrılmış olarak görüntülemekten kaçınır.)

Nasıl?

ḟ;ċ?”'ḣ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"]

Yeni Jelly ile 10 bayt.
user202729

4

JavaScript (ES6), 46 bayt

Girdiyi bir dizi hamle olarak alır.

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

Dene

Virgülle ayrılmış bir hamle listesi girin.

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çıklama

a=>

Hamle dizisini parametre ile argüman olarak alan anonim fonksiyon a.

a.map(m=>                       )

Her dizeyi mgeçerli dizenin olduğu bir işlevden geçirerek dizi üzerinden eşleyin.

 m[1]?

Dizenin ikinci bir ikinci karakter ( "'"veya "2") içerip içermediğini kontrol edin .

+m[1]?

Eğer bu karakter dizesini bir tamsayıya çevirmeye çalışırsa. Dize ise "2", olur 2, ki bu doğrudur. Dize ise "'", olur NaN, ki bu falseydir.

m

Önceki test doğruysa, geri dönün m.

:m[0]

Aksi takdirde, karakterinin ilk karakterini döndürün m.

:m+"'"

Dize ikinci bir karakter içermiyorsa m, a '.

.reverse()

Değiştirilmiş diziyi ters çevirin.


Üzgünüm, sadece gördüm. Kendi cevabım sizinkine benzer: P
Conor O'Brien

2

Python ,  51  48 bayt

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

Dizelerin listesini alan ve döndüren isimsiz bir işlev.

Çevrimiçi deneyin!

Giriş listesini a[::-1]; 'ile her girişe a ekler v+"'"; kafaları 1 veya 2 karakter her biri özgün bir olup olmadığı ile ilgili olarak 'ya da değil ile [:2-("'"in v)].


2

Python 3 , 91 89 72 70 69 65 bayt

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

Çevrimiçi deneyin! (Testcases ile)

Görünüşe göre giriş ve çıkışı dize olarak almanıza gerek yok, bu nedenle 69 baytlık bir çözüm mümkün


AFAIK, sonraki alanı silebilirsinizlen(i)==1
Stephen

@StepHen Huh, izin verildiğini bilmiyordu (Bazı tercümanların izin verdiğini biliyordum, sadece codegolf'ta izin verildiğini bilmiyordum)
sagiksp

2
Diller burada tercümanları tarafından tanımlanır, bu yüzden herhangi bir tercümanda çalışıyorsa geçerlidir.
Shaggy

Yorumlayıcı izin veriyorsa, bunu yapabilirsiniz. Tüm kod-golf umurunda;)
Stephen

len(i)-2daha kısadır len(i)==1(0'ın falsey olduğunu unutmayın)
Stephen



1

05AB1E , 13 bayt

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

Çevrimiçi deneyin!

açıklama

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 bayt

J, tek bir alıntıyı temsil etmek için gereken talihsiz kaçış dizisi dışında bunu iyi işler:

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

Listeyi kutulu veriler kullanarak temsil etmemiz gerekir, çünkü bu bir ve iki karakter öğesinin bir karışımıdır, bu nedenle:

  • &.> - "kutunun altında", yani her bir öğenin kutusunun açılması, aşağıdaki işlemi (yani aşağıda açıklanan simgeler) gerçekleştirin ve sonra bittiğinde yeniden kutucuğa geçin
  • (''''={:) "2. karakter tek tırnak ise" ....
  • @. (J'nin gündem fiili, bir tür genelleştirilmiş üçlü beyan veya bir vaka beyanı) "sonra gündem listesindeki 2. maddeyi, aksi takdirde ilkini gerçekleştirin"
  • }: (gündem listesindeki 2. madde), "son karakteri kaldır", yani tek tırnak
  • `` J 'kravat fiili) Bunu gündem maddesi ayırıcı olarak düşünebilirsiniz
  • ,&'''' (gündem listesindeki ilk öğe) "sonuna tek bir teklif ekle"
  • |. "ters"

Çevrimiçi deneyin!




0

Java 8, 141 128 126 bayt

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

StringBoşluksuz girişi tek başına alır (yani RUR'URU2R'U).

Açıklama:

Çevrimiçi deneyin.

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

Yukarıdaki adımlara örnek olarak verilen giriş: 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'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.