Ortografi abad pertengahan

9

Tugas

Tugas Anda adalah mengubah teks menjadi ortografi abad pertengahan.

Detail

  1. jdikonversi ke idan Jke I.
  2. udan Upada awal kata dikonversi menjadi vdan Vmasing - masing.
  3. vdan Vdi mana saja kecuali awal kata dikonversi ke udan Umasing - masing.
  4. sdikonversi ke ſ(U + 017F) kecuali di akhir kata atau didahului oleh yang lain s.

Spesifikasi

  • Sebuah kata didefinisikan sebagai urutan huruf dalam abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.
  • Semua kata akan memiliki setidaknya dua huruf.
  • Input hanya akan terdiri dari karakter ASCII yang dapat dicetak (U + 0020 - U + 007E).
  • Tidak akan ada kejadian lebih dari dua kali berturut-turut s. Itu adalah,sss tidak akan menjadi substring dari input.

Testcases

Kata individual:

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_

Paragraf utuh:

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.

The SHA-256 hash dari output dari testcase terakhir adalah:

5641899e7d55e6d1fc6e9aa4804f2710e883146bac0e757308afc58521621644

Penolakan

Medievall orthographie bukanlah penipu itu. Harap jangan mengeluh jika Anda dapat memesan buku lama dengan ortografi yang berbeda.

Biarawati Bocor
sumber
1
"Kamu diperbolehkan menggunakan f sebagai ganti ſ dalam output." Jadi pada dasarnya tidak ada insentif untuk menggunakan ſ karena dibutuhkan lebih banyak byte.
Fatalkan tanggal
1
@Fatalize Fair point. Dihapus yang itu.
Leaky Nun
@ LeakyNun Bisakah kita menghitung ſsebagai 1 byte?
R. Kap
sebenarnya ada insentif dalam bentuk ff yang diubah menjadi fs dalam beberapa algoritma jika ſ tidak digunakan
Destructible Lemon
1
Tidak seharusnya Super-visemenjadi Super-viſe?
R. Kap

Jawaban:

3

SED, 144 140 111 Bytes

disimpan 29 byte berkat 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
sumber
1
Anda jiwa pemberani.
Alexander - Reinstate Monica
Anda dapat memotong banyak byte hanya dengan menggunakan 1 -e. Gunakan ;di antara pernyataan.
NoOneIsHere
Saya tidak tahu Anda bisa melakukan itu. Terima kasih!!
Riley
2

Python 3 ( 128 126 byte)

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)terasa berlebihan untuk xor string karakter tunggal, tapi mungkin Pythonista nyata dapat menyarankan golf. Namun, itu sangat nyaman yang ^3cukup untuk bertukar i <-> jdan u <-> v.

NB Satu-satunya hal di sini yang membutuhkan Python 3 adalah karakter Unicode: Python 2 mengeluh Non-ASCII character '\xc5' <snip> but no encoding declared.

Peter Taylor
sumber
Anda tidak boleh menggunakan \bkarena \bmenggunakan definisi kata yang mencakup angka dan garis bawah.
Leaky Nun
@ LeakyNun, hmm. Sementara saya mencari perbaikan, bisakah Anda menambahkan beberapa test case?
Peter Taylor
@ R. Kap. (?i).
Peter Taylor
@PeterTaylor Tunggu, apa fungsinya?
R. Kap
@ R.Kap, itu membuat regex tidak sensitif huruf.
Peter Taylor
2

Retina , 55 54 50 byte

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

Cobalah online! (Baris pertama memungkinkan rangkaian uji terpisah linefeed.)

Martin Ender
sumber
1

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

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)

Nah, ini sepertinya pekerjaan yang sempurna untuk ekspresi reguler !

R. Kap
sumber
1
Anda dapat menggunakannya J|jsebagai ganti[Jj]
Leaky Nun
1

JavaScript (ES6), 154

Menggunakan parseInt untuk mengidentifikasi karakter alfabet. Catatan: santai tapi untungnya 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``

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

Uji

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

Penjelasan: Karena JavaScript regexp tidak memiliki tampilan di belakang, saya malah memecah string menjadi kata-kata, yang kemudian memungkinkan saya untuk menggunakan ^dan \Bsebagai huruf negatif dan positif terlihat di belakang. ssditangani dengan mencocokkan secara terpisah, dengan ekspresi pengganti yang sedikit canggung yang membutuhkan byte lebih sedikit daripada hanya mengganti karakter pertama catau menambahkan ekstra ske kedua string dan menggunakan substring yang cocok.

Neil
sumber
c=>"iIvVuUſ"["jJuUvVs".search(c)]||"ſs"itu bagus. 👍🏻
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=}%

Demo online

Saya tidak pernah mengerti mengapa CJam tidak memiliki regex, tetapi karena tidak ada solusi yang tidak menggunakannya.

Peter Taylor
sumber
0

Ruby, 85 + 1 = 86 byte

Jalankan dengan ruby -p(+1 byte untuk pflag). Mengambil input pada stdin.

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

Jalankan tes pada ideone (dibungkus dengan lambda di sana karena Anda tidak dapat memberikan bendera ke ideone): http://ideone.com/AaZ8ya

Yordania
sumber