月曜日のミニゴルフ#6:Meeesesessess upp teeexexextext


48

月曜日のミニゴルフ:毎週月曜日に(願わくば!)投稿された一連の短いチャレンジ。

実話1:先日、JavaScriptをテストするためにPCで通常使用するページにアクセスすることを考えていたときに、タブレットで遊んでいた。ページが読み込まれた後、次の簡単なプログラムを入力しました。

alert("Hello!")

その後、[実行]ボタンを押して、入力したコードが無効であると言われたときは驚きました。私はテキストボックスをもう一度見て、これを見ました:

alllelelerlerlertlert("Heeelelellellelloello!")

え?それは私が入ったものではありません!それで、ここで何が起こったのでしょうか?それを理解するために、2つの簡単な行を入力しました。

abcdefg
0123456

これは次のように判明しました。

abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
0112123123412345123456

今では、文字に何が起こったのかまだ分かりませんでしたが、数字はもっとシンプルに見えたので、詳しく調べました。判明したように、Webページは最初の文字を入力し、新しい文字が押されるたびに文字列の残りすべてを繰り返していました。

0112123123412345123456
0
 1
  12
    123
       1234
           12345
                123456

しかし、手紙のセクションはどうですか?少し考えた後、それはまったく同じであることに気づきましたが、各サブセクションを1回繰り返す代わりに、2回繰り返します。

abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
a
 bb
   bcbc
       bcdbcd
             bcdebcde
                     bcdefbcdef
                               bcdefgbcdefg

2つの組み合わせは、これらの手法の組み合わせで機能します。

abc123z
abbbcbcbc1bc12bc123bc123zbc123z
a
 bb
   bcbc
       bc1
          bc12
              bc123
                   bc123zbc123z

どのようなグリッチはそう、これは句読点やスペースでリセットすると思われる原因とabc defなりましたabbbcbc deeefef

この時点までに、私はそれを理解し、それを興味深い挑戦に変えることに夢中になっていたので、そもそもそこにいた理由を忘れていました。(ただし、通常の入力方法を考えました。すべての文字の後にスペースとバックスペースを押します。かなり退屈ですが、やらなければならないことをしなければなりません。)

チャレンジ

チャレンジの目標は、処理されるテキストを取り込み、上記の変更を行い、結果を出力/返すプログラムまたは関数を作成することです。

詳細

  • 入力には印刷可能なASCIIのみが含まれ、タブや改行は含まれません。

テストケース

入力:(1行に1つ)

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日の次の月曜日に選ばれます。

編集:そして勝者は... @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

使用クロームデベロッパーツールの
kirbyfan64sos

@TheDoctor私の答えの編集履歴をチェックしてください:P
ベータ崩壊

1
@BetaDecay偉大な心は同様に考える;)
TheDoctor

inb4誰かが実際にこのように入力しなければならない言語を作成します。
DJgamer98

回答:


13

網膜、43バイト

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

-sフラグを使用して単一のファイルからコードを実行します。これは単一の正規表現の置換であるため、ここでテストできます([コンテキスト]タブをクリックして結果を確認します)。

説明

これは、実行の最初ではない数字と文字に一致します。一方で.、任意の非改行文字を一致させることができ、lookbehindsは、他の条件を確認してください。

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

これは、の後の位置から後方に一致し.ます。まず、それがグループに1文字以上の英数字とキャプチャそれらが一致する1([^_\W]+)。これにより.、が英数字自体に対応することがすぐに保証されます。次に、追加[^_\W]により、現在の実行にもう1つ英数字があることを確認しますが、一致含まれません。ここで、グループ1は、数字である場合に一致を置き換えるものです-文字である場合、この文字列を2回置き換えます。そこで、2番目のルックビハインドが機能します。

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

これはオプションであるため、失敗しても一致にはまったく影響しません。最初に.が経由で数字ではないことを確認し(?<=\D)ます。したがって、この後読みは、文字を照合する場合にのみ関連します。その場合、グループを\1もう一度一致させます(同じ位置からグループをキャプチャしたため、これは常に一致します)が、グループにキャプチャし2ます。

したがって、単に正規表現を両方のグループのコンテンツに置き換えます($1$2)。一致が数字の場合、$2空のままであり、プレフィックスを1回だけ書き戻します。それが手紙だった場合$2、と同じであり、$12回書き戻します。


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=''))

私はこれをダウンさせる方法がわかりません...

reduce関数の1バイトゴルフの正規表現とETHproductionsをゴルフダウンしてくれたMwir247に感謝します


これを正規表現に使用します:/[^_\W]+/g(3文字を保存)
-Mwr247

私はこれが.reduce機能に(a,e)=>a+=(y+=e,++e?y:y+y)
役立つ

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これだけを使うとは思いませんでした。

すでにここ半分仕事をしてあまりにも悪いものをインポートする必要が(isDigitisAlphainits)。


2
そうでlang-hsはありませんlang-haskell。指定するlang-haskellと、おそらくデフォルトの蛍光ペンを使用することになります。
バクリウ

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

ハスケル、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. 無効な文字にヒットすると、逆の入力で質問の変換を行います。質問の変換はreverse.g.reverseですが、すでに反転されているため、単にreverse.gを実行します。

私はどういうわけか冗長な括弧を保持します。


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.)。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.