Ortografia medieval


9

Tarefa

Sua tarefa é converter um texto em ortografia medieval.

Detalhes

  1. jé convertido para ie Jpara I.
  2. ue Uno início das palavras são convertidos para ve Vrespectivamente.
  3. ve Vem qualquer lugar, exceto o início das palavras, são convertidos para ue Urespectivamente.
  4. sé convertido em ſ(U + 017F), a menos que no final da palavra ou precedido por outro s.

Especificações

  • Uma palavra é definida como uma sequência de letras em abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.
  • Todas as palavras terão pelo menos duas letras.
  • A entrada será composta apenas por caracteres ASCII imprimíveis (U + 0020 - U + 007E).
  • Não haverá ocorrências superiores a duas consecutivas s. Ou seja, sssnão será uma substring da entrada.

Casos de teste

Palavras individuais:

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_

Parágrafo inteiro:

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.

O hash SHA-256 da saída do último caso de teste é:

5641899e7d55e6d1fc6e9aa4804f2710e883146bac0e757308afc58521621644

aviso Legal

A ortografia medieval não é tão confiável. Por favor, não reclame se você deve ler livros antigos com uma ortografia diferente.


11
"Você tem permissão para usar f em vez de ſ na saída." Portanto, basicamente não há incentivo para usar ſ, pois são necessários mais bytes.
Fatalize

11
@Fatalize Fair point. Removido esse.
Freira vazada

@LeakyNun Podemos então contar ſcomo 1 byte?
R. Kap

há realmente incentivo na forma de ff sendo alterado para fs em alguns algoritmos, se s não foi usado
Destrutível Lemon

11
Não deveria se Super-visetornar Super-viſe?
R. Kap

Respostas:


3

SED, 144 140 111 Bytes

economizou 29 bytes graças 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'

11
Você é corajoso, alma corajosa.
Alexander - Restabelece Monica

Você pode cortar muitos bytes usando apenas 1 -e. Use ;s entre instruções.
NoOneIsHere

Eu não sabia que você poderia fazer isso. Obrigado!!
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)parece excessivo para xor uma seqüência de caracteres únicos, mas talvez um Pythonista real possa sugerir um golfe. No entanto, é muito conveniente o ^3suficiente para trocar i <-> je u <-> v.

Nota: A única coisa aqui que requer Python 3 é o caractere Unicode: o Python 2 reclama Non-ASCII character '\xc5' <snip> but no encoding declared.


Você não deve usar, \bpois \busa a definição de uma palavra que inclui dígitos e sublinhados.
Freira vazada

@LeakyNun, hmm. Enquanto estou procurando uma correção, você pode adicionar alguns casos de teste?
Peter Taylor

@ R.Kap. (?i).
Peter Taylor

@PeterTaylor Espere, o que isso faz?
R. Kap

@ R.Kap, torna o regex sem distinção entre maiúsculas e minúsculas.
Peter Taylor


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)

Bem, este parece ser o trabalho perfeito para expressões regulares !


11
Você pode usar J|jem vez de[Jj]
Leaky Nun

1

JavaScript (ES6), 154

Usando parseInt para identificar caracteres alfabéticos. Nota: ocasionalmente, mas felizmente parseInt('undefined',36)|0é <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 golfe

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

Teste

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>


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"))

Explicação: Como a regexp do JavaScript não tem um retaguarda, em vez disso, divido a sequência em palavras, o que me permite usar ^e \Bcomo retas negativas e positivas. ssé tratado combinando separadamente, com a expressão de substituição um pouco estranha que leva menos bytes do que substituir apenas o primeiro caractere cou adicionar um extra sa ambas as cadeias e usar a substring correspondente.


c=>"iIvVuUſ"["jJuUvVs".search(c)]||"ſs"é legal. 👍🏻
Jordan

0

CJam ( 89 88 bytes)

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

Demonstração online

Eu nunca entendi por que o CJam não possui regexes, mas como não existe, aqui está uma solução que não os utiliza.


0

Ruby, 85 + 1 = 86 bytes

Execute com ruby -p(+1 byte para psinalizador). Recebe entrada em stdin.

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

Execute os testes no ideone (envolto em um lambda lá porque você não pode dar bandeiras ao ideone): http://ideone.com/AaZ8ya

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.