Понеділок Міні-Гольф №6: Meeesesessess upp teeexexextext


48

Понеділок Міні-Гольф: Серія коротких викликів з , що публікуються (сподіваємось!) Щопонеділка.

Справжня історія 1 : Днями я грав на своєму планшеті, коли мені виникла ідея відвідати сторінку, яку я зазвичай використовую на своєму ПК для тестування JavaScript. Після завантаження сторінки я ввійшов у цю просту програму:

alert("Hello!")

Потім я продовжив натискання кнопки "Виконати" і здивувався, коли сказав мені, що код, який я ввів, недійсний. Я поглянув на другий текст і побачив таке:

alllelelerlerlertlert("Heeelelellellelloello!")

Чого ??? Це не те, що я ввійшов! То що ж тут сталося? Щоб зрозуміти це, я ввів два простих рядки:

abcdefg
0123456

Виявилося так:

abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
0112123123412345123456

На сьогоднішній день я досі не мав уявлення про те, що сталося з літерами, але цифри здавалися простішими, тому я придивився уважніше. Як виявилося, веб-сторінка просто вводила перший символ, а потім повторювала всі інші в рядку щоразу, коли натискали нову:

0112123123412345123456
0
 1
  12
    123
       1234
           12345
                123456

А як щодо розділів листів? Поміркувавши хвилину, я зрозумів, що це саме те саме, але замість того, щоб повторити кожен підрозділ один раз, він повторює його двічі :

abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
a
 bb
   bcbc
       bcdbcd
             bcdebcde
                     bcdefbcdef
                               bcdefgbcdefg

Поєднання двох творів із поєднанням цих прийомів:

abc123z
abbbcbcbc1bc12bc123bc123zbc123z
a
 bb
   bcbc
       bc1
          bc12
              bc123
                   bc123zbc123z

Що б не викликало збої, це, мабуть, скидається на пунктуацію та пробіли, так і abc defстає abbbcbc deeefef.

До цього моменту я настільки захопився з'ясувати це і перетворити його на цікавий виклик, що я забув, чому я вперше був там. (Однак я зрозумів, як правильно вводити текст: натискання клавіші пробіл після кожного символу. Досить нудно, але ти повинен робити те, що ти повинен зробити.)

Виклик

Мета завдання - написати програму або функцію, яка займає оброблюваний текст, вносить зміни, перелічені вище, та виводить / повертає результат.

Деталі

  • Вхід буде містити тільки файл для друку ASCII, а також ніякі вкладки та нові рядки.

Тестові кейси

Введення: (по одному на рядок)

Mess up text
This is some longer text.
CAPS LOCK && "Punc-tua"+'tion'
under_score_style
CaPs wItHIn loWERs
1337 numb3r5
abcdefghij 0123456789
Code-golf is the best!

Виходи:

Meeesesessess upp teeexexextext
Thhhihihishis iss sooomomomeome looononongongongeongeongeronger teeexexextext.
CAAAPAPAPSAPS LOOOCOCOCKOCK && "Puuunununcunc-tuuuaua"+'tiiioioionion'
unnndndndendendernder_scccococorcorcorecore_stttytytyltyltyletyle
CaaaPaPaPsaPs wIIItItItHItHItHIItHIItHInItHIn loooWoWoWEoWEoWERoWERoWERsoWERs
1333337 nuuumumumbumbumb3umb3rumb3rumb3r5
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefgbcdefghbcdefghbcdefghibcdefghibcdefghijbcdefghij 0112123123412345123456123456712345678123456789
Cooodododeode-gooolololfolf iss thhhehe beeesesestest!

Оцінка балів

Це , тому найкоротший дійсний код у байтах виграє. Tiebreaker переходить до подання, яке першим дійшло до остаточного підрахунку байт. Переможець буде обраний наступного понеділка, 2 листопада. Удачі!

Редагувати: І переможець ... @ MartinBüttner використовуючи Retina для неймовірного 43-байтового рішення!

1 Так, ця історія цілком правдива, і якщо вам потрібно додаткові роз'яснення, див. Виноску 1.


1
Це правило пунктуації ...' '.join(x[0]+''.join(2*x[1:i]for i in range(1,len(x)+1)) for x in raw_input().split())
TheDoctor

кашель Використовуйте Chrome DevTools кашель
kirbyfan64sos

@TheDoctor Ознайомтеся з історією редагування моєї відповіді: P
Beta Decay

1
@BetaDecay великі уми думають однаково;)
TheDoctor

inb4 хтось створює мову, де ви насправді повинні вводити так
DJgamer98

Відповіді:


13

Сітківка , 43 байти

.(?<=[^_\W]([^_\W]+))(?<=(\1)(?<=\D))?
$1$2

Запустіть код з одного файлу з -sпрапором. Оскільки це лише одна заміна регексу, ви можете протестувати її тут (натисніть вкладку Контекст, щоб побачити результати).

Пояснення

Це збігається з будь-якою цифрою та буквою, яка не є першою в пробігу. Незважаючи на те, що вони .можуть відповідати будь-яким персонажам, що не передаються в режимі безперервного годування, реферати забезпечують інші умови:

(?<=[^_\W]([^_\W]+))

Це відповідає в зворотному напрямку від позиції після .. По- перше це відповідає одному або більше алфавітно - цифрових символів і захоплює їх в групу 1з ([^_\W]+). Це негайно забезпечує .відповідність буквено-цифрового символу. Тоді додаткове [^_\W]переконує в тому, що в поточному циклі є ще один буквено-цифровий символ, який ми не включаємо в збіг. Тепер групою 1є те, на що ми хочемо замінити відповідність, якщо воно є цифрою - якщо це літера, ми хочемо замінити її вдвічі більше цього рядка. Ось де починає грати другий погляд позаду:

(?<=(\1)(?<=\D))?

Цей варіант необов’язковий, тому, якщо він не вдасться, він взагалі не вплине на матч. Це перший гарантує , що .була НЕ цифра через (?<=\D)- так це з переглядом тому актуальна тільки коли ми погоджують листи. У цьому випадку ми \1знову порівнюємо групу (це завжди відповідає, тому що ми захопили групу з тієї ж позиції), але фіксуємо її у групі 2.

Отже, ми просто замінюємо регулярний вираз вмістом обох груп ( $1$2). Якщо відповідність була цифрою, $2все одно буде порожньо, і ми запишемо префікс лише один раз. Якщо це був лист, $2це те саме, що $1ми пишемо його двічі назад.


8

JavaScript (ES6) 82

Використовуючи оптимізацію регулярного виразу, запропоновану Mwr247

s=>s.replace(/([\W_])|./g,(x,y)=>y?(f=0,x):f?(p+=x,p+(-x-1?z:p)):(p=z,f=x),f=z='')

Випробуйте запуск фрагмента нижче в будь-якому недавньому веб-переглядачі

F=s=>s.replace(/([\W_])|./g,(x,y)=>y?(f=0,x):f?(p+=x,p+(-x-1?z:p)):(p=z,f=x),f=z='')

// document.write(F(prompt('Insert string')))

// TEST
console.log=x=>O.innerHTML+=x+'\n'

function test()
{
  O.innerHTML=F(I.value)
}

;[
 ['Mess up text','Meeesesessess upp teeexexextext']
,['This is some longer text.',
  'Thhhihihishis iss sooomomomeome looononongongongeongeongeronger teeexexextext.']
,['CAPS LOCK && "Punc-tua"+\'tion\'',
  'CAAAPAPAPSAPS LOOOCOCOCKOCK && "Puuunununcunc-tuuuaua"+\'tiiioioionion\'']
,['CaPs wItHIn loWERs'
  ,'CaaaPaPaPsaPs wIIItItItHItHItHIItHIItHInItHIn loooWoWoWEoWEoWERoWERoWERsoWERs']
,['1337 numb3r5','1333337 nuuumumumbumbumb3umb3rumb3rumb3r5']
,['abcdefghij 0123456789'
 ,'abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefgbcdefghbcdefghbcdefghibcdefghibcdefghijbcdefghij 0112123123412345123456123456712345678123456789']
,['Code-golf is the best!'
  ,'Cooodododeode-gooolololfolf iss thhhehe beeesesestest!']
].forEach(t => (
  i=t[0],x=t[1],r=F(i),
  console.log('Test ' + (r==x?'OK':'Fail')+'\nInput:  '+i+'\nResult: '+r+'\nCheck:  '+x+'\n')
))
#I { width: 50% }
Your test<input id=I><button onclick="test()">-></button>
<pre id=O></pre>


Свята корова! Ось так інакше (і краще), ніж я б це зробив (подібно до підходу n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̸̨̡̅ẗ̵̨d̷̰̀ĥ̷̳). +1
ETHproductions

7

JavaScript (ES6), 92 88 87

f=>f.replace(/[^_\W]+/g,m=>m[0]+[...m].slice(1).reduce((a,e)=>a+=(y+=e,++e?y:y+y),y=''))

Я поняття не маю, як це в гольф ...

Дякую Mwir247 за регекс для гольфу та ETHproductions за один байт-гольф у функції зменшення .


Використовуйте це для свого регулярного вираження: /[^_\W]+/g(зберігає 3 символи)
Mwr247,

Я вважаю, що це спрацювало б для .reduceфункції: (a,e)=>a+=(y+=e,++e?y:y+y)(1 байт коротше)
ETHproductions

5

Haskell, 215 200 байт

import Data.List
import Data.Char
c=concatMap
p c=[isDigit c,isAlpha c]
r(Just n)=c id.replicate(n+1)
r _=id
f(h:t)=h:(c(\s->r(findIndex id.p$last s)s).tail.inits)t
m=c f.groupBy(\a b->or$p a==or$p b)

Це безлад.

Весело читаючи всі дивні химерності, я ніколи не думав, що цим буду користуватися id.

Шкода , що матеріал , який вже робить половину роботи тут необхідно імпортувати ( isDigit, isAlpha, inits).


2
Це lang-hsне так lang-haskell. Вказавши lang-haskellйого, ймовірно, закінчується використання маркера за замовчуванням.
Бакуріу

3

Гема, 57 символів

\X?=?@set{s;}
<D1>=@append{s;$0}$s
<L1>=@append{s;$0}$s$s

Проба зразка:

bash-4.3$ gema '\X?=?@set{s;};<D1>=@append{s;$0}$s;<L1>=@append{s;$0}$s$s' <<< '1337 numb3r5'
1333337 nuuumumumbumbumb3umb3rumb3rumb3r5

3

Haskell, 183 181 байт

import Data.Char
b(x:y)|h x=x:c[]y|2>1=x:b y
b[]=[]
h y=isDigit y||isAlpha y
c x l@(y:z)|h y=c(y:x)z|2>1=c x[]++b l
c x[]=reverse$g$x
g[]=[]
g a@(x:y)|isDigit x=a++g y|2>1=a++a++g y

Використання:

b"Hello, world!"
>"Heeelelellellelloello, wooorororlorlorldorld!"

Не знаю, чи суттєво відрізняється відповідь Лейфа Віллертса. Але ось алгоритм.

  1. Пошук дійсного листа (літера чи цифра)
  2. Якщо це лист, почніть збирати лист. Однак він зберігається зворотно, зробіть рядок зворотним. І перший пункт пропущено.
  3. Як це недійсне письмо, перетворіть питання із зворотним введенням. Перетворення питання є зворотним

Я якось тримаю дужки з думками.


0

T-SQL, 357 байт

create proc x(@s varchar(99),@z int=0,@i int=0,@y varchar(99)='',@x varchar(99)='',@w varchar(99)='') as

while LEN(@s)>0
begin
    select @z=patindex('%[^0-z]%',@s+' '),@i=1,@w+=LEFT(@s,1)
    while @i<@z-1
    begin
        select @y=SUBSTRING(@s,2,@i)
        ,@x+=@y            
        ,@i+=1
        if @y like'%[a-z]'set @x+=@y
    end
select @w+=@x+SUBSTRING(@s,@z,1)
        ,@x=''
        ,@s=REPLACE(@s,left(@s,@z),'')
end

select @w

наприклад: exec x(@s='1337 numb3r5') повертає1333337 nuuumumumbumbumb3umb3rumb3rumb3r5


0

Пітон 2, 131 байт

i=raw_input();s=r='';g=1
for c in i:
 s+=c
 if g:r+=c;g=0;s=''
 elif c.isalpha():r+=s*2
 elif '/'<c<':':r+=s
 else:g=1;r+=c
print r

Проводиться через символи та зберігає / повторює, якщо потрібно.


0

Піп, 41 байт

aR`[^_\W]+`{Y0a@0.Ya@{1,++y}X2-(_Q+_)MJa}

Приймає текст як аргумент командного рядка. Для заміни всіх алфавітно-цифрових прогонів ( [^_\W]+) функцією зворотного дзвінка ми використовуємо форму заміни . Ця функція відображає іншу функцію для кожного символу слова, генеруючи прогресивно більший запуск символів (із глобальною змінною, yщо відстежує індекс) і повторює їх X2, якщо символ не є числом. (Логіка, за якою використовується +для перетворення в число, а потім Qдля перевірки, чи це рядок рівний початковому символу.) Цей процес залишає перший символ, однак, ми мусимо його додати далі ( a@0.).


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