Cubically est trop fastidieux pour écrire manuellement un code. Votre défi est de traduire le texte ASCII en code source Cubically.
Cubiquement
Ce n'est qu'un rapide aperçu de Cubically; le référentiel a un guide et des détails plus complets.
Cubically est un esolang que j'ai écrit il y a quelque temps, conçu pour être pénible à utiliser. Il contient deux morceaux de mémoire, un Rubik's Cube 3x3x3 et un registre appelé "bloc-notes".
Mémoire
Le Rubik's Cube interne est initialisé comme ceci:
000
000 top face
000
111222333444 left, front, right, and back faces, respectively
111222333444
111222333444
555
555 down face
555
Après avoir effectué un virage à 90 ° dans le sens horaire sur la face droite, le cube mémoire ressemblerait à ceci:
002
002
002
111225333044
111225333044
111225333044
554
554
554
Commandes
Un caractère non entier définit la commande par défaut. Pour chaque entier avant que la commande par défaut ne soit à nouveau définie, la commande est exécutée avec cet entier. Par exemple, x524y312
exécuter la commande x
avec 5, puis avec 2, puis avec 4, puis exécuter la commande y
avec 3, puis avec 1, puis avec 2.
Les entiers utilisés par les commandes représentent des index de faces. Il en x0
serait de même x
pour la face UP (indexée 0). x1
se produirait x
sur la face GAUCHE (indexée à 1), et ainsi de suite.
L'exécution d'une commande avec 6
exécutera cette commande sur la valeur du bloc-notes. L'exécution d'une commande avec un entier supérieur à 6 entraînera une erreur.
Voici quelques exemples de commandes:
R1
- tournez la face DROITE dans le sens des aiguilles d'une montre de 90 ° pour que le cube interne ressemble au deuxième exemple ci-dessusR11
- tourner deux fois la face DROITE dans le sens des aiguilles d'une montre de 90 °, identique àR2
+0
- ajouter toutes les valeurs de la face UP au bloc-notes+000
- ajouter trois fois toutes les valeurs de la face UP au bloc-notes@6
- imprimer la face inexistante indexée en 6e (mémoire) en tant que caractère%4
- imprimer la somme de toutes les valeurs sur la face arrière sous forme d'entier
Une liste complète des commandes et de la syntaxe est disponible dans le référentiel .
Défi
Vous prendrez du texte ASCII en entrée et imprimerez un programme cubique en sortie.
Exemples (volés d' ici et ici ):
Input -> Output
Hello, World! -> +53@6+1F2L2+0@6L2F2U3R3F1L1+2@66L3F3R1U1B3+0@6:4U1R1+00@6-000@6*0-4+000@6-00@6+2-000000@6-5+4000@6-00@6/0+00@6:0+0/0+00@6
1$2$3$4$5$6$7$8$9$10$ -> B1+2/2%6@4+00/0%6@4+00/1%6@4+21/1%6@4+30/0%6@4+22/1%6@4+22/1%6@4+40/1%6@4+52/1%6@4+42/1%6@4
Règles
- Votre programme peut ne pas contenir de dictionnaire contenant les traductions des 100 tests.
- Votre programme doit se terminer en moins de 180 secondes (aucun programme de force brute qui prend des semaines).
- Votre programme doit générer un code cubique valide qui se termine en moins de 180 secondes.
- Votre programme prendra la saisie via la saisie standard, sauf si vous voulez jouer avec le pilote de test.
- Votre programme doit produire du code cubique qui ne produit rien d'autre que l'entrée de votre programme lors de son exécution. ಠ_ಠ
Notation
Vous testerez votre programme avec 100 chaînes pseudo-aléatoires de longueur pseudo-aléatoire. (Un script bash est fourni qui fera cela pour vous.) Voici comment vous allez marquer:
- Soit la longueur du programme de sortie égale à o .
- Soit la longueur de la chaîne d'entrée l .
- Soit une variable r le résultat de o / l .
- Trouvez la moyenne de tous les r : (r 1 + r 2 + r ... + r 100 ) / 100 .
Testez avec ce script. Vous devrez le modifier comme indiqué. Notez que le programme ne vérifie pas si la sortie est un code cubique valide. Si vous ne pouvez pas faire fonctionner le script, je peux vous aider. Ping moi dans la salle de chat Cubically .
la source
@6
- imprimer la somme de la face inexistante indexée 6 (bloc-notes) en tant que caractère" serait plus précis? Est-ce%4
aussi une somme? Les+
commandes font-elles face à la somme puis ajoutent cela à toutes les valeurs ou ...?@6
/%6
imprime directement la valeur du bloc-notes sous forme de caractère / entier.@x
/%x
(où x est une face existante) ajoute toutes les valeurs sur lax
face -indexée et imprime la somme sous forme de caractère / entier.+
ajoute toutes les valeurs de la face spécifiée au registre.Réponses:
C ++ 11, score : 6,37
Essayez-le en ligne! (générer du code Cubically à partir de l'ASCII) et (exécuter du code Cubically)
Explication:
{0,9,18,27,36,45}
à{6, 15, 27, 26, 19, 42}
. Ce qui rend cet ensemble de somme de faces utile, c'est que le pgcd est 1, donc par l'identité de Bézout, il existe un moyen de construire n'importe quel nombre àd
partir d'une somme (ou différence) de ces nombres.ch
et que la valeur actuelle du bloc-notes estn
, alors laissezd = ch - n
, nous pouvons exécuter des commandes cubiquement sous la forme+{digits from 0 to 5}-{digits from 0 to 5}
telle que la valeur du bloc-notes deviennech
. Ensuite, exécutez simplement%6
pour imprimer la valeur du bloc-notes.d
sous forme de somme / différence de nombres dans l'ensemble de somme de faces, j'utilise l'algorithme Knapsack pour tous les nombres de 0 à 128. Par exemple, pourd=1
, le programme obtient27 - 26 = 1
, donc il s'imprime+2-3
, ce qui est27 - 26 = 1
. Qui peut être vu lors de l'exécution du programme avec entréeabc
, la sortie du programmela source
@
implicitement -@6
peut être raccourci@
dans tous les cas.Lua, Score :
85,9113,5013,2012,709,419,329,839,669,129,068,03 (moyenne)Essayez-le en ligne!
D'accord, je ne pense plus pouvoir optimiser cela.
Cette version parcourt chaque caractère, en ajoutant c% 9 (où c est la valeur décimale du caractère) en faisant
:5+2/1
, puis ajoute les parties divisibles par 9 en ajoutant la valeur faciale. Par exemple::2/1+551@
pour imprimer "e", où:2/1
ajoute 2,+551
ajoute 99 (9 * (5 + 5 + 1) ou 9 * 11) et@
imprime la sortie. L'entrée est lue avecio.read()
.Les optimisations incluent l'ajout / la soustraction directe après l'impression si la différence entre les caractères est un multiple de 9, la division de la valeur actuelle si possible plutôt que la définition de c% 9 à partir de zéro, et la répétition des caractères en imprimant à nouveau la valeur actuelle plutôt que de la recalculer. De plus, j'ai implémenté la méthode de Kamil pour imprimer instantanément n'importe quel visage qui contient déjà la valeur cible, et la suggestion de MD XF de ne pas utiliser
:
au début, mais plutôt de commencer par un+
.la source
local inp = io.read()
pourlocal inp = io.read("*all")
. Cela résout le problème.:5+124
, vous pouvez simplement écrire+5124
, ce qui réduira probablement un peu le score si vous le modifiez correctement.Cubiquement , Score : 86,98
Essayez-le en ligne!
Il s'avère que vous n'avez besoin que de boucles conditionnelles, d'une face égale à 1 et d'un comportement de fin d'entrée cohérent.
L'ajout / la soustraction de la face GAUCHE consiste à mettre fin à la boucle lorsque EOF est lu.
la source
@
implicitement -@6
peut être raccourci@
dans tous les cas.C # (.NET Core) , score:
129,9811,7310,829,6210,3310,3210,20-1,2 point de la suggestion de MD XF d'utiliser
@6666...
au lieu de@6@6@6@6...
pour répéter le caractère et séquence d'initialisation supérieureEssayez-le en ligne!
Ma dernière version fait en fait une certaine manipulation du cube! Yay!
Ce premier
Console.Write
point, il y a une manipulation fixe MD XF qui a créé ce cube:La signification de ce cube est que l'un de ses côtés a une somme de 1, permettant des manipulations du bloc-notes à une échelle plus petite que des multiples de neuf, et en particulier il simplifie le mouvement relatif plutôt que d'avoir à partir de zéro pour chaque caractère; dans cet algorithme, l'addition et la soustraction sont utilisées pour emprunter le chemin le plus court entre les caractères.
La version de l'initialisation de MD XF fait que le côté 2 a une somme de 14, ce qui économise de nombreux octets de sortie pour des distances ASCII entre 14 et 20.
Peut désormais gérer les entrées avec des sauts de ligne internes, Console.Read () obtient des caractères individuels jusqu'à la fin du fichier; voir le lien TIO qui devrait avoir l'entrée
Rasé quelques fractions de point en sortant immédiatement un caractère si sa valeur ASCII se trouve déjà exister d'un côté.
Script de test gracieuseté de MDXF
Soumission précédente ici et explication:
C'est un peu ennuyeux, mais pour autant que je sache, cela fonctionne. Certes, j'ai seulement essayé,
Hello, World!
mais j'ai exécuté la sortie dans l'interpréteur TIO Cubically et il a sorti "Hello, World!" alors j'ai supposé que ça marche.Plutôt que de manipuler réellement le cube, le bloc-notes est simplement incrémenté par la somme de la 1 face (9) à plusieurs reprises jusqu'à ce qu'il ait la bonne valeur pour chaque caractère, puis l'imprime.
la source