Mittelalterliche Rechtschreibung

9

Aufgabe

Ihre Aufgabe ist es, einen Text in mittelalterliche Rechtschreibung umzuwandeln.

Einzelheiten

  1. jwird in iund Jnach konvertiert I.
  2. uund Uam Anfang von Worten zu umgewandelt vund Vjeweils.
  3. vund Van jedem Ort , außer Anfang Worte umgewandelt uund Ujeweils.
  4. swird in ſ(U + 017F) konvertiert, es sei denn am Ende des Wortes oder vor einem anderen s.

Technische Daten

  • Ein Wort ist definiert als eine Folge von Buchstaben in abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.
  • Alle Wörter haben mindestens zwei Buchstaben.
  • Die Eingabe besteht nur aus druckbaren ASCII-Zeichen (U + 0020 - U + 007E).
  • Es werden nicht mehr als zwei aufeinanderfolgende Vorkommen auftreten s. Das heißt, es ssswird keine Teilzeichenfolge der Eingabe sein.

Testfälle

Individuelle Wörter:

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_

Ganzer Absatz:

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.

Der SHA-256- Hash der Ausgabe des letzten Testfalls lautet:

5641899e7d55e6d1fc6e9aa4804f2710e883146bac0e757308afc58521621644

Haftungsausschluss

Die mittelalterliche Orthographie ist nicht so konsequent. Bitte beschweren Sie sich nicht, wenn Sie alte Bücher mit einer anderen Rechtschreibung lesen.

Undichte Nonne
quelle
1
"Sie dürfen in der Ausgabe f anstelle von ſ verwenden." Es gibt also grundsätzlich keinen Anreiz, ſ zu verwenden, da mehr Bytes benötigt werden.
Fatalize
1
@Fatalize Fair Punkt. Entfernte diesen.
Undichte Nonne
@LeakyNun Können wir dann ſals 1 Byte zählen?
R. Kap
Es gibt tatsächlich einen Anreiz in Form von ff, in einigen Algorithmen in fs geändert zu werden, wenn ſ nicht verwendet wurde
Destructible Lemon
1
Sollte nicht Super-visewerden Super-viſe?
R. Kap

Antworten:

3

SED, 144 140 111 Bytes

29 Bytes dank NoOneIsHere gespart

-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
quelle
1
Du tapfere, tapfere Seele.
Alexander - Reinstate Monica
Sie können viele Bytes mit nur 1 schneiden -e. Verwenden Sie ;s dazwischen Anweisungen.
NoOneIsHere
Ich wusste nicht, dass du das kannst. Vielen Dank!!
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)fühlt sich übertrieben an, um eine einzelne Zeichenkette zu xor, aber vielleicht kann ein echter Pythonista einen Golf vorschlagen. Es ist jedoch sehr praktisch, dass ^3ausreicht, um i <-> jund auszutauschen u <-> v.

NB Das einzige, was Python 3 erfordert, ist das Unicode-Zeichen: Python 2 beschwert sich Non-ASCII character '\xc5' <snip> but no encoding declared.

Peter Taylor
quelle
Sie sollten nicht verwenden, \bda \bdie Definition eines Wortes verwendet wird, das Ziffern und Unterstriche enthält.
Undichte Nonne
@LeakyNun, hmm. Könnten Sie bitte einige Testfälle hinzufügen, während ich nach einer Lösung suche?
Peter Taylor
@ R.Kap. (?i).
Peter Taylor
@ PeterTaylor Warte, was macht das?
R. Kap
@ R.Kap, es macht den Regex unabhängig von Groß- und Kleinschreibung.
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)

Nun, dies scheint der perfekte Job für reguläre Ausdrücke zu sein !

R. Kap
quelle
1
Sie können J|janstelle von[Jj]
Leaky Nun
1

JavaScript (ES6), 154

Verwenden von parseInt zum Identifizieren von alphabetischen Zeichen. Hinweis: beiläufig aber zum Glück parseInt('undefined',36)|0ist <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``

Weniger Golf gespielt

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

Prüfung

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

JavaScript (ES6), 111 Byte

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

Erläuterung: Da JavaScript regexp keine Lookbehind hat, ich stattdessen die Zeichenfolge in Worte brechen, die dann mir erlaubt , zu verwenden ^und \Bals negative und positive Brief Lookbehinds. sswird durch separates Matching behandelt, wobei der etwas umständliche Ersetzungsausdruck weniger Bytes benötigt, als entweder nur das erste Zeichen von zu ersetzen coder sbeiden Zeichenfolgen ein Extra hinzuzufügen und den passenden Teilstring zu verwenden.

Neil
quelle
c=>"iIvVuUſ"["jJuUvVs".search(c)]||"ſs"ist schön. 👍🏻
Jordanien
0

CJam ( 89 88 Bytes)

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

Online-Demo

Ich habe nie verstanden, warum CJam keine regulären Ausdrücke hat, aber da dies nicht der Fall ist, gibt es hier eine Lösung, die sie nicht verwendet.

Peter Taylor
quelle
0

Ruby, 85 + 1 = 86 Bytes

Führen Sie mit ruby -p(+1 Byte für pFlag). Nimmt Eingaben auf stdin vor.

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

Führen Sie die Tests auf ideone aus (dort in ein Lambda gehüllt, weil Sie ideone keine Flags geben können): http://ideone.com/AaZ8ya

Jordan
quelle