월요일 미니 골프 # 6 : Meeesesessess upp teeexexextext


48

Monday Mini-Golf : 매주 월요일에 게시 되는 일련의 짧은 과제입니다.

실화 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 일 월요일에 선발됩니다. 행운을 빌어 요!

편집 : 그리고 우승자는 ... @ MartinBüttner 는 놀라운 43 바이트 솔루션에 Retina 를 사용 합니다!

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

기침 크롬 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)우리가 편지를 일치 할 때 그래서이 lookbehind는 관련이 있습니다 -. 이 경우 그룹을 \1한 번 더 일치시킵니다 (동일한 위치에서 그룹을 캡처했기 때문에 항상 일치 함) 2.

따라서 정규식을 두 그룹의 내용으로 간단히 대체합니다 ( $1$2). 일치하는 숫자 인 $2경우에도 여전히 비어 있으며 접두사를 한 번만 다시 작성합니다. 문자 인 $2경우와 같 $1으며 두 번 다시 씁니다.


8

자바 스크립트 (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

자바 스크립트 (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=''))

골프를하는 방법을 모르겠습니다 ...

감소 된 기능의 1 바이트 골프에 대한 골프 다운 정규식 및 ETHproduction에 감사드립니다 .


정규식에 이것을 사용하십시오 : /[^_\W]+/g(3 문자 절약)
Mwr247

나는 이것이 .reduce기능을 위해 작동 할 것이라고 믿는다 : (a,e)=>a+=(y+=e,++e?y:y+y)(1 byte
shorter

5

하스켈, 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. 나는 이것을 많이 사용할 것이라고 생각하지 않았습니다 .

여기에 이미 절반 작업을 수행 너무 나쁜 물건 (가져와야 isDigit, isAlpha, inits).


2
그것은이다 lang-hs없습니다 lang-haskell. lang-haskell이를 지정 하면 기본 형광펜을 사용하게됩니다.
Bakuriu

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

하스켈, 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!"

Leif Willerts의 답변과 본질적으로 다른지 모릅니다. 그러나 여기 알고리즘이 있습니다.

  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

파이썬 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.