Понедельник Мини-гольф № 6: Meeesesessess upp teeexextext


48

Мини-гольф по понедельникам: серия коротких соревнований по , публикуемых (надеюсь!) Каждый понедельник.

Правдивая история 1 : На днях я играл на своем планшете, когда у меня появилась идея посетить страницу, которую я обычно использую на своем ПК, для тестирования JavaScript. После загрузки страницы я вошел в эту простую программу:

alert("Hello!")

Затем я продолжил нажимать кнопку «Выполнить» и был удивлен, когда мне сказали, что введенный мною код недействителен. Я еще раз взглянул на текстовое поле и увидел это:

alllelelerlerlertlert("Heeelelellellelloello!")

Wha ??? Это не то, что я вошел! Так что здесь произошло? Чтобы понять это, я ввел две простые строки:

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флагом. Поскольку это всего лишь одна подстановка регулярных выражений, вы можете проверить ее здесь (щелкните вкладку «Контекст», чтобы увидеть результаты).

объяснение

Это соответствует любой цифре и букве, которая не является первой в серии. В то время как .может соответствовать любому символу, не являющемуся переводом строки, lookbehinds обеспечивают другие условия:

(?<=[^_\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 за регулярное выражение в гольфе и ETH-продуктам для однобайтового гольфа в функции снижения .


Используйте это для своего регулярного выражения: /[^_\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

Python 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для проверки, равно ли оно строковому значению по сравнению с исходным символом.) Однако этот процесс исключает первый символ, поэтому мы должны добавить его в afterward ( a@0.).


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.