Orthographe médiévale

9

Tâche

Votre tâche consiste à convertir un texte en orthographe médiévale.

Détails

  1. jest converti en iet Jen I.
  2. uet Uau début des mots sont convertis en vet Vrespectivement.
  3. vet Vn'importe où sauf le début des mots sont convertis en uet Urespectivement.
  4. sest converti en ſ(U + 017F) sauf si à la fin du mot ou précédé d'un autre s.

Spécifications

  • Un mot est défini comme une séquence de lettres en abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.
  • Tous les mots auront au moins deux lettres.
  • L'entrée sera uniquement composée de caractères ASCII imprimables (U + 0020 - U + 007E).
  • Il ne se produira pas plus de deux événements consécutifs s. Autrement dit, sssne sera pas une sous-chaîne de l'entrée.

Cas de test

Mots individuels:

Input       Output
------------------------
Joy         Ioy
joy         ioy
Universe    Vniuerſe
universe    vniuerſe
Success     Succeſs
successfull ſucceſsfull
Supervise   Superuiſe
supervise   ſuperuiſe
Super-vise  Super-viſe
I've        I've
majors      maiors
UNIVERSE    VNIUERSE
0universe   0vniuerſe
0verify     0verify
I0ve        I0ve
_UU_          _VU_
_VV_          _VU_
ss_         ſs_

Paragraphe entier:

Input:  Christian Reader, I have for thy use collected this small Concordance, with no small labour. For being to comprise much in little roome, I was to make choyse of the most principall and usefull places, and to rank them under such words as I thought most essentiall and materiall in the sentence, because the scant roome allotted unto me, would not permit that I should expresse them under every word in the verse, as it is the manner in large Concordances.

Output: Chriſtian Reader, I haue for thy vſe collected this ſmall Concordance, with no ſmall labour. For being to compriſe much in little roome, I was to make choyſe of the moſt principall and vſefull places, and to rank them vnder ſuch words as I thought moſt eſsentiall and materiall in the ſentence, becauſe the ſcant roome allotted vnto me, would not permit that I ſhould expreſse them vnder euery word in the verſe, as it is the manner in large Concordances.

Le hachage SHA-256 de la sortie du dernier testcase est:

5641899e7d55e6d1fc6e9aa4804f2710e883146bac0e757308afc58521621644

Avertissement

L'orthographie médiévale n'est pas si conſtante. Nous vous prions de ne pas nous plaindre si vous devez réserver des livres anciens avec une orthographie différente.

Leaky Nun
la source
1
"Vous êtes autorisé à utiliser f au lieu de ſ dans la sortie." Il n'y a donc fondamentalement aucune incitation à utiliser ſ car cela prend plus d'octets.
Fatalize
1
@Fatalize Fair point. Supprimé celui-là.
Leaky Nun
@LeakyNun Peut-on alors compter ſcomme 1 octet?
R. Kap
il y a en fait une incitation sous la forme de ff changé en fs dans certains algorithmes si ſ n'a pas été utilisé
Destructible Lemon
1
Ne devrait pas Super-visedevenir Super-viſe?
R. Kap

Réponses:

3

SED, 144 140 111 octets

enregistré 29 octets grâce à NoOneIsHere

-r -e'y/j/i/g;y/J/I/g;s/ u/ v/g;s/ U/ V/g;s/^u/v/g;s/^U/V/g;s/([^s])s(\w)/\1ſ\2/g;s/(\w)v/\1u/g;s/(\w)V/\1U/g'
Riley
la source
1
Vous brave, brave âme.
Alexander - Reinstate Monica
Vous pouvez couper plusieurs octets en utilisant seulement 1 -e. Utilisez ;s entre les instructions.
NoOneIsHere
Je ne savais pas que tu pouvais faire ça. Merci!!
Riley
2

Python 3 ( 128 126 octets)

import re;lambda k:re.sub("(?<!s)s(?=[a-zA-Z])",'ſ',re.sub("(?i)j|(?<![a-z])u|(?<=[a-z])v",lambda c:chr(ord(c.group())^3),k))

chr(ord(c.group())^3)semble excessif pour xor une chaîne à un seul caractère, mais peut-être qu'un vrai Pythonista peut suggérer un golf. Cependant, c'est très pratique qui ^3suffit pour échanger i <-> jet u <-> v.

NB La seule chose ici qui nécessite Python 3 est le caractère Unicode: Python 2 se plaint Non-ASCII character '\xc5' <snip> but no encoding declared.

Peter Taylor
la source
Vous ne devriez pas utiliser \bcar \butilise la définition d'un mot qui comprend des chiffres et des traits de soulignement.
Leaky Nun
@LeakyNun, hmm. Pendant que je recherche un correctif, pourriez-vous s'il vous plaît ajouter des cas de test?
Peter Taylor
@ R.Kap. (?i).
Peter Taylor
@PeterTaylor Attendez, qu'est-ce que cela fait?
R. Kap
@ R.Kap, il rend la regex insensible à la casse.
Peter Taylor
2

Rétine , 55 54 50 octets

T`jJvV`iIuU
Ti01`uUp`vVp`[a-z]+
s(s*[a-zA-Z])
ſ$1

Essayez-le en ligne! (La première ligne active une suite de tests séparée par saut de ligne.)

Martin Ender
la source
1

Python 3.5, 124 116 111 118 125 144 142 octets:

import re;lambda k:re.sub("J|j|(?<![a-zA-Z])[uU]|(?<=[a-zA-Z])[Vv]|(?<!s)s(?=[a-zA-Z])",lambda g:dict(zip('jJuUvVs','iIvVuUſ'))[g.group()],k)

Eh bien, cela semble être le travail parfait pour les expressions régulières !

R. Kap
la source
1
Vous pouvez utiliser à la J|jplace de[Jj]
Leaky Nun
1

JavaScript (ES6), 154

Utilisation de parseInt pour identifier les caractères alphabétiques. Remarque: nonchalamment mais heureusement parseInt('undefined',36)|0est <0

s=>[...s].map((c,i)=>((n=v(c))-19?n==31&p>9?'uU':n!=30|p>9?c=='s'&s[i-1]!=c&v(s[i+1])>9?'?':c+c:'vV':'iI')[p=n,c<'a'|0],p=0,v=c=>parseInt(c,36)|0).join``

Moins golfé

s=>
  [...s].map(
  (c,i)=>
  ((n=v(c))-19
  ?n==31&p>9
    ?'uU'
    :n!=30|p>9
      ?c=='s'&s[i-1]!=c&v(s[i+1])>9
        ?'ſ'
        :c+c
      :'vV'
  :'iI')[p=n,c<'a'|0],
  p=0,
  v=c=>parseInt(c,36)|0
).join``

Tester

F=
s=>[...s].map((c,i)=>((n=v(c))-19?n==31&p>9?'uU':n!=30|p>9?c=='s'&s[i-1]!=c&v(s[i+1])>9?'ſ':c+c:'vV':'iI')[p=n,c<'a'|0],p=0,v=c=>parseInt(c,36)|0).join``

out=(a,b,c)=>O.textContent+=a+'\n'+b+'\n'+c+'\n\n'

ti='Christian Reader, I have for thy use collected this small Concordance, with no small labour. For being to comprise much in little roome, I was to make choyse of the most principall and usefull places, and to rank them under such words as I thought most essentiall and materiall in the sentence, because the scant roome allotted unto me, would not permit that I should expresse them under every word in the verse, as it is the manner in large Concordances.'
to='Chriſtian Reader, I haue for thy vſe collected this ſmall Concordance, with no ſmall labour. For being to compriſe much in little roome, I was to make choyſe of the moſt principall and vſefull places, and to rank them vnder ſuch words as I thought moſt eſsentiall and materiall in the ſentence, becauſe the ſcant roome allotted vnto me, would not permit that I ſhould expreſse them vnder euery word in the verſe, as it is the manner in large Concordances.'
r=F(ti)
out(to==r?'OK':'KO',ti,r)

test=`Joy         Ioy
joy         ioy
Universe    Vniuerſe
universe    vniuerſe
Success     Succeſs
successfull ſucceſsfull
Supervise   Superuiſe
supervise   ſuperuiſe
Super-vise  Super-viſe
I've        I've
majors      maiors
UNIVERSE    VNIUERSE
0universe   0vniuerſe
0verify     0verify
I0ve        I0ve
_UU_          _VU_
_VV_          _VU_
ss_         ſs_`
.split('\n').map(t=>{
  var [i,o]=t.split(/\s+/),r=F(i)
  out(o==r?'OK':'KO',i,r)
})
#O {width:90%; overflow:auto; white-space: pre-wrap}
<pre id=O></pre>

edc65
la source
1

JavaScript (ES6), 111 octets

s=>s.replace(/[a-z]+/gi,w=>w.replace(/j|J|^u|^U|\Bv|\BV|ss|s(?!$)/g,c=>"iIvVuUſ"["jJuUvVs".search(c)]||"ſs"))

Explication: Parce que l'expression rationnelle JavaScript n'a pas de lookbehind, je décompose la chaîne en mots, ce qui me permet ensuite d'utiliser ^et \Bcomme lookbehinds de lettres négatives et positives. ssest traitée par correspondance séparément, avec l'expression de remplacement légèrement maladroite qui prend moins d'octets que soit en remplaçant uniquement le premier caractère de cou en ajoutant un supplément saux deux chaînes et en utilisant la sous-chaîne correspondante.

Neil
la source
c=>"iIvVuUſ"["jJuUvVs".search(c)]||"ſs"est sympa. 👍🏻
Jordan
0

CJam ( 89 88 octets)

{32|_'`>\'{<*}:A;SqS++3ew{_1="jJuUvVs"#[-4_{_0=A!3*}_{_0=A3*}_{_)A\0='s=>268*}W]=~f^1=}%

Démo en ligne

Je n'ai jamais compris pourquoi CJam n'a pas d'expressions régulières, mais comme ce n'est pas le cas, voici une solution qui ne les utilise pas.

Peter Taylor
la source
0

Ruby, 85 + 1 = 86 octets

Exécutez avec ruby -p(+1 octet pour le pdrapeau). Prend une entrée sur stdin.

gsub(/j|(?<=^|[^a-z])u|(?<=[a-z])v|(?<=^|[^s])s(?=[a-z])/i){$&.tr"jJsUuVv","iIfVvUu"}

Exécutez les tests sur ideone (enveloppé dans un lambda car vous ne pouvez pas donner de drapeaux à ideone): http://ideone.com/AaZ8ya

Jordan
la source