Dans le langage de programmation ésotérique Curly, les programmes sont composés uniquement d'accolades {}
et de points-virgules ;
. En dépit de cet outil modeste, Curly a des littéraux qui peuvent représenter n’importe quel entier non négatif. Le format est un peu difficile à lire pour les non-initiés, cependant, écrivons un peu de code pour effectuer la conversion pour nous.
Format des nombres
Les nombres bouclés sont structurés selon les règles suivantes:
- L'ajout d'un point-virgule en ajoute un au nombre.
- Un nombre entre accolades est multiplié par quatre.
- Les groupes d'accolades peuvent être imbriqués mais non concaténés. Les accolades doivent correspondre correctement.
- Les points-virgules en dehors d'un ensemble d'accolades doivent venir après, pas avant.
- Pour éviter toute ambiguïté dans l'analyse, un nombre doit toujours commencer par une accolade.
Quelques exemples:
{;;} 2*4 = 8
{{;};}; (1*4+1)*4+1 = 21
{};;; 0*4+3 = 3
(Notez que la règle 5 signifie que les chiffres 0 à 3 doivent commencer par une paire d'accolades vides.)
Et quelques exemples non valides:
{{;}{;;}} Curly brace groups side-by-side, not nested
{;}} Unmatched brace
{;{;}} Semicolon before curly-brace group
;;; Number does not start with curly brace
Voici une grammaire BNF pour les nombres Curly:
<number> ::= "{" <inner> "}" <semis>
<inner> ::= <semis>
| <number>
<semis> ::= ";" <semis>
| ""
Des nombres tels que {;;;;}
(plus de 3 points-virgules à la suite) ou {{};}
(groupes d'accolades vides inutiles) sont appelés des nombres de Curly inappropriés . Ils obéissent à la grammaire ci-dessus et peuvent être évalués de la manière habituelle, mais ils sont également capables de représentations plus courtes (pour les exemples ci-dessus {{;}}
et {;}
respectivement).
Le défi
Écrivez un programme ou une fonction qui entre / reçoit une chaîne. Si la chaîne est un entier décimal non négatif, sortie / retourne la représentation Curly correcte (c'est-à-dire la plus courte possible) pour cet entier. Si la chaîne est un nombre Curly, affiche / retourne sa représentation décimale.
L'entrée peut être reçue via STDIN, un argument de ligne de commande ou un paramètre de fonction. Ce doit être une ficelle; Autrement dit, vous ne pouvez pas écrire une fonction qui accepte les chaînes pour les nombres Curly, mais les entiers pour les nombres décimaux.
La sortie peut être imprimée sur STDOUT ou renvoyée par la fonction. Une fonction peut renvoyer un entier, le cas échéant, ou des chaînes dans toutes les situations.
Votre programme ne doit pas nécessairement traiter des entrées incorrectes (nombres Curly qui enfreignent les règles de formatage, nombres à virgule flottante, nombres entiers négatifs, texte aléatoire), et il n'est pas nécessaire de gérer des nombres Curly incorrects (voir ci-dessous). La saisie consistera uniquement en caractères ASCII imprimables.
Notation
Le code le plus court en octets gagne. Si votre programme peut effectuer les deux opérations suivantes:
- gérer correctement les numéros Curly inappropriés, et
- quand on leur donne un numéro Curly, ignore tous les caractères supplémentaires qui ne sont pas
{};
puis soustrayez 10% de votre score. (L'entrée entière n'aura jamais de caractères superflus, même pour le bonus.)
Cas de test
Input Output
{;;} 8
{{;};}; 21
{};;; 3
{{{{;}}};} 260
{} 0
4 {;}
17 {{;}};
1 {};
0 {}
96 {{{;};;}}
Pour le bonus:
{};;;;; 5
{{;;;;};;} 72
c{u;r;l}y;! 9
42{;} ;;;; 8
Remarque: Curly n'est pas encore implémenté. Mais si cette question se pose bien, je pourrai la développer davantage.
Réponses:
Pyth,
3532 octets - 10% = 28,8Essayez-le en ligne: démonstration ou suite de tests
edit: Il s’est avéré que j’ai aussi accidentellement pu gérer des numéros Curly inappropriés. Ce n'était pas prévu du tout. ;-)
Explication:
Il y a deux expressions dans le code. Le premier convertit un nombre en un nombre bouclé, et le second convertit un nombre bouclé en un nombre régulier.
.x
poignées, quelle expression est imprimée. Il essaiera d’imprimer la première expression. S'il n'y a pas de chiffres dans l'entrée, la première expression échoue (via Exception)..x
attrape l'exception et imprime la seconde.la source
.[Z2
c'était nécessaire.CJam,
51474441 octetsEssayez-le en ligne: exemple de parcours | suite de tests
Comment ça marche
la source
Python 2, 167 octets - 10% = 150.3
Dans cette implémentation,
c
est la fonction qui répond aux exigences. Il retourne une chaîne si un entier non négatif est donné en entrée ou un entier si un nombre bouclé est donné en entrée.la source
Python 266 octets - 10% =
1268.1326.7 239.4octetsBoy je ne suis pas un golfeur de code encore = /, mais que 10% aidé m'a un beaucoup quand mon score était encore de plus de 1000!
J'ai une version entièrement développée (et verbeuse) de ce code ici. Il reconnaîtra la validité des nombres bouclés et fournira une interface en boucle pour saisir les nombres à tester.
(Commentaires juste pour clarification)
Voir ce code en action
Merci à Erik Konstantopoulos pour une réduction importante des octets! Vous pourriez dire… il a vraiment pris un… octet… de mon code… * self five *
la source
print
instructions non requises et un commentaire, vos noms de variables sont trop longs et certains espaces peuvent être éliminés. Je recommande également de lire des astuces pour jouer au golf à Pyrhon .value
env
etc), 3) faire des choses de golf intelligentes : c’est le point où vous devez regarder le lien de Dennis. Je suis curieux de voir à quel point vous pouvez réduire cela!CJam,
87 octets80.1 score (89 octets - 10% de bonus)Mettez à jour la version qui qualifie pour le bonus en augmentant de 2 octets:
Essayez-le en ligne
La première fois que j'ai utilisé la récursivité dans CJam! Le tout peut sembler long, mais les deux conversions complètement distinctes s’additionnent.
J'ai utilisé un cas complètement séparé pour convertir des nombres inférieurs à 4 en Curly. Il est probablement possible d'éviter cela, mais incorporer la gestion des cas spéciaux à la fonction récursive ne serait pas tout à fait trivial. Et ajouter l’extra
{}
comme étape de post-traitement n’était pas vraiment plus intéressant, même si je devrais réessayer si elle était légèrement plus courte.la source
C #, 173 - 10% = 155,7
171,0, 177,3Cela ne fait pas de validation et seulement pour les regards
;
et les}
personnages. Cela suppose que tous les{
caractères viennent avant tous les;
personnages. La chose la plus difficile que j'ai trouvée a été de ne pas insérer un nombre{}
au milieu d'un nombre Curly.Les sauts de ligne et les retraits pour plus de clarté:
la source
Java 326 octets - 10% = 294 octets
C'est un programme complet écrit en java,
Je suis sûr que cela peut être beaucoup plus court mais je ne peux pas avoir beaucoup de temps maintenant pour l'optimiser
la source
public
classe d'avantpublic static void main(String[]c){
avecstatic{
GNU sed,
330326 - 10% = 293,4(J'ai ajouté un pour l'utilisation de
-r
avant de réclamer le bonus de 10%; j'espère que c'est correct)La version complète montre que la plupart de ce qui précède est une conversion entre décimal et unaire:
la source
Perl,
183177Ce n'est peut-être pas la réponse Perl la plus courte, mais je pense qu'il est assez intéressant de poster (entrée
$_
, sortie comme valeur de retour):sub f{if(/}/){s/[{}]/00/g;oct'0b'.s/00(;+)/sprintf'%02b',length$1/ger}else{$_=sprintf'%064b',$_;s/../oct"0b$&"/ge;s/^0+(?!$)//;$_='{'x length.$_;s/\d/'}'.';'x$&/ge;s/\Q{{}/{/r}}
Nous observons que Curly est simplement une notation quaternaire (base 4). Nous sommes un peu gênés par le manque de support natif de Perl pour le quaternaire, mais heureusement, chaque quaternit a deux bits en binaire, et nous pouvons lire et écrire en binaire. Nous avons donc les éléments suivants:
Version élargie
la source
JavaScript (ES6), 95 (105-10%)
Testez l'exécution de l'extrait ci-dessous
la source
Ruby,
126,9129,6 (144 - 10%)Utilise la récursion pour convertir le nombre décimal en forme bouclée. Supprimer le test pour ignorer les caractères en dehors de
/[;{}]/
augmente le score de0.4
pour le moment.la source
Perl 5, 154 (
185170 octets - 10% + 1 pénalité)Regex & eval résolvent les curlies.
La génération des curlies se fait différemment.
Tester
Le fichier de test contient également les bonus cas
la source
Retina ,
6964 octetsEssayez la suite de tests
Explication
Décomposer les accolades les plus internes à juste
;
s. Boucle jusqu'à ce qu'il n'y ait plus d'attelles.Convertir entre décimal et unaire
;
Trouvez le plus long cycle
;
qui soit multiple de 4 et emboîtez-vous dans des accolades, en boucle, jusqu'à ce qu'il n'y ait plus de cycle de 4+.Si le nombre bouclé résultant commence par
;
ou est une chaîne vide, ajoutez-le{}
devant.la source
Python 2 , 157 octets -10% = 141,3
Essayez-le en ligne!
Une réponse Python 2 plus golfée qui gère les cas bonus. Je ne voulais pas necro dead posts avec ceci comme commentaire, alors le voici.
Cela fonctionne de l'intérieur sur les nombres bouclés, en ajoutant 4 ^ (le nombre d'accolades finales laissées dans la chaîne) à la somme de chaque point-virgule trouvé. Si la chaîne est un nombre, il crée alors le nombre bouclé de manière récursive de la même manière que la grammaire fournie.
la source