En écrivant mon essai pour Shakespeare, je me suis rendu compte que je devais raccourcir mes références de citation à des longueurs plus gérables. J'avais déjà écrit ceci:
(Act 1, Scene 2, Lines 345-346)
Mais on m'a maintenant dit de les écrire comme ceci:
(I.ii.345-6)
Clairement, il me faut un peu de code golfé pour que mes références à la citation de Shakespeare soient un peu moins détaillées.
La tâche
Ecrivez un programme ou une fonction qui, en fonction d'une entrée de chaîne suivant le modèle 1 ou 2, imprime ou retourne une chaîne suivant le modèle 3 ou 4, respectivement. Vous devez uniquement prendre en charge les Actes 1 à 5 et les scènes 1 à 9.
Modèles
Modèle 1
(Act x, Scene y, Lines a-b)
Vous pouvez supposer que x
jamais ne dépasse 5, y
ne dépasse jamais 9 a
et b
sont toujours des entiers positifs n'excédant pas la valeur entière standard positive maximale de votre langue et a
est toujours exclusivement inférieur à b
.
Modèle 2
(Act x, Scene y, Line a)
Mêmes conditions que le modèle 1, à l'exclusion des informations sur b
.
Modèle 3
(x.y.a-b)
Où x
est un chiffre roman de capital, y
est un chiffre roman minuscule, a
et b
sont des nombres, et b
est réduit à seulement les chiffres de moins que le premier chiffre différent de l' égalité de signification a
.
Modèle 4
(x.y.a)
Mêmes conditions que le modèle 3, à l'exclusion des informations sur b
.
Cas de test
Soit f(s)
la fonction définie dans la tâche. ""
dénote une valeur de chaîne.
>>> f("(Act 1, Scene 2, Lines 345-346)")
"(I.ii.345-6)"
>>> f("(Act 3, Scene 4, Lines 34-349)")
"(III.iv.34-349)"
>>> f("(Act 5, Scene 9, Lines 123-234)")
"(V.ix.123-234)"
>>> f("(Act 3, Scene 4, Line 72)")
"(III.iv.72)"
>>> f("(Act 2, Scene 3, Lines 123-133)")
"(II.iii.123-33)"
>>> f("(Act 4, Scene 8, Lines 124-133)")
"(IV.viii.124-33)"
Pour les besoins de ce défi, les traductions suivantes en chiffres romains et arabes doivent être prises en charge:
1 i I
2 ii II
3 iii III
4 iv IV
5 v V
6 vi (you do not have to support past 5)
7 vii
8 viii
9 ix
(Act 1, Scene 2, Lines 345-3499)
Réponses:
Le langage de programmation Shakespeare (non concurrent)
J'ai vraiment aimé cette question, et comme il y avait un certain intérêt pour une réponse en langue Shakespeare, en voici une.
(Cela fait plus de 6000 octets de long.) Il y a quelques astuces ici mais je n'ai pas essayé de jouer beaucoup au golf, car: (1) j'ai déjà contribué ma part de golf sur une autre réponse, et (2) changer tous les caractères en "Page "et" Puck ", ou toutes les phrases à" gros gros gros gros chat ", semblent gâcher le plaisir. Au lieu de cela, pour la partie qui traite des chiffres romains, j’ai utilisé des caractères qui sont romains, etc. J’ai réutilisé des caractères et des instructions pour enregistrer certains types de frappe. :-)
Le programme devrait être plutôt simple, mais il est intéressant de noter que, lorsque j’écrivais cela, j’imaginais que la lecture d’un nombre entier fonctionnerait comme suit
scanf
: (1) ne consommez autant de caractères de l’entrée que correspond à un entier, et d’échec, laissez la variable inchangée. (J'ai utilisé cette seconde propriété pour distinguer les modèles 1 et 2 de l'acte II, en lisant jusqu'à "Line" et en essayant de lire un entier.) Malheureusement, il s'avère qu'il y a (ce que je considère) un bogue dans la mise en oeuvre originale de la langue dans laquelle lire un entier consomme tout jusqu'à la fin de la ligne et génère une erreur en cas d'échec; un correctif estlibspl.c
donc nécessaire pour que leint_input
comportement se comporte davantagescanf
.Et avec ça, ça marche:
Pseudocode légèrement supérieur à celui sur lequel j'ai travaillé, pour aider ceux qui cherchent à comprendre:
Relier ce qui précède au code final est laissé comme un exercice. :-) Notez que ShakespearePL a une arithmétique et des piles et des gotos mais pas de pointeurs (seulement des étiquettes), donc implémenter des "sous-routines" comme la conversion en Roman est un peu… intéressant.
la source
LaTeX,
513364259226215178159 octetsLes bons essais doivent toujours être écrits en LaTeX.
Ceci utilise le paquetage xstring car il n’ya pas vraiment beaucoup de manipulation de chaîne intégrée. Du côté positif, la limite supérieure de la
\Roman
mise en forme intégrée est plus grande que ce dont nous aurons besoin (même pour les sonnets)2^31-1
. J'ai inclus\documentclass{ecv}
dans le décompte, mais aucun des codes de test:(Si vous êtes assez fou pour l'utiliser, vous devrez au moins ungolfer les noms de macro. Remplacer des macros à un caractère est une mauvaise pratique.)
Ungolfed et commenté:
Notez que dans cette version, les commentaires sont obligatoires, sinon la nouvelle ligne est interprétée comme un espace et se développe en un espace.
la source
~
comme nom de macro au lieu de\s
. Mais en réalité, vous n’avez pas du tout besoin\s
(\stripcomma
dans la version non-golfée): vous pouvez juste\def\t#1 #2, #3 #4, #5 #6
et TeX se chargera d’effacer les virgules. (Vous pouvez donc utiliser l'~
astuce à la\t
place, en économisant 1 octet.)~
est un peu méchant mais j'aime bien ici. Cela signifiait que je devais changer la classe de documents (en l'un des autres.cls
fichiers de 3 lettres que j'avais installés)\@roman
et\@Roman
n'ont pas besoin d'accolades autour de l'argument.xstring
idées principales étaient les vôtres :-) C'était amusant de jouer au golf ensemble!JavaScript (ES6),
210183178177171 octets27 octets sauvegardés en déroulant les paramètres de repos (grâce à ETHproductions )
5 octets sauvegardés en ne faisant pas correspondre le paren d'ouverture et en modifiant la génération en chiffres romains
Sauvegardé 1 octet en ajustant l'expression ternaire finale
Sauvegardé 6 octets en combinant deux groupes correspondants
Cas de test:
la source
Act
chacun\D*
d'eux.*
?Gelée ,
87 8685 octetsEssayez-le en ligne! ou voir une suite de tests
Comment?
la source
œr
,Ṗ,Ç
,Ṗ€V
,ṪÇ$
,W
comme le dernier lien sur un lien d'aide, peut - être d' autres aussi, bien l' effort! Ce n’est pas votre soumission Jelly habituelle d’environ 80 ans, cela mérite une reconnaissance particulière de la part des membres de Jelly.R ,
94126112166 octetsEt maintenant il est verbeux qu'auparavant :(, de retour à essayer de golf davantage. Regex pour réduire la référence de la page sans vergogne
Stolenempruntée à @FryAmTheEggman.Maintenant, j'ai vraiment besoin de travailler pour récupérer les octets, mais cela fonctionne maintenant pour le second cas.
Essayez-le en ligne! - Notez que
el
cela ne fonctionne pas sur TIO et a été remplacé parunlist
la source
La rétine ,
8988 octetsEssayez-le en ligne!
3 octets sauvés grâce à Neil.
Élimine les caractères inutiles avant de remplacer les deux premiers chiffres par des blocs de
i
caractères. Ensuite, il sélectionne des morceaux de cesi
lettres pour former les chiffres romains appropriés. Ensuite, nous capitalisons le premier chiffre romain. Enfin, nous apparions autant de nombres que possible avant le trait d'union et après le trait d'union, de sorte que le nombre de chiffres du nombre soit le même. Nous supprimons ensuite ce préfixe du deuxième numéro.la source
iiiii
parv
,iiii
aveciv
etviv
avecix
semble sauver quelques octets.345-356
- je m'y attendais345-56
.\b
à la fin du dernier remplacement pour éviter de devoir répéter le)
dans la substitution?\d
mais cela semble fonctionner, car il n'y a pas d'autre limite de mots. Merci!PHP> = 7.1, 195 octets
Testcases
Étendu
la source
preg_match_all("#\d+#",$argn,$m);[$a,$s,$b,$e]=$m[0];
enregistre deux octets.if($e){for(;$b[$i]==$e[$i];$i++);echo"-",substr($e,$i);}echo")";
devrait enregistrer 46.(you do not have to support past 5)
enregistre 15 octets.".$r[$s].$b"
enregistre 5 autres octets; et[[$a,$s,$b,$e]]=$m;
un autre. Malheureusement, les assignations de tableaux ne fonctionnent pas (encore) par référence.if($e&&$e-$b){for($x=str_pad($b,strlen($e),0,0);$x[$i]==$e[$i];$i++);echo"-",substr($e,$i);}
enregistre 10 octets et pourrait fonctionner.&&$e-$b
est inutile pour les cas de test; donc il enregistre 17 octets, pas 10. Btw. vous n'avez toujours pas besoin de chiffres romains 6 à 9.;)for(;str_pad($b,strlen($e),0,0)[$i]==$e[$i];)$i++;
parfor(;$e&&~$c=$e[-++$k];)$c>$b[-$k]&&$i=-$k;
.Perl 5, 185 + 1 = 186 octets
Pénalité de 1 octet pour le
-n
drapeau requis .Peut échouer pour certains cas de test où la scène a plus de 10 ^ 11 lignes, mais d'après ce que je sais, aucune scène de Shakespeare n'est aussi longue;)
Sous forme lisible:
la source
Ruby , 204 + 1 = 205 octets
Utilise le
-p
drapeau.Essayez-le en ligne!
la source
Python 2.7 298 octets
la source
Perl, 99 octets
Courez avec
perl -pe
. 98 octets (source) + 1 octet (p
indicateur) = 99.la source
Python 2 ,
301259252221 octetsUn énorme -31 octets grâce à Chas Brown.
Donc, euh, c'est ... extrêmement long ... Je pense que je peux jouer au golf, mais cela me fouette la tête depuis un moment.
Essayez-le en ligne!
Panne
la source
b,c,d,e,f=s.groups()
place dea,b,c,d,e,f=[s.group(n) for n in range(6)]
[0]+'i,ii,iii,iv,v,vi,vii,viii,ix'.split(',')
au lieu de[s,'i','ii','iii','iv','v','vi','vii','viii','ix']
.[0]+'i ii iii iv v vi vii viii ix'.split()
place de[s,'i','ii','iii','iv','v','vi','vii','viii','ix']
.0
intérieur des guillemets. Un dernier tweak mineur , je peux voir que vous utilisez:s,r=XXX,YYY;b,c,d,e,f=s.groups();
vous pouvez enregistrer un autre 4 octets par lieu de dire de façon équivalente:b,c,d,e,f=XXX.groups();r=YYY;
. Donc, vous vous retrouvez avec 81 octets de moins que ma soumission! :)q / kdb +,
200187 octetsSolution:
Exemples:
Explication: (légèrement non golfé)
Remarques:
Techniquement, il peut être plus court de 2 octets (inutile
f:
), mais il est plus facile de montrer des exemples de cette façon.Modifications:
string
par$:
,count
avec#:
,til
avec(!)
etfirst
avec(*:)
, transforme les indices de R en chaînes afin que nous n'ayons pas à convertir act / scene en intsla source