星期一迷你高尔夫#6:Meeesesessss upp teeexexextext


48

星期一迷你高尔夫:每周一发布(希望!)一系列简短的挑战赛。

真实故事1:前几天,当我有想法去访问我通常在PC上用于测试JavaScript 的页面时,我正在平板电脑上玩耍。页面加载后,我输入了以下简单程序:

alert("Hello!")

然后,我继续按Execute按钮,当它告诉我输入的代码无效时,我感到很惊讶。我再次查看了文本框,并看到了以下内容:

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提交的提交首先达到其最终字节数。获胜者将在11月2日下周一chosen选。祝您好运!

编辑:赢家是... @MartinBüttner使用视网膜提供了令人难以置信的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 2015年

咳嗽使用Chrome DevTools 咳嗽
kirbyfan64sos

@TheDoctor查看我答案的编辑历史记录:P
Beta Decay,

1
@BetaDecay伟大的思想家也是如此;)
TheDoctor 2015年

inb4是某人制作的一种语言,实际上您必须像这样键入。
DJgamer98 2015年

Answers:


13

视网膜,43字节

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

从带有-s标志的单个文件运行代码。由于这只是单个正则表达式替换,因此您可以在此处进行测试(单击“上下文”选项卡以查看结果)。

说明

这匹配不是运行中第一位的任何数字和字母。尽管.可以匹配任何非换行符,但后面的条件可确保其他条件:

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

后面的位置向后匹配.。首先,它匹配一个或多个字母数字字符,并将其捕获到组1([^_\W]+)。这立即确保.对应于字母数字字符本身。然后,附加功能[^_\W]可确保当前运行中还有一个字母数字字符,我们包括匹配项。现在group 1是我们要替换的匹配项,如果它是一个数字-如果它是一个字母,我们想用此字符串的两倍替换它。这就是后面的第二个场景起作用的地方:

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

这是可选的,因此,如果失败,则完全不会影响比赛。它首先可以确保.没有通过一个数字(?<=\D)-所以这个回顾后才有意义,当我们相匹配的字母。在这种情况下,我们将\1再次匹配组(这始终匹配,因为我们已经从同一位置捕获了该组),但是将其捕获到group中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 2015年

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 2015年

5

Haskell,215200字节

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这么用。

太糟糕了,已经在这里做了一半的工作的东西需要进口(isDigitisAlphainits)。


2
这是lang-hs不是lang-haskell。通过指定lang-haskell它可能最终会使用默认的荧光笔。
2015年

3

Gema,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,183181字节

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检查其是否与原始字符字符串相等的逻辑。)但是,此过程会忽略第一个字符,因此我们必须在其后添加(a@0.)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.