Середньовічна орфографія


9

Завдання

Ваше завдання - перетворити текст у середньовічну орфографію.

Деталі

  1. jперетворюється на iта Jв I.
  2. uі Uна початку слів перетворюються в vі Vвідповідно.
  3. vі Vв будь-якому місці , крім початку слів перетворюються в uі Uвідповідно.
  4. sперетворюється на ſ(U + 017F), якщо тільки в кінці слова не передує інше s.

Технічні характеристики

  • Слово визначається як послідовність літер в abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.
  • Усі слова матимуть щонайменше дві літери.
  • Вхід складається лише з символів для друку ASCII (U + 0020 - U + 007E).
  • Не буде зустрічатися більше двох поспіль s. Тобто, sssне буде підрядком вводу.

Тестові шафи

Окремі слова:

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_

Весь абзац:

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 хеш виходу останнього TestCase є:

5641899e7d55e6d1fc6e9aa4804f2710e883146bac0e757308afc58521621644

Відмова від відповідальності

Орфографія Medievall не є таким контент. Просимо не скаржитися, якщо ти маєш старі книги з іншою орфографією.


1
"Ви можете використовувати f замість ſ у висновку." Тому в основному немає стимулів використовувати to, оскільки це займає більше байтів.
Фаталізувати

1
@Fatalize Fair point. Вилучили цю.
Leaky Nun

@LeakyNun Чи можемо ми тоді рахувати ſяк 1 байт?
Р. Кап

насправді стимул у вигляді ff змінюється на fs в деяких алгоритмах, якщо ſ не використовувався
руйнівний лимон

1
Не повинні Super-viseстати Super-viſe?
Р. Кап

Відповіді:


3

СЕД, 144 140 111 байт

збережено 29 байт завдяки 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'

1
Ти хоробрий, хоробрий душе.
Олександр - Відновіть Моніку

Ви можете вирізати багато байт, використовуючи лише 1 -e. Використовуйте ;s проміжних операторів.
NoOneIsHere

Я не знав, що ти можеш це зробити. Дякую!!
Райлі

2

Python 3 ( 128 126 байт)

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)почувається надмірним, щоб набрати односимвольну струну, але, можливо, справжній піфоніст може запропонувати гольф. Однак це дуже зручно, що ^3достатньо для обміну i <-> jта u <-> v.

Примітка. Єдине, що вимагає Python 3, це символ Unicode: Python 2 скаржиться Non-ASCII character '\xc5' <snip> but no encoding declared.


Не слід використовувати, \bоскільки він \bвикористовує визначення слова, яке включає цифри та підкреслення.
Leaky Nun

@LaakyNun, хм. Поки я шукаю виправлення, чи можете ви додати кілька тестових випадків?
Пітер Тейлор

@ R.Kap. (?i).
Пітер Тейлор

@PeterTaylor Зачекайте, що це робить?
Р. Кап

@ R.Kap, це робить регекс нечутливим до справи.
Пітер Тейлор


1

Python 3.5, 124 116 111 118 125 144 142 байт:

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)

Ну, це здається ідеальною роботою для регулярних виразів !


1
Ви можете використовувати J|jзамість[Jj]
Leaky Nun

1

JavaScript (ES6), 154

Використання parseInt для ідентифікації алфавітних символів. Примітка: випадково, але на щастя 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``

Менше гольфу

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

Тест

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 байт

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

Пояснення: Оскільки JavaScript regexp не має відставання, я замість цього розбиваю рядок на слова, що дозволяє мені використовувати ^і \Bяк негативні, і позитивні літери. ssвирішується шляхом зіставлення окремо, дещо незграбним виразом заміни, який займає менше байтів, ніж заміщення лише першого символу cабо додавання додаткового sдо обох рядків та використання відповідної підрядки.


c=>"iIvVuUſ"["jJuUvVs".search(c)]||"ſs"гарний. 👍🏻
Йордан


0

Ruby, 85 + 1 = 86 байт

Виконати з ruby -p(+1 байт для pпрапора). Здійснює введення на stdin.

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

Запустіть тести на ideone (загорнута в лямбда там, тому що ви не можете дати прапори ideone): http://ideone.com/AaZ8ya

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.