Средневековая орфография

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не будет подстрокой ввода.

Testcases

Отдельные слова:

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 вместо ſ ​​в выводе». Так что в основном нет стимула использовать ſ, так как это занимает больше байтов.
Fatalize
1
@Fatalize Fair point. Убрал тот.
Утренняя монахиня
@LeakyNun Можем ли мы считать ſ1 байт?
Р. Кап
на самом деле есть стимул в виде замены ff на fs в некоторых алгоритмах, если ſ не использовался
Destructible Lemon
1
Не должно Super-viseстать Super-viſe?
Р. Кап

Ответы:

3

САС, 144 140 111 байт

благодаря NoOneIsHere сэкономлено 29 байт

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

NB. Единственное, что здесь требует Python 3 - это символ Unicode: Python 2 жалуется Non-ASCII character '\xc5' <snip> but no encoding declared.

Питер Тейлор
источник
Вы не должны использовать, \bтак как \bиспользует определение слова, которое включает цифры и подчеркивания.
Утренняя монахиня
@ LeakyNun, хм. Пока я ищу исправление, не могли бы вы добавить несколько тестов?
Питер Тейлор
@ 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>

edc65
источник
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 регулярного выражение не имеет никакого просмотра назад, я вместо того, чтобы разбить строку на слова, которые затем позволяет мне использовать ^и в \Bкачестве отрицательного и положительных буквенного просмотра назад. ssрешается путем сопоставления по отдельности, с немного неуклюжим выражением замены, которое занимает меньше байтов, чем либо замена только первого символа cили добавление дополнительного sк обеим строкам и использование соответствующей подстроки.

Нил
источник
c=>"iIvVuUſ"["jJuUvVs".search(c)]||"ſs"это мило. J
Иордания
0

CJam ( 89 88 байт)

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

Онлайн демо

Я никогда не понимал, почему в CJam нет регулярных выражений, но поскольку здесь нет решения, которое их не использует.

Питер Тейлор
источник
0

Рубин, 85 + 1 = 86 байт

Запуск с ruby -p(+1 байт для pфлага). Принимает вход на стандартный ввод.

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

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

Иордания
источник