Cubically Cubeを実装する


10

Cubicallyは、問題の非常に特定のサブセットに対してゴルフのような短い答えを作成できる、かなり新しい難解な言語です。3x3ルービックキューブの形でメモリを格納するという点で独特であり、計算はほとんどの言語よりもはるかに簡単です。Cubicallyでは、プログラマーは面に格納された値を操作するために内部の立方体を回転させ、それらの値を計算に使用する必要があります。計算は、「ノートパッド」と呼ばれる架空の面に保存されている単一の32ビット整数で実行されます。さらに、Cubicallyはユーザー入力を要求し、それを単一の整数値のみで構成される入力バッファーに格納できます。

キューブ

立方体の面は、U p、D own、L eft、R ight、F ront、およびB ackです。

   UUU
   UUU
   UUU
LLLFFFRRRBBB
LLLFFFRRRBBB
LLLFFFRRRBBB
   DDD
   DDD
   DDD

プログラムが開始すると、その面の各正方形がその面の0ベースのインデックスと等しくなるようにキューブが初期化されます。

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

面が回転するときは常に、常に時計回りに回転します。

Cubically> F1

   000
   000
   111
115222033444
115222033444
115222033444
   333
   555
   555

面の値は、その面のすべての正方形の合計として定義されます。たとえば、上のキューブでは、faceの値0は3です。

構文

コマンドを実行するには、まずコマンドをメモリにロードし、次に引数をコマンドに渡してコマンドを実行します。たとえば、コマンドF1はコマンドFをメモリにロードし、引数を指定して呼び出します1。さらに、F13コマンドFをメモリにロード1してから、引数を指定して呼び出し、次に引数を指定して呼び出します3。数字以外の文字はコマンドとして扱われ、数字は引数として扱われます。

あなたのタスク

あなたの仕事は、選択した言語でCubicallyの内部メモリキューブを実装することです。コードは、言語の非常に小さなサブセットを実行できる必要があります。

コマンド

  • R -立方体の右側面を指定された回数時計回りに回転させます。
  • L -立方体の左面を指定された回数時計回りに回転させます。
  • U -立方体の上面を指定された回数時計回りに回転させます。
  • D -立方体の底面を指定された回数時計回りに回転させます。
  • F -立方体の前面を指定された回数時計回りに回転させます。
  • B -立方体の背面を指定された回数時計回りに回転させます。
  • %-指定された面の値を出力します。面の値は、その面のすべての正方形の合計として定義されます。

ルール

  • この課題が投稿された日付の前または後に作成された任意の言語を使用して、この課題を解決できるプログラムまたは関数を作成できます。
  • 入力は、STDINを介して、文字列として、または文字配列として渡されます(選択、指定してください)。
  • 出力はSTDOUTに渡すか、関数の出力として渡す必要があり、整数、数字のみを含む文字列、または数字の配列のいずれかでなければなりません。使用言語で末尾の改行を出力する必要がある場合は、そうすることができます。
  • 入力は常に次の形式になります([UDLRFB]\d*)*%[0-5]。入力に空白文字は含まれません。
  • の入力%は常に0ベースのインデックスを使用します。

これはなので、バイト単位の最短の回答が優先されます。

テストケース

%0 -> 0
%1 -> 9
%2 -> 18
%3 -> 27
%4 -> 36
%5 -> 45
R1%2 -> 27
RD3F2%5 -> 32
L1R23F1B5U9D2%3 -> 17

その他のテストケースについては、TIOインタープリターを確認してください。TIOが機能しない場合は、代わりにLuaインタープリターを使用できます。


3
この質問はの複製である。この
TehPers 2017


@TehPersとても似ていると思います。今後の課題については、サンドボックスに少なくとも24時間置いておくことをお勧めします。それでも質問がある場合は、さらに長くしてください。(私はこれを難しい方法で学ばなければなりませんでした。私の最初の課題は十分に受け入れられていませんでした。これはまだクローズまたは投票されていませんので、悪くはありませんが、サンドボックスに長く残されていれば、他のユーザーが私が気づいていない欠陥に気づきました。)
MD XF

@MDXF次回はそのことを覚えておきます。ありがとう!
TehPers 2017

例の4間にある間Rで倍数を見逃しましたか?DRD3F2%5 -> 30
ジョナサンアラン

回答:


8

Python 2、476バイト

import re
c=[[i]*9for i in range(6)]
r=lambda f:[f[a+b]for a in(0,1,2)for b in(6,3,0)]
U=lambda c:[r(c[0])]+[c[j+1][:3]+c[j or 4][3:]for j in(1,2,3,0)]+[c[5]]
y=lambda c:[r(c[0])]+c[2:5]+[c[1],r(r(r(c[5])))]
z=lambda c:[c[2],r(r(r(c[1]))),c[5],r(c[3]),c[0][::-1],c[4][::-1]]
s=input()
exec("c="+"(c);c=".join("".join("zzzUz U zzUzz yyyzUzzzy zUzzz yzUzzzyyy".split()[ord(t)%11%7]*sum(map(int,n))for t,n in re.findall("([BUDLFR])(\d*)",s[:-2])))+"(c)")
print sum(c[int(s[-1])])

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

Simulate A Rubik's Cubeの回答からの移植。再訪により、47バイトでゴルフをするように促されました。


0

キュービック、1バイト

競合しないので、それは不十分です。これを受け入れないでください。

¶  Read a line from stdin and evaluate

今日の午後に付け加えました:P


2
まあ、私はあなたが最短のコードを持っていると思います。
TehPers 2017

2
@TehPersやりますが、私が言ったようにそれは不自由です。このビルトインで他のルービックキューブの課題を勝ち取ることができるので、この課題に勝つ必要はありません。
MD XF 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.