Ortografía medieval

9

Tarea

Su tarea es convertir un texto en ortografía medieval.

Detalles

  1. jse convierte a iy Jpara I.
  2. uy Ual comienzo de las palabras se convierten en vy Vrespectivamente.
  3. vy Ven cualquier lugar excepto el comienzo de las palabras se convierten en uy Urespectivamente.
  4. sse convierte a ſ(U + 017F) a menos que al final de la palabra o precedido por otro s.

Especificaciones

  • Una palabra se define como una secuencia de letras en abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.
  • Todas las palabras tendrán al menos dos letras.
  • La entrada solo consistirá en caracteres ASCII imprimibles (U + 0020 - U + 007E).
  • No habrá ocurrencias de más de dos consecutivas s. Es decir, sssno será una subcadena de la entrada.

Casos de prueba

Palabras individuales:

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_

Párrafo entero:

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.

El hash SHA-256 de la salida del último caso de prueba es:

5641899e7d55e6d1fc6e9aa4804f2710e883146bac0e757308afc58521621644

Descargo de responsabilidad

La ortografía de Medievall no es tan constante. Por favor, no complayne si usted ve libros antiguos con una ortografía diferente.

Monja permeable
fuente
1
"Se le permite usar f en lugar de ſ en la salida". Por lo tanto, básicamente no hay incentivo para usar ſ ya que toma más bytes.
Fatalize
1
@Fatalize Fair point. Quitado ese.
Leaky Nun
@LeakyNun ¿Podemos contar ſcomo 1 byte?
R. Kap
en realidad hay incentivos en la forma de ff que se cambia a fs en algunos algoritmos si no se usó used
Destructible Lemon
1
No debería Super-viseconvertirse Super-viſe?
R. Kap

Respuestas:

3

SED, 144 140 111 Bytes

ahorró 29 bytes gracias a 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
fuente
1
Eres valiente, alma valiente.
Alexander - Restablece a Mónica el
Puede cortar muchos bytes usando solo 1 -e. Utilice ;s entre declaraciones.
NoOneIsHere
No sabía que podías hacer eso. ¡¡Gracias!!
Riley
2

Python 3 ( 128 126 bytes)

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)se siente excesivo para xor una cadena de un solo carácter, pero tal vez un Pythonista real pueda sugerir un golf. Sin embargo, es muy conveniente que sea ^3suficiente para intercambiar i <-> jy u <-> v.

Nota: lo único que requiere Python 3 es el carácter Unicode: Python 2 se queja Non-ASCII character '\xc5' <snip> but no encoding declared.

Peter Taylor
fuente
No debe usar \bya que \busa la definición de una palabra que incluye dígitos y guiones bajos.
Leaky Nun
@LeakyNun, hmm. Mientras busco una solución, ¿podría agregar algunos casos de prueba?
Peter Taylor
@ R.Kap. (?i).
Peter Taylor
@PeterTaylor Espera, ¿qué hace eso?
R. Kap
@ R.Kap, hace que la expresión regular no distinga entre mayúsculas y minúsculas.
Peter Taylor
2

Retina , 55 54 50 bytes

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

Pruébalo en línea! (La primera línea habilita un conjunto de pruebas separadas por salto de línea).

Martin Ender
fuente
1

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

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)

Bueno, ¡este parece ser el trabajo perfecto para expresiones regulares !

R. Kap
fuente
1
Puedes usar en J|jlugar de[Jj]
Leaky Nun
1

JavaScript (ES6), 154

Usando parseInt para identificar caracteres alfabéticos. Nota: casualmente pero por suerte parseInt('undefined',36)|0es <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``

Menos 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``

Prueba

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
fuente
1

JavaScript (ES6), 111 bytes

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

Explicación: Debido a que JavaScript regexp no tiene retrospectiva, en lugar de eso divido la cadena en palabras, lo que me permite usar ^y \Bcomo retrospectivas de letras negativas y positivas. ssse trata haciendo coincidir por separado, con la expresión de reemplazo ligeramente incómoda que requiere menos bytes que reemplazar solo el primer carácter co agregar un extra sa ambas cadenas y usar la subcadena coincidente.

Neil
fuente
c=>"iIvVuUſ"["jJuUvVs".search(c)]||"ſs"es bueno. 👍🏻
Jordania
0

CJam ( 89 88 bytes)

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

Demostración en línea

Nunca entendí por qué CJam no tiene expresiones regulares, pero como no las tiene, aquí hay una solución que no las usa.

Peter Taylor
fuente
0

Ruby, 85 + 1 = 86 bytes

Ejecutar con ruby -p(+1 byte para pbandera). Toma entrada en stdin.

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

Ejecute las pruebas en ideone (envuelto en una lambda allí porque no puede darle banderas a ideone): http://ideone.com/AaZ8ya

Jordán
fuente