Rebmu : 79 caractères OU (37 + longueur (p1) + 2 * max (longueur (p2), longueur (p3)))
Je vais d'abord donner une solution à 79 caractères qui demande quelles langues devez-vous apprendre? (entropie 4.0, 30 lettres non comprises ?
) et vous propose les suggestions de Rebol et [Rouge] :
DD 11 DD :do dd {dd {p{Which languages must you learn?}qt}} pp{{[RReebdo]l}}
Une tactique unique disponible ici, qui ne figure pas dans d'autres langues, consiste à tirer parti du fait que les accolades sont un délimiteur de chaîne asymétrique, qui peut s'emboîter légalement:
my-string: {"It's cool," said {Dr. Rebmu}, "for MANY reasons--like less escaping."}
Cela me permet de produire une solution généralisée, qui peut fonctionner sans effort sur n'importe quel programme qui n'utilise pas de séquences d'échappement. La version à 79 caractères était assez simple pour être raccourcie, mais pour contenir correctement une source de programme arbitraire pour les programmes p2 et p3, vous auriez besoin du modèle complet. Si nous avions utilisé cela, cela aurait été 87 caractères:
DD 11 DD :do dd {dd {p{Which languages must you learn?}qt}} ddoo{{pp{{[RReebdo]l}}}}
Le schéma d'utilisation de cette forme générale est que si vous avez trois textes sources de caractères séquentiels de longueurs variables (Utilisons un exemple comme AAA
, BBBBB
, CCCCCCC
) vous pouvez les coder comme quelque chose le long des lignes de:
DD 11 DD :do dd {dd {AAAqt}} ddoo{{BCBCBCBCBC C C}}
(Remarque: bien que ce modèle ne fonctionne pas sans des modifications sur les programmes qui utilisent des caractères d'échappement, ce n'est pas une faille fatale. Obtenir une accolade gauche incomparable dans une chaîne délimitée par des accolades nécessite quelque chose comme {Foo ^{ Bar}
... mais vous pouvez facilement réécrire cela en utilisant la notation de chaîne alternative "Foo { Bar"
et les cas combinés peuvent être gérés en collant un mélange de chaînes non échappées.)
Alors ... que diriez-vous d'un exemple? Une fois la forme générale disponible, ce programme de 573 caractères a été assemblé en seulement quelques minutes à partir de 3 solutions de golf de code antérieures:
DD 11 DD: dd {dd {rJN 0% rW Wa1m2j S {\ x /} D00 Hc & [u [Q [Q? Q Qs ~ rpKw [isEL00c [skQd2k] [eEV? KQ [tlQ]] pSeg - b00 [ eZ 1 5] 3] prRJ [si ~ dSPscSqFHs] eZ 1 [s + dCa + wM2cNO]]] Va | [mpAp2j] prSI ~ w { } Ls2w Wl h01tiVsb01n -1 chRVs { } hLceVn}} ddoo {d. [sn [{N sbeo [tIt0l1eV} 0e5gXN1 01L {5s0} C {1} 0 {0 Do5f0 0bMe1e0r0} 0]] tMw9C9 Numz Jl [paN + [KperlCJBn [[ba sWS {B noJn N ° {K, j} b P {. } lf EZ - - n [N m {G otothestoreandebubuysome more}]] {T akeonedownandpassitar ound} c B w P lf]]}}
Si quelqu'un veut essayer d'écrire ce programme dans la langue de son choix et pense pouvoir battre 573, faites le moi savoir. Si vous le faites, je vous récompenserai énormément - en supposant que votre langue de choix n'est pas Rebmu, car je sais que ces programmes ne sont pas minimes. :-)
Ce "gaspillage" espacement que vous obtenez à la fin est ce qui se produit lorsque p2 et p3 sont de longueurs déséquilibrées. Mais tous les 3 programmes ont des tailles différentes dans ce cas, il n’ya donc pas de bonne paire à choisir pour p2 / p3. (Je les ai choisis parce qu’il n’y avait pas de données externes en entrée, comme un labyrinthe ou autre, mais pas parce qu’elles avaient la même longueur. Bien que j’aurais pu écrire de nouveaux programmes plus optimaux, j’ai passé assez de temps et le but était: vous n'êtes pas obligé d'écrire de nouveaux programmes ...)
Comment ça marche
(Remarque: j'ai commencé avec une approche plus "créative" qui n'était pas aussi simple, mais plus intéressante. Je l'ai déplacée dans une entrée de mon blog car la description de cette approche est déjà longue.)
Une clé ici est la "ruse" du code eval en tant que chaîne "comme d’autres entrées, elle a juste la carte maîtresse du délimiteur de chaîne asymétrique. Je commencerai par expliquer le fonctionnement du cas des 80 caractères.
Voici le programme "entier", ajustant les espaces pour la lisibilité de cette affaire:
DD 11 ; assign 11 to dd (about to overwrite again)
DD :do ; make dd a synonym for DO (a.k.a. "eval")
; eval a string as source code that ends with QUIT (QT)
dd {dd {p{Which languages must you learn?}qt}}
; we'll never get here, but whatever's here must be legally parseable
pp{{[RReebdo]l}}
Nous définissons ici DD comme synonyme de DO (alias "eval"). Mais le truc, c'est que lorsque les programmes divisés par deux sont exécutés, ils finissent par exécuter du code dont le seul effet est de définir D comme littéral inoffensif 1.
Voici ce que le code de caractères impairs crée, l'espace à nouveau ajusté:
D 1 ; assign 1 to d
D d ; assign d to itself, so it's still 1
d ; evaluates to integer, no side effect
{d pWihlnugsms o er?q} ; string literal, no side effect
p {Rebol} ; print "Rebol"
Et voici le code des caractères pairs:
D 1 ; assign 1 to d
D:od ; URL-literal (foo:...), no side effect
d ; evaluates to integer, no side effect
{{hc agae utyulan}t} ; string literal (well-formed!), no side effect
p {[Red]} ; print "[Red]"
En fait, pour le programme non divisé par deux, le dd {dd {(arbitrary code)qt}}
programme exécutera le code que vous voulez. Cependant, il existe deux appels à évaluer au lieu d'un seul. En effet, bien que les accolades imbriquées fonctionnent parfaitement dans le code entrelacé, elles gâchent le comportement eval de DO. Car:
do {{print "Hello"}}
Charge la chaîne en tant que programme, mais ce programme n'est finalement que la constante de chaîne {print "Hello"}
. Donc, l’astuce que j’utilise ici est de prendre mon DD (en gardant la même valeur de fonction que DO) et de l’exécuter deux fois. Les deux moitiés mâchent les différentes parties de la chaîne, mais ils ne mâchent pas les deux si la régularité / la bizarrerie est correcte pour le contenu et parce que ce qui reste en dehors de la chaîne après la réduction de moitié est juste la constante intégrale, d
il est inoffensif.
Avec ce modèle, il n’est pas difficile d’écrire le comportement du programme s’il n’est pas divisé en deux: vous pouvez entrer n'importe quoi tant que la longueur du code est paire (impair si vous comptez le QT, qui est QUIT). Si vous devez obtenir le nombre pair d'un nombre impair, insérez un espace (il y a donc un +1 dans la formule ci-dessus sur p1 pour les longueurs de programme impaires de p1) . L'astuce semblerait écrire ce code entrelacé par la suite, qui doit passer à l'analyseur s'il n'est pas divisé par deux. (Il ne sera pas exécuté à cause de QT, mais il doit être chargé avant d'être exécuté.)
Cette affaire est triviale; pp
charge bien comme symbole même s'il n'est pas défini et est divisé en p
impression dans chaque demi-programme. Mais nous pouvons faire une autre astuce en utilisant à nouveau un littéral de chaîne. Les programmes divisés en deux ont toujours DO défini normalement, alors nous aurions aussi pu dire:
ddoo{{pp{{[RReebdo]l}}}}
En faisant en sorte que la seule partie de l’analyseur, dans l’ensemble du cas, soit le mot symbolique ddoo
et un littéral de chaîne, nous pouvons alors entrelacer deux programmes que nous souhaitons à l’intérieur de ce littéral de chaîne et ne pas irriter l’analyseur. Les versions divisées en deux diront simplement:
do{p{Rebol}}
..et...
do{p{[Red]}}
Comme je le disais, cette partie semble familière aux autres solutions qui traitent les programmes comme des chaînes et les évaluent. Mais dans le cas de la concurrence, lorsque les programmes que vous packagez contiennent des chaînes imbriquées, cela crée des clés pour eux. Ici, les seules choses qui vous poseront des problèmes sont les échappements via des carets ( ^
) ... faciles à contourner.
(Petite note de "triche": j'ai ajouté QT pour "QUIT" en réponse à ce problème. En fait, j'avais volontairement supprimé l'abréviation pour quitter avant ... parce que je pensais que c'était seulement bon pour une utilisation en console Un espace de deux lettres s'il n'était pas dans une REPL. Je l'ajoute parce que je me suis trompé, mais je ne l'ai pas ajouté pour ce cas en particulier. Néanmoins, avant ce changement, il aurait fallu 2 caractères de plus. Quand j'ai posté la solution pour la première fois, il y avait un bogue dans Rebmu qui l'empêchait de fonctionner même s'il aurait dû le faire ... maintenant, cela fonctionne.)
x0=00;;
. Grand défi!