CJam, 23 16 Bytes
Es gibt wahrscheinlich eine elegante mathematische Lösung für dieses Problem. Aber ich habe keine Ahnung, wie ich eine finden soll, also ist es eine super komprimierte Hardcodierung!
Ich habe einen gefunden! Nun, es ist keine klassisch elegante mathematische Lösung, da sie bitweise Operationen verwendet, aber sie ist vollständig formelhaft.
li_o1^_p_6|o3+6%
Probieren Sie es online aus.
Cube-Layout
4-----7 4-----7 3-----2
/| /| / 0 /| / 3 /|
1-----0 | 1-----0 | 6-----5 |
| | | | | |2| | |4|
| 5---|-2 | 1 | 2 | 5 | 7
|/ |/ | |/ | |/
6-----3 6-----3 1-----4
Erläuterung
Meine alte Antwort hat den Würfel bereits so angelegt, dass jedes Gesicht mit seiner ersten Scheitelpunktnummer (oben links) beschrieben werden kann, die der Gesichtsnummer entspricht. Aber ich wollte in der Lage sein, mehr Scheitelpunktzahlen unter Verwendung der Gesichtsnummer zu berechnen. Irgendwann kam mir die Idee, dass ich mit dem Fuß in die Tür gekommen bin, um die zweite Scheitelpunktnummer (oben links) als die Gesichtsnummer XOR 1 zu berechnen Mit dem oben gezeigten Layout und den folgenden Formeln kann ich jede Scheitelpunktnummer für ein Gesicht n
ganz genau berechnen :
- Oben links:
n
- Oben rechts:
n^1
- Unten links:
(n^1)|6
- Unten rechts:
((n^1)+3)%6
Als Referenz reproduziere ich hier die Ausgabe für jedes Gesicht im gewünschten Layout:
Face: 0 1 2 3 4 5
Vertices: 01 10 23 32 45 54
74 63 70 65 72 61
Das ganze Programm läuft also darauf hinaus, die Eingabeflächen-Nummer zu lesen und diese Werte der Reihe nach zu erzeugen, allerdings mit leicht unterschiedlicher Drucklogik für verschiedene Scheitelpunkte. Beachten Sie, dass, da jeder Scheitelpunkt nach dem ersten mit einer Basis von beginnt n^1
, ich diesen nur einmal berechnen muss, wodurch die Logik noch weiter komprimiert wird.
Der Nachwelt zuliebe und weil ich es immer noch für einen ziemlich guten Ansatz halte, hier meine alte Antwort.
CJam, 23 Bytes
Es gibt wahrscheinlich eine elegante mathematische Lösung für dieses Problem. Aber ich habe keine Ahnung, wie ich eine finden soll.
"pÜ×ñè¨"487b8b3/ri_o=~p
Probieren Sie es online aus.
Cube-Layout
0-----7 0-----7 3-----6
/| /| / 0 /| / 3 /|
1-----2 | 1-----2 | 4-----5 |
| | | | | |2| | |5|
| 5---|-6 | 1 | 6 | 4 | 7
|/ |/ | |/ | |/
4-----3 4-----3 1-----0
Erläuterung
Der grundlegende Ansatz besteht darin, die Scheitelpunkte für jede Fläche auf engstem Raum fest zu codieren. Ähnlich wie bei der Basisumwandlungslösung von Optimizer wird die Scheitelpunktliste als Oktalzahl behandelt, die als ASCII-Zeichendaten gepackt ist. Aber hier enden die Gemeinsamkeiten, um weiteren Optimierungen Platz zu machen!
Hier sind die drei wichtigsten Optimierungen, die ich an der "naiven" Lösung vorgenommen habe:
- Legen Sie den Würfel so aus, dass jede Fläche mit ihrer Flächennummer als erste Scheitelpunktnummer beschrieben werden kann. Betrachtet man mein Würfel-Layout wie oben dargestellt, so sieht man, dass die Scheitelpunktnummer oben links für jede Fläche gleich der Flächennummer ist. Auf diese Weise kann ich sechs Scheitelpunkte weniger codieren, wenn ich die Eingabe zurückdrucken muss, wodurch ein Byte gespart wird.
- Packen Sie die Vertex-Daten in eine Zeichenfolge, für die jedes "Zeichen" ein Maximum größer als 256 hat. Wenn dieses Maximum über 256 hinaus ansteigt, nimmt die Länge der Zeichenfolge langsam ab, es wird jedoch immer wahrscheinlicher, dass eines der "Zeichen" 256 überschreitet und dies auch ist daher nicht mehr Bestandteil des 1-Byte-ASCII-Zeichensatzes. Also habe ich ein Programm geschrieben, das versucht, die Vertex-Daten in jeder Basis von 256 bis 1000 zu codieren. Dabei habe ich ungefähr 10 Basen gefunden, die ein Byte Zeichendaten im Vergleich zur Basis 256 speichern. Ich habe 487 gewählt, da dies auch die nette Eigenschaft hat, dass Die resultierende Zeichenfolge besteht vollständig aus druckbarem ASCII.
- Vermischt mit der ersten Optimierung wird die Ausgabe asymetrisch erzeugt. Der übliche Ansatz in CJam besteht darin, die Scheitelpunktdaten als Liste mit 2 Elementen aus Listen mit 2 Elementen zu formatieren, eine neue Zeile in die Mitte einzufügen und die Ausgabe implizit drucken zu lassen. Aber ich drucke stattdessen den ersten Scheitelpunkt (gleich der Eingabeflächen-Nummer) mit einem Operator, der keine neue Zeile hinzufügt, rufe die 3-Element-Liste der anderen Scheitelpunkte ab, nehme den nächsten Scheitelpunkt und drucke ihn mit einem Operator, der eine neue Zeile hinzufügt eine neue Zeile, und lassen Sie die anderen beiden Eckpunkte implizit gedruckt werden. Das spart ein Byte.
6+n%2 --> 6|n
(das habe ich bereits in meine Ruby-Antwort aufgenommen.) Beachten Sie, dass Sie durch Ausführen der Transformationn --> n^1
für die Gesichter Ihre Formeln vereinfachen könnten, obwohl ich davon ausgehe, dass Sie sie gewinnen , wenn Sie sie verwerfenn
und weitermachenn^1
nicht helfen, Ihre Gäste.n
undn^1
Paare um den Würfel es mir ermöglichen würde, einen anderen Scheitelpunkt mit just zu berechnen|6
. Und ich habe diesen --> n^1
Transformation nicht gesehen , was definitiv Sinn macht. Aber Sie haben zu Recht vermutet, dass sich dies nicht auf meine Punktzahl auswirkt, und ich werde es wahrscheinlich so lassen, wie es ist.6+n%2 --> 6|n
) Ich hoffe, es macht Ihnen nichts aus. Ich habe dien --> n^1
Transformation für die Gesichter verwendet, sodass meine letzte Revision dieselben Ausgaben wie Ihre liefert, jedoch mit unterschiedlichen Eingaben. Übrigens, ich denke nicht, dass Bit-Operationen unelegant sind, es hängt alles davon ab, wie Sie sie verwenden!~.1^..n@6|@3+6%
C 69
Ungolfed im Testprogramm
Erläuterung
Meine Würfelnummerierung sieht im aufgeklappten Zustand folgendermaßen aus:
Die linke obere Ecke hat die gleiche Nummer wie das Gesicht.
Die untere rechte Ecke hat eine Nummer
(n+2)%6
Bei ungeraden ist
n
die rechte obere Ecke(n+1)%6
und die linke untere Ecke6
Denn auch
n
die obere rechte Ecke ist7
und die untere linke ist(n+1)%6
Das Programm zeigt die ungeraden Zahlen wie gezeigt und die geraden Zahlen um 180 Grad gedreht an. Dies bedeutet, dass die obere rechte Ecke immer
(n+1)%6
und die untere linke immer ist(n+1)%2+6
. Invertierenn
undn+2
ist einfacher (dies geschieht durch Setzenc=n+1
und Verwendend
zum Addieren oder Subtrahieren1
oder-1
nach Bedarf).Ausgabe
quelle
c%6
anc%=6
und Drehen des Gesichts , so dass es zuerst kommt, soll es möglich sein , einige Modul Berechnungen zu eliminieren.) Eine andere Sache mit heißt zu experimentieren Verschiebt man die Gesichtsbezeichnung um eine Stelle, so bekomme ichn-1,n,n+1
stattn,n+1,n+2
.n
global, also könntest du ein paar Bytes sparen, indem du es höher deklarierst, ändere die Signatur auff()
? Oder betrachten wir hier nur dief
Funktion?"You may write a function instead of a program"
also zähle ich nur die Funktion. Auf jeden Fall war dies nur ein Proof of Concept in der Sprache, die ich am besten kenne. Ich bin mehr daran interessiert, meine Ruby-Antwort zu verkürzen, die von Anfang an viel kürzer war als diese.Element, 18
Im Gegensatz zu vielen fortgeschritteneren Golfsprachen verfügt Element nicht über einen Komprimierungsoperator, sodass die Kürze der Lösung eng mit dem genauen verwendeten Nummerierungsschema verknüpft ist. Nach einigen Experimenten habe ich ein neues Nummerierungsschema erstellt, mit dem die Eckpunkte nur mit einfachen Rechenoperationen berechnet werden können.
Die obere linke Ecke ist 6 wenn gerade und 7 wenn ungerade. Die obere rechte Ecke ist die Gesichtsnummer. Unten links ist die Gesichtsnummer plus 2, Mod 6. Unten rechts ist 5 minus die Gesichtsnummer.
Hier ist eine Erklärung des Codes.
Hier sind die Ausgaben für jedes der Gesichter:
quelle
Oktave,
1081006850 BytesNatürlich gibt es eine Methode, die eleganter ist als meine vorherigen Ansätze, einfache Hardcodierung. Ich bin erstaunt, wie gut Octave für Codegolf geeignet ist als Matlab =)
Layout:
(Entschuldigung, ich habe vergessen, dies hinzuzufügen.)
Cube-Layout
Alte Versionen:
Noch ältere Versionen:
Dies wird wirklich ein 2x2x2-Array erzeugen und dann ein 'Slice' auswählen. Wir führen eine 3D-Matrix-Permutation durch und wählen jedes Mal die obere oder untere Schicht aus. (Diese Methode funktioniert nicht in Matlab, da ein Ausdruck anstelle einer Matrix indiziert wird.) Ich bin sicher, dass es direktere Methoden gibt, die kürzer wären.
quelle
CJam,
3128 (oder 26) BytesDas kann auch komprimiert werden, indem die Basis in eine 26-Byte-Version konvertiert wird .
Nimmt an, dass der Würfel wie folgt aussieht:
mit Gesichtern wie
Probieren Sie es hier online aus
quelle
CJam (25 Bytes)
Dieser enthält ein nicht druckbares Zeichen und einen Tabulator (der von der StackExchange-Software entstellt wird), also im xxd-Format:
Online-Demo
Würfel:
Dies ist reine Hardcodierung, wobei die Würfelscheitelpunkte ausgewählt werden, um die Basiskomprimierbarkeit zu maximieren. Ich decodiere zu 2-stelligen Zahlen, so dass keine mit 0 beginnen kann. Ich möchte auch nicht, dass jede mit 7 beginnt, da dies die zweite Basis zu hoch drückt. Daher müssen 0 und 7 eine lange Diagonale haben. Ich möchte, dass zuerst eine 10-Kante gesetzt wird, um den Wert zu verringern, den ich codiere. Davon abgesehen gibt es ein gutes Maß an Flexibilität, ohne die Byteanzahl zu ändern.
Ich bin ein wenig enttäuscht, dass es nach dem Entfernen des ersten Zeichens aus der magischen Zeichenfolge erforderlich ist, es in ein int umzuwandeln, bevor es als Basis für die Basiskonvertierung verwendet wird. Hoffentlich werden zukünftige Versionen von CJam dieses Byte speichern, obwohl es zu spät sein wird, dies hier auszunutzen.
quelle
JavaScript (ES6), 53
62Bearbeiten Speichere 8 Bytes mit Hilfe von Template-Strings, danke @NinjaBearMonkey. Beachten Sie, dass die Zeilenumbrüche in Anführungszeichen von Bedeutung sind und nicht reduziert werden können.
Kann in Javascript nicht klug sein, es ist zu wortreich.
Ausgabe
for(i=0;i<6;i++)console.log(f(i),i)
Schauen Sie sich das Snippet an, um die Nummernzuordnungen zu überprüfen ( das hat Spaß gemacht)
Code-Snippet anzeigen
quelle
\n
, wodurch 8 Byte eingespart werden sollten.Ruby Rev 1,
4036->(c){print(c^1,c,"\n",6|c,(c+3)%6)}
Vielen Dank an @rcrmn für den Vorschlag, ein Lambda zu verwenden, um 4 Bytes zu sparen. Ich war mir nicht sicher, ob ich es anonym lassen sollte, aber es scheint hier auf Meta diskutiert worden zu sein und entschied, dass dies in Ordnung war.
Hier ist es als 40-Byte-Funktion, zum Vergleich mit meiner Rev 0 Ruby-Antwort, auch unten (Original C-Antwort ist in einem separaten Beitrag.)
Weitere Inspiration von Runer112: Dies beruht auf einer Änderung des Nummerierungsschemas, das in seiner letzten (16 Byte!) Antwort verwendet wurde. Ein direkter Port von PhiNotPis Schema würde die gleiche Punktzahl ergeben.
Wenn Sie die Nummerierung von Rev 0 um einen Schritt verschieben und alles XOR 1 nehmen, erhalten Sie den folgenden Würfel:
Ausgabe
Ruby Rev 0,
56 5250Gespeicherte 4 Bytes von unnötigem Entfernen
()%6
vonc-d
und weiteren 2 (inspiriert von runer112) durch6+c%2 --> 6|c
.Punktzahl ist für die Funktion, die nur die erste Zeile ist. Ich bin neu in Ruby und ich bin überrascht, dass ich keinen kürzeren Weg als 12 Zeichen (11 plus Zeilenvorschub) finde, um eine Benutzereingabenummer in n zu bekommen. Wenn Sie also eine Funktion anstelle eines Programms ausführen, wird 1 Byte gespart.
Dies ist ein Port meiner C-Antwort. In C gibt der
%
Operator einen negativen Wert mit einer negativen Zahl zurück. In Ruby wird immer ein positiver Wert zurückgegeben, sodass keine 1 hinzugefügt werden mussc
. Infolgedessen ist es vorteilhaft, die Nummerierung der Flächen wie folgt um 1 zu verschieben:Mit der neuen Gesichtsnummerierung druckt das Programm die Abschlüsse wie oben gezeigt und die Gewinnchancen werden um 180 Grad gedreht:
quelle
->(x){...code...}
bleibt Ihre Funktionsdefinition 4 Zeichen kürzer. Sie müssen es dann einer Variablen zuweisen, um es zu verwenden, und es mit #callf=->(c){print(c^1,c,"\n",6|c,(c+3)%6)}
läuft und ist 2 Zeichen kürzer (4 Zeichen kürzer, wenn ich das weglassef=
). Ich bin mir nicht sicher, ob es fair ist, darauf zu verzichten,f=
aber die Frage besagt nicht, dass die Funktion nicht anonym sein kann. Was ich merkwürdig finde, ist, dass diese Syntax völlig anders ist als die für Anfänger gezeigte Syntax, bei der der übergebene Parameter in geschweiften Klammern steht:f=lambda{|c|print(c^1,c,"\n",6|c,(c+3)%6)}
Pyth, 30
Danke @Jakube für 2 Bytes.
Probieren Sie es hier aus.
Golftipps von Pyth-Experten werden gerne entgegengenommen. Insbesondere denke ich, dass der Ausgabebereich einige Verbesserungen haben könnte.
Port des folgenden Pythons: ...
Python, 109
... das ist ein Hafen von
Pure Bash, 130
Zum Zwecke der Erklärung:
Die Würfelscheitelpunkte sind folgendermaßen nummeriert:
Und die Gesichter sind folgendermaßen nummeriert:
Das
Swap
Spalte gibt an, in welcher Reihenfolge die Eckpunkte in der Ausgabe umgeschaltet werden sollen.Der Algorithmus beginnt mit allen Eckpunkten {0..7}. Scheitelpunkte werden gemäß den in den Scheitelpunktnummern festgelegten Bits entfernt:
Die "beibehaltenen" Eckpunkte werden an eine Zeichenfolge angehängt. Die Zeichenfolge wird je nachdem, ob das Swap-Flag (Face-Nummer Mod 2) gesetzt ist, als Zeichen 0, 1, 2, 3 oder umgekehrt ausgegeben.
quelle
J - 26 Bytes
Funktion, die die Gesichtsnummer als Argument nimmt und das Ziffernraster zurückgibt.
Wir verwenden den folgenden Würfel:
Beispiel (versuchen Sie es selbst bei tryj.tk ):
Das Brot und die Butter ist
0&(|:|.)
. Dies ist ein Verb, das den Würfel so umkehrt und dreht, dass bei iterativer Anwendung jedes Gesicht aufgerufen wird. Dies geschieht mit dem Eingabeargument. Die Scheitelpunkte des Würfels werden von generierti.3#2
, daher verwenden wir diesen als Ausgangspunkt und nehmen die Vorderseite,0...{
wenn wir fertig sind.Das Drucken der Ziffern als Zeichenfolge kostet 8 Zeichen:
{.@":"0@
Wenn wir einfach ein Array zurückgeben könnten, wären dies 8 ganze Zeichen. [Fängt an, mit der Faust zu zittern und nicht wahrzunehmen]quelle
> <> (Fisch) , 38 Bytes
Jede Ausgabe wird in zwei zweistelligen Zeilen gespeichert. Die Zeilen werden als Zeichencodes in der Zeichenfolge gespeichert
'/ =/2= 28"H'
(mit Ausnahme der Zeile,10
die nach der Zeichenfolge als angehängt wirda
). Das erste Zeichen (/ = 47
) wird verwendet, um den Programmfluss bei der zweiten Interaktion umzuleiten.Die Spitze
2*(53-n)
Elemente werden verworfen (wobei n der Zeichencode der eingegebenen Nummer ist) und die nächsten beiden Codes werden mit einem Zeilenumbruch zwischen gedruckt.Layout:
quelle