Średniowieczna ortografia

9

Zadanie

Twoim zadaniem jest konwersja tekstu na średniowieczną ortografię.

Detale

  1. jjest konwertowany na ii Jna I.
  2. ua Una początku słowa są konwertowane odpowiednio na vi V.
  3. vi Vw dowolnym miejscu oprócz początku słów są konwertowane odpowiednio na ui U.
  4. sjest konwertowany na ſ(U + 017F), chyba że na końcu słowa lub poprzedzony innym s.

Okular

  • Słowo jest zdefiniowane jako ciąg liter w abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.
  • Wszystkie słowa będą miały co najmniej dwie litery.
  • Dane wejściowe będą się składały wyłącznie z drukowalnych znaków ASCII (U + 0020 - U + 007E).
  • Nie będzie więcej niż dwa kolejne wystąpienia s. Oznacza to, sssże nie będzie podciągiem danych wejściowych.

Przypadki testowe

Poszczególne słowa:

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_

Cały akapit:

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.

SHA-256 hash wyjścia ostatniego testcase jest:

5641899e7d55e6d1fc6e9aa4804f2710e883146bac0e757308afc58521621644

Zrzeczenie się

Medievall ortografia nie jest aż tak konsekwentna. Proszę nie grać, jeśli lubisz stare książki z inną ortografią.

Leaky Nun
źródło
1
„Możesz użyć f zamiast ſ na wyjściu.” W zasadzie nie ma zachęty do używania ſ, ponieważ zajmuje więcej bajtów.
Fatalize
1
@Fatalize Fair point. Usunąłem ten.
Leaky Nun
@LeakyNun Czy możemy liczyć ſjako 1 bajt?
R. Kap
w niektórych algorytmach istnieje zachęta w postaci zmiany ff na fs, jeśli ſ nie zostało użyte
Destructible Lemon
1
Nie powinno Super-visesię stać Super-viſe?
R. Kap

Odpowiedzi:

3

SED, 144 140 111 bajtów

zapisano 29 bajtów dzięki 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
źródło
1
Ty dzielna, dzielna dusza.
Alexander - Przywróć Monikę
Możesz wyciąć wiele bajtów, używając tylko 1 -e. Użyj ;s pomiędzy instrukcjami.
NoOneIsHere
Nie wiedziałem, że możesz to zrobić. Dzięki!!
Riley,
2

Python 3 ( 128 126 bajtów)

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)wydaje się przesadny w stosunku do ciągów jednoznakowych, ale może prawdziwy Pythonista może zasugerować golfa. Jednak jest to bardzo wygodne, że ^3wystarczy wymienić i <-> ji u <-> v.

Uwaga: Jedyną rzeczą, która wymaga Python 3, jest znak Unicode: Python 2 narzeka Non-ASCII character '\xc5' <snip> but no encoding declared.

Peter Taylor
źródło
Nie powinieneś używać, \bponieważ \bużywa definicji słowa, która zawiera cyfry i znaki podkreślenia.
Leaky Nun
@LeakyNun, hmm. Kiedy szukam rozwiązania, czy mógłbyś dodać kilka przypadków testowych?
Peter Taylor,
@ R.Kap. (?i).
Peter Taylor,
@PeterTaylor Czekaj, co to robi?
R. Kap
@ R.Kap, sprawia, że ​​wyrażenie regularne nie uwzględnia wielkości liter.
Peter Taylor,
2

Siatkówka , 55 54 50 bajtów

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

Wypróbuj online! (Pierwszy wiersz włącza pakiet testowy oddzielny od kanału).

Martin Ender
źródło
1

Python 3.5, 124 116 111 118 125 144 142 bajtów:

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)

Wydaje się, że to idealna praca dla wyrażeń regularnych !

R. Kap
źródło
1
Możesz użyć J|jzamiast[Jj]
Leaky Nun
1

JavaScript (ES6), 154

Użycie parsowania do identyfikacji znaków alfabetycznych. Uwaga: od niechcenia, ale na szczęście parseInt('undefined',36)|0wynosi <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``

Mniej golfa

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

Test

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
źródło
1

JavaScript (ES6), 111 bajtów

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

Objaśnienie: Ponieważ regexp JavaScript ma lookbehind, ja zamiast zerwać łańcuch w słowa, które następnie pozwala mi korzystać ^i \Bjak negatywne i pozytywne literowych lookbehinds. ssrozwiązuje się to poprzez osobne dopasowywanie, z nieco niezręcznym wyrażeniem zastępującym, które zajmuje mniej bajtów niż albo zastępowanie tylko pierwszego znaku, calbo dodawanie dodatkowego sdo obu ciągów i stosowanie dopasowującego podłańcucha.

Neil
źródło
c=>"iIvVuUſ"["jJuUvVs".search(c)]||"ſs"jest miło. 👍🏻
Jordan,
0

CJam ( 89 88 bajtów)

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

Demo online

Nigdy nie rozumiałem, dlaczego CJam nie ma wyrażeń regularnych, ale ponieważ nie ma rozwiązania, które ich nie używa.

Peter Taylor
źródło
0

Rubinowy, 85 + 1 = 86 bajtów

Uruchom z ruby -p(+1 bajt dla pflagi). Pobiera dane wejściowe na standardowe wejście.

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

Przeprowadź testy na ideone (owiniętym w tam lambda, ponieważ nie możesz dać flag ideone): http://ideone.com/AaZ8ya

Jordania
źródło