CJam, 23 16 octets
Il existe probablement une élégante solution mathématique à ce problème. Mais je ne sais pas comment en trouver un, donc c'est un codage dur super compressé!
J'en ai trouvé un! Eh bien, ce n'est pas une solution mathématique classique élégante car elle utilise des opérations au niveau du bit, mais elle est entièrement formule.
li_o1^_p_6|o3+6%
Essayez-le en ligne.
Disposition du cube
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
Explication
Mon ancienne réponse disposait déjà le cube de telle sorte que chaque face peut être décrite avec son premier numéro de sommet (en haut à gauche) égal au numéro de face. Mais je voulais pouvoir calculer plus de nombres de sommets en utilisant le nombre de faces. À un moment donné, j'ai eu l'idée de mettre le pied dans la porte, de calculer le deuxième nombre de sommets (en haut à gauche) comme le numéro de face XOR 1. Et après un certain temps d'essais et d'erreurs, j'ai réussi à trouver avec la disposition ci-dessus et les formules ci-dessous qui me permettent de calculer chaque nombre de sommets pour un visage de n
manière assez succincte:
- En haut à gauche:
n
- En haut à droite:
n^1
- En bas à gauche:
(n^1)|6
- En bas à droite:
((n^1)+3)%6
Pour référence, je vais reproduire la sortie pour chaque face dans la disposition souhaitée ici:
Face: 0 1 2 3 4 5
Vertices: 01 10 23 32 45 54
74 63 70 65 72 61
Donc, tout le programme se résume à lire le numéro de face d'entrée et à produire ces valeurs dans l'ordre, bien qu'avec une logique d'impression légèrement différente pour différents sommets. Notez que, parce que chaque sommet après le premier commence par une base de n^1
, je n'ai besoin de le calculer qu'une seule fois, ce qui compacte encore plus la logique.
Pour la postérité, et parce que je pense que c'était encore une assez bonne approche, voici mon ancienne réponse.
CJam, 23 octets
Il existe probablement une élégante solution mathématique à ce problème. Mais je ne sais pas comment en trouver un, donc c'est un codage dur super compressé!
"pÜ×ñè¨"487b8b3/ri_o=~p
Essayez-le en ligne.
Disposition du cube
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
Explication
L'approche de base utilisée consiste à coder en dur les sommets de chaque face dans le moins d'espace possible. De la même manière que la solution de conversion de base d'Optimizer, celle-ci traite la liste de sommets comme un nombre octal compressé en données de caractères ASCII. Mais c'est là que s'arrêtent les similitudes pour faire place à de nouvelles optimisations!
Voici les trois principales optimisations que j'ai apportées à la solution "naïve":
- Disposez le cube de sorte que chaque face puisse être décrite avec son numéro de face comme premier numéro de sommet. En regardant ma disposition de cube comme présenté ci-dessus, on peut voir que le nombre de sommets en haut à gauche de chaque face est égal au nombre de faces. Cela me permet de coder six sommets de moins au prix d'avoir à réimprimer l'entrée, ce qui s'avère économiser un octet.
- Emballez les données de sommet dans une chaîne pour laquelle chaque "caractère" a un maximum supérieur à 256. Comme ce maximum dépasse 256, la longueur de la chaîne diminue lentement, mais il devient de plus en plus probable qu'un "caractère" dépasse 256 et soit ne fait donc plus partie du jeu de caractères ASCII à 1 octet. J'ai donc écrit un programme qui essaie d'encoder les données de sommets dans chaque base de 256 à 1000, avec lequel j'ai trouvé environ 10 bases qui économisent un octet de données de caractères par rapport à la base 256. J'ai choisi 487, car cela a aussi la belle propriété qui la chaîne résultante est entièrement composée de caractères ASCII imprimables.
- Mélangé avec la première optimisation, produisez la sortie de manière asymétrique. L'approche habituelle dans CJam serait de formater les données de sommet comme une liste à 2 éléments de listes à 2 éléments, d'insérer une nouvelle ligne au milieu et de laisser la sortie être implicitement imprimée. Mais j'imprime plutôt le premier sommet (égal au numéro de la face d'entrée) avec un opérateur qui n'ajoute pas de nouvelle ligne, récupère la liste à 3 éléments des autres sommets, saisis le sommet suivant et l'imprime avec un opérateur qui ajoute une nouvelle ligne et laissez les deux autres sommets être implicitement imprimés. Cela économise un octet.
6+n%2 --> 6|n
(j'ai déjà incorporé cela dans ma réponse Ruby.) Notez qu'en effectuant la transformationn --> n^1
sur les visages, vous pourriez simplifier vos formules, bien que je suppose que lorsque vous vous en débarrassezn
et continuez avecn^1
cela, vous avez gagné 't aider votre score.n
etn^1
autour du cube me permettrait de calculer un autre sommet avec juste|6
. Et je n'ai pas vu cetten --> n^1
transformation, ce qui a vraiment du sens. Mais vous avez correctement supposé que cela n'affecterait pas réellement mon score, alors je vais probablement le laisser tel quel.6+n%2 --> 6|n
) J'espère que cela ne vous dérange pas. J'ai utilisé lan --> n^1
transformation sur les visages, donc ma dernière révision donne les mêmes sorties que la vôtre, mais avec des entrées différentes. BTW, je ne pense pas que les opérations sur les bits soient inélégantes, tout dépend de la façon dont vous les utilisez!~.1^..n@6|@3+6%
C, 69
Non testé dans le programme de test
Explication
Ma numérotation des cubes, une fois dépliée, ressemble à ceci:
Le coin supérieur gauche a le même numéro que le visage.
Le coin inférieur droit a un numéro
(n+2)%6
Pour impair,
n
le coin supérieur droit est(n+1)%6
et le coin inférieur gauche est6
Car même
n
le coin supérieur droit est7
et le coin inférieur gauche est(n+1)%6
Le programme affiche les nombres impairs comme indiqué et les nombres pairs ont pivoté de 180 degrés. Cela signifie que le coin supérieur droit est toujours
(n+1)%6
et le coin inférieur gauche est toujours(n+1)%2+6
. Inversern
etn+2
est plus facile (cela se fait en définissantc=n+1
et en utilisantd
pour ajouter ou soustraire1
ou-1
si nécessaire.)Production
la source
c%6
àc%=6
et faire tourner le visage il vient d' abord, il devrait être possible d'éliminer certains calculs du module.) Une autre chose à expérimenter est - déplacer l'étiquetage du visage d'un endroit, donc je reçois à lan-1,n,n+1
place den,n+1,n+2
.n
global, vous pouvez donc économiser quelques octets en le déclarant plus haut, changer la signature enf()
? Ou regardons-nous seulement laf
fonction ici?"You may write a function instead of a program"
donc je ne compte que la fonction. En tout cas, ce n'était qu'une preuve de concept dans la langue que je connais le mieux. Je suis plus intéressé à raccourcir ma réponse Ruby, qui était déjà beaucoup plus courte au départ.Élément, 18
Contrairement à de nombreux langages de golf plus avancés, Element ne possède pas d'opérateur de compression, de sorte que la brièveté de la solution est liée assez étroitement au schéma de numérotation exact utilisé. Après quelques expérimentations, j'ai créé un nouveau schéma de numérotation qui permet de calculer les sommets en utilisant uniquement des opérations arithmétiques simples.
Le coin supérieur gauche est 6 s'il est pair et 7 s'il est impair. Le coin supérieur droit est le numéro de visage lui-même. Le coin inférieur gauche est le numéro du visage, plus 2, le mod 6. Le coin inférieur droit est 5 moins le numéro du visage.
Voici une explication du code.
Voici les sorties pour chacune des faces:
la source
Octave,
1081006850 octetsBien sûr, il existe un moyen de le faire beaucoup plus élégant que mes approches précédentes, le codage en dur simple. Je suis étonné de voir comment Octave est bien plus adapté au codegolf qu'à Matlab =)
Disposition:
(Désolé, j'ai oublié d'ajouter ceci.)
Disposition du cube
Anciennes versions:
Versions encore plus anciennes:
Cela va vraiment faire un tableau 2x2x2 puis choisir une «tranche». Nous effectuons une permutation matricielle 3D et choisissons à chaque fois la tranche supérieure ou inférieure. (Celui-ci ne fonctionne pas dans matlab à cause de l'indexation d'une expression plutôt que d'une matrice) Je suis sûr qu'il y aurait des façons plus directes de le faire qui seraient plus courtes.
la source
CJam,
3128 (ou 26) octetsqui peut également être compressé en utilisant la conversion de base en une version de 26 octets .
Suppose que le cube ressemble à:
avec des visages comme
Essayez-le en ligne ici
la source
CJam (25 octets)
Celui-ci contient un caractère non imprimable et un onglet (qui sera modifié par le logiciel StackExchange), donc au format xxd:
Démo en ligne
Cube:
Il s'agit d'un codage en dur pur, les sommets du cube étant sélectionnés pour maximiser la compressibilité de base. Je décode en nombres à 2 chiffres, donc aucun d'entre eux ne peut commencer par 0. Je ne veux pas non plus commencer par 7, car cela pousse la deuxième base trop haut. Par conséquent, 0 et 7 doivent être sur une longue diagonale. Je veux qu'un bord de 10 passe en premier pour réduire la valeur que j'encode. En dehors de cela, il y a une bonne quantité de flexibilité sans changer le nombre d'octets.
Je suis légèrement déçu qu'ayant sorti le premier caractère de la chaîne magique, il est nécessaire de le convertir en entier avant de l'utiliser comme base pour la conversion de base. Espérons que les futures versions de CJam enregistreront cet octet, bien qu'il soit trop tard pour l'exploiter ici.
la source
JavaScript (ES6), 53
62Modifier Enregistrer 8 octets à l'aide de chaînes de modèle, thx @NinjaBearMonkey. Attention, les sauts de ligne à l'intérieur des guillemets sont importants et ne peuvent pas être réduits.
Impossible d'être intelligent en Javascript, c'est trop verbeux.
Production
for(i=0;i<6;i++)console.log(f(i),i)
Voir l'extrait de veify les associations (nombre qui était amusant)
Afficher l'extrait de code
la source
\n
, ce qui devrait économiser 8 octets.Ruby Rév.1,
4036->(c){print(c^1,c,"\n",6|c,(c+3)%6)}
Merci à @rcrmn d'avoir suggéré d'utiliser un lambda pour économiser 4 octets. Je n'étais pas sûr de le laisser anonyme, mais il semble avoir été discuté sur meta ici et décidé que c'était OK.
Ici, il s'agit d'une fonction de 40 octets, pour comparaison avec ma réponse Rub 0 Rev, également ci-dessous (la réponse d'origine C est dans un article séparé.)
Inspiration supplémentaire de Runer112: Cela repose sur une modification du schéma de numérotation utilisé dans sa dernière réponse (16 octets!). Un port direct du schéma de PhiNotPi donnerait le même score.
En décalant la numérotation de Rev 0 d'une étape et en prenant tout XOR 1, nous obtenons le cube suivant:
Production
Ruby Rév.0,
56 5250Enregistré 4 octets en supprimant les inutiles
()%6
dec-d
et 2 autres (inspiré par runer112) par6+c%2 --> 6|c
.Le score correspond à la fonction, qui n'est que la première ligne. Je suis nouveau sur Ruby et je suis surpris de ne pas trouver un moyen plus court que 12 caractères (11 plus la nouvelle ligne) pour obtenir un numéro d'entrée utilisateur en n. Par conséquent, faire une fonction au lieu d'un programme économise 1 octet.
Ceci est un port de ma réponse C. En C, l'
%
opérateur renvoie une valeur négative avec un nombre négatif. Dans Ruby, il renvoie toujours une valeur positive, il n'est donc pas nécessaire d'ajouter 1 àc
. Par conséquent, il est avantageux de décaler la numérotation des faces de 1 comme ci-dessous:Avec la nouvelle numérotation des visages, le programme imprime les égalités comme indiqué ci-dessus et les cotes ont pivoté de 180 degrés:
la source
->(x){...code...}
ce qui laisse votre définition de fonction 4 caractères plus courte. Vous devez ensuite l'assigner à une variable pour l'utiliser, et l'appeler avec #callf=->(c){print(c^1,c,"\n",6|c,(c+3)%6)}
s'exécute et est 2 caractères plus court (4 caractères plus court si j'omets lef=
). Je ne sais pas s'il est juste d'omettref=
mais la question ne dit pas que la fonction ne peut pas être anonyme. Ce que je trouve étrange, c'est que cette syntaxe est totalement différente de la syntaxe montrée aux débutants, qui a le paramètre passé à l'intérieur des accolades:f=lambda{|c|print(c^1,c,"\n",6|c,(c+3)%6)}
Pyth, 30
Merci @Jakube pour 2 octets.
Essayez-le ici.
Les conseils de golf d'experts pyth seront gracieusement acceptés. En particulier, je pense que la section de sortie pourrait avoir quelques améliorations.
Port du python suivant: ...
Python, 109
... qui est un port de
Pure Bash, 130
Aux fins d'explication:
Les sommets du cube sont numérotés ainsi:
Et les visages sont numérotés ainsi:
La
Swap
colonne indique que l'ordre des sommets doit être commuté dans la sortie.L'algorithme commence avec tous les sommets {0..7}. Les sommets sont éliminés en fonction des bits définis dans les nombres de sommets:
Les sommets "conservés" sont ajoutés à une chaîne. La chaîne est sortie en caractères 0,1 puis 2,3 ou vice versa, selon que le drapeau de swap (numéro de visage mod 2) est défini.
la source
J - 26 octets
Fonction prenant le numéro de visage comme argument et renvoyant la grille de chiffres.
Nous utilisons le cube suivant:
Exemple (essayez vous-même sur tryj.tk ):
Le pain et le beurre sont
0&(|:|.)
. Il s'agit d'un verbe qui inverse et fait pivoter le cube de manière à visiter chaque visage lorsqu'il est appliqué de manière itérative, ce que nous faisons en utilisant l'argument d'entrée. Les sommets du cube sont générés pari.3#2
, nous utilisons donc cela comme point de départ et prenons la face avant0...{
lorsque nous avons terminé.L'impression des chiffres sous forme de chaîne coûte 8 caractères:
{.@":"0@
si nous pouvions simplement renvoyer un tableau, cela représente une économie de 8 caractères entiers. [commence à serrer le poing et à saisir de façon indiscernable]la source
> <> (Poisson) , 38 octets
Chaque sortie est stockée sur deux lignes à 2 chiffres. Les lignes sont stockées sous forme de codes de caractères dans la chaîne
'/ =/2= 28"H'
(sauf la ligne10
qui est ajoutée après la chaîne en tant quea
). Le premier caractère (/ = 47
) est utilisé pour rediriger le flux du programme lors de la deuxième interaction.Les
2*(53-n)
éléments supérieurs sont supprimés (où n est le code de caractère du numéro d'entrée) et les deux codes suivants sont imprimés avec une nouvelle ligne entre.Disposition:
la source