Implementieren Sie den Cubically Cube


10

Kubisch ist eine ziemlich neue esoterische Sprache, die in der Lage ist, kurze, golfähnliche Antworten auf eine ganz bestimmte Untergruppe von Problemen zu erstellen. Es ist insofern einzigartig, als es Speicher in Form eines 3x3-Zauberwürfels speichert, wodurch Berechnungen weitaus weniger trivial sind als in den meisten Sprachen. In Cubically muss der Programmierer den internen Cube drehen, um die auf den Flächen gespeicherten Werte zu bearbeiten, und diese Werte dann für seine Berechnungen verwenden. Berechnungen werden mit einer einzelnen 32-Bit-Ganzzahl durchgeführt, die auf einer imaginären Fläche gespeichert ist, die als "Notizblock" bekannt ist. Darüber hinaus kann Cubically Benutzereingaben anfordern und in einem Eingabepuffer speichern, der nur aus einem einzigen ganzzahligen Wert besteht.

Der Würfel

Die Flächen des Würfels sind U p, D own, L eft, R ight, F ront und B ack:

   UUU
   UUU
   UUU
LLLFFFRRRBBB
LLLFFFRRRBBB
LLLFFFRRRBBB
   DDD
   DDD
   DDD

Wenn das Programm gestartet wird, wird der Würfel so initialisiert, dass jedes Quadrat auf dieser Fläche dem 0-basierten Index dieser Fläche entspricht:

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

Wenn ein Gesicht gedreht wird, wird es immer im Uhrzeigersinn gedreht:

Cubically> F1

   000
   000
   111
115222033444
115222033444
115222033444
   333
   555
   555

Der Wert eines Gesichts ist definiert als die Summe aller Quadrate auf diesem Gesicht. Im obigen Würfel beträgt der Wert der Fläche 0beispielsweise 3.

Syntax

Befehle werden ausgeführt, indem zuerst ein Befehl in den Speicher geladen und dann Argumente übergeben werden, um den Befehl auszuführen. Beispielsweise F1lädt der Befehl den Befehl Fin den Speicher und ruft ihn dann mit dem Argument auf 1. Lädt F13den Befehl außerdem Fin den Speicher, ruft ihn dann mit dem Argument auf 1und ruft ihn dann mit dem Argument auf 3. Jedes nichtstellige Zeichen wird als Befehl behandelt, und jede Ziffer wird als Argument behandelt.

Deine Aufgabe

Ihre Aufgabe ist es, den internen Speicherwürfel von Cubically in einer Sprache Ihrer Wahl zu implementieren. Ihr Code sollte in der Lage sein, eine sehr kleine Teilmenge der Sprache auszuführen.

Befehle

  • R - Drehen Sie die rechte Seite des Würfels so oft im Uhrzeigersinn.
  • L - Drehen Sie die linke Seite des Würfels so oft im Uhrzeigersinn.
  • U - Drehen Sie die Oberseite des Würfels so oft im Uhrzeigersinn.
  • D - Drehen Sie die Unterseite des Würfels so oft im Uhrzeigersinn.
  • F - Drehen Sie die Vorderseite des Würfels so oft im Uhrzeigersinn.
  • B - Drehen Sie die Rückseite des Würfels so oft im Uhrzeigersinn.
  • %- Gibt den Wert auf der angegebenen Fläche aus. Der Wert eines Gesichts ist definiert als die Summe aller Quadrate auf diesem Gesicht.

Regeln

  • Sie können jede Sprache verwenden, die vor oder nach dem Datum der Veröffentlichung dieser Herausforderung erstellt wurde, um ein Programm oder eine Funktion zu schreiben, mit der diese Herausforderung gelöst werden kann.
  • Die Eingabe wird entweder über STDIN, als Zeichenfolge oder als Zeichenarray übergeben (Sie wählen, bitte angeben).
  • Die Ausgabe muss entweder an STDOUT oder als Ausgabe der Funktion übergeben werden. Sie muss entweder eine Ganzzahl, eine Zeichenfolge, die nur Ziffern enthält, oder ein Array von Ziffern sein. Wenn Ihre Sprache die Ausgabe eines nachgestellten Zeilenumbruchs erfordert, können Sie dies tun.
  • Die Eingabe hat immer das folgende Format : ([UDLRFB]\d*)*%[0-5]. Die Eingabe enthält keine Leerzeichen.
  • Die Eingabe für verwendet %immer einen 0-basierten Index.

Dies ist , also gewinnt die kürzeste Antwort in Bytes.

Testfälle

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

Weitere Testfälle finden Sie im TIO-Interpreter . Wenn TIO nicht funktioniert, können Sie stattdessen den Lua-Interpreter verwenden.


3
Ist diese Frage ein Duplikat davon ?
TehPers


@TehPers Ich denke, es ist sehr ähnlich. Für zukünftige Herausforderungen empfehle ich, sie mindestens 24 Stunden im Sandkasten zu lassen, länger, wenn Sie noch Fragen dazu haben. (Ich musste das auf die harte Tour lernen. Meine ersten Herausforderungen wurden überhaupt nicht gut angenommen. Dies ist noch nicht abgeschlossen oder abgelehnt, daher ist es nicht schlecht , aber wenn es länger in der Sandbox belassen worden wäre, hätten es andere Benutzer möglicherweise getan bemerkte Fehler, die ich nicht tat.)
MD XF

@MDXF Das werde ich mir beim nächsten Mal merken. Vielen Dank!
TehPers

Haben Sie ein Vielfaches 4zwischen Rund Dim Beispiel verpasst RD3F2%5 -> 30?
Jonathan Allan

Antworten:


8

Python 2 , 476 Bytes

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])])

Probieren Sie es online aus!

Ein Port aus meiner Simulate A Rubik's Cube-Antwort . Der erneute Besuch veranlasste mich, das um 47 Bytes zu spielen.


0

Kubisch 1 Byte

Nicht konkurrierend, weil es lahm ist. Akzeptiere das nicht.

¶  Read a line from stdin and evaluate

Ich habe heute Nachmittag hinzugefügt: P.


2
Ich denke, Sie haben den kürzesten Code.
TehPers

2
@TehPers mache ich, aber wie gesagt, es ist lahm. Kubisch kann man mit diesem eingebauten Rubiks-Cube andere Herausforderungen gewinnen, es muss nicht gewonnen werden.
MD XF
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.