Thứ hai Mini-Golf # 6: Meeesesessess upp teeexexextext


48

Thứ hai Mini-Golf: Một loạt các thử thách ngắn , được đăng (hy vọng!) Vào mỗi thứ Hai.

Câu chuyện có thật 1 : Một ngày khác, tôi đang chơi xung quanh máy tính bảng của mình khi tôi có ý tưởng truy cập trang tôi thường sử dụng trên PC để kiểm tra JavaScript. Sau khi tải trang, tôi đã nhập chương trình đơn giản này:

alert("Hello!")

Sau đó tôi đã tiến hành nhấn nút Thực thi và rất ngạc nhiên khi nó nói với tôi rằng mã tôi đã nhập không hợp lệ. Tôi đã nhìn lần thứ hai vào hộp văn bản và thấy điều này:

alllelelerlerlertlert("Heeelelellellelloello!")

Cái gì ??? Đó không phải là những gì tôi đã nhập! Vậy chuyện gì đã xảy ra ở đây? Để tìm ra nó, tôi đã nhập hai dòng đơn giản:

abcdefg
0123456

Điều này hóa ra là:

abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
0112123123412345123456

Đến bây giờ, tôi vẫn không có manh mối về những gì đã xảy ra với các chữ cái, nhưng các con số có vẻ đơn giản hơn, vì vậy tôi đã xem xét kỹ hơn. Khi nó bật ra, trang web chỉ cần nhập ký tự đầu tiên, sau đó lặp lại tất cả phần còn lại trong chuỗi mỗi lần nhấn một ký tự mới:

0112123123412345123456
0
 1
  12
    123
       1234
           12345
                123456

Nhưng những gì về các phần của chữ? Sau khi suy nghĩ một phút, tôi nhận ra rằng nó giống nhau, nhưng thay vì lặp lại mỗi phần phụ một lần, nó lặp lại hai lần :

abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
a
 bb
   bcbc
       bcdbcd
             bcdebcde
                     bcdefbcdef
                               bcdefgbcdefg

Một sự kết hợp của hai tác phẩm với sự kết hợp của các kỹ thuật này:

abc123z
abbbcbcbc1bc12bc123bc123zbc123z
a
 bb
   bcbc
       bc1
          bc12
              bc123
                   bc123zbc123z

Bất cứ điều gì trục trặc gây ra điều này dường như thiết lập lại tại dấu câu và dấu cách, vì vậy abc deftrở thành abbbcbc deeefef.

Đến lúc này, tôi đã mải mê tìm hiểu và biến nó thành một thử thách thú vị đến nỗi tôi quên mất tại sao tôi lại ở đó ngay từ đầu. (Tuy nhiên, tôi đã tìm ra cách gõ bình thường: nhấn phím cách lùi không gian sau mỗi ký tự. Khá tẻ nhạt, nhưng bạn phải làm những gì bạn phải làm.)

Thử thách

Mục tiêu của thử thách là viết một chương trình hoặc chức năng đưa vào văn bản cần xử lý, thực hiện các thay đổi được liệt kê ở trên và xuất / trả kết quả.

Chi tiết

  • Đầu vào sẽ chỉ chứa ASCII có thể in và không có tab hoặc dòng mới.

Các trường hợp thử nghiệm

Đầu vào: (một trên mỗi dòng)

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!

Đầu ra:

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!

Chấm điểm

Đây là , vì vậy mã hợp lệ ngắn nhất tính bằng byte thắng. Tiebreaker đi đến trình mà đạt đến số byte cuối cùng của nó đầu tiên. Người chiến thắng sẽ được chọn vào thứ Hai tới, ngày 2 tháng 11. Chúc may mắn!

Chỉnh sửa: Và người chiến thắng là ... @ MartinBüttner sử dụng Retina cho một giải pháp 43 byte đáng kinh ngạc !

1 Có, câu chuyện này là hoàn toàn có thật, và nếu bạn cần làm rõ thêm, xem chú thích 1.


1
Đó là quy tắc chấm câu ...' '.join(x[0]+''.join(2*x[1:i]for i in range(1,len(x)+1)) for x in raw_input().split())
TheDoctor

ho Sử dụng Chrome DevTools ho
kirbyfan64sos

@TheDoctor Kiểm tra lịch sử chỉnh sửa câu trả lời của tôi: P
Beta Decay

1
@BetaDecay những bộ óc vĩ đại nghĩ giống nhau;)
TheDoctor

inb4 ai đó tạo ra một ngôn ngữ mà bạn thực sự phải gõ như thế này.
DJgamer98

Câu trả lời:


13

Võng mạc , 43 byte

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

Chạy mã từ một tệp duy nhất với -scờ. Vì đây chỉ là một thay thế regex duy nhất, bạn có thể kiểm tra nó ở đây (nhấp vào tab Bối cảnh để xem kết quả).

Giải trình

Điều này phù hợp với bất kỳ chữ số và chữ cái không phải là đầu tiên trong một lần chạy. Mặc dù .có thể khớp với bất kỳ ký tự không phải dòng nào, nhưng giao diện đảm bảo các điều kiện khác:

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

Điều này phù hợp ngược từ vị trí sau .. Đầu tiên, nó khớp với một hoặc nhiều ký tự chữ và số và bắt chúng thành nhóm 1với ([^_\W]+). Điều này ngay lập tức đảm bảo rằng .tương ứng với chính một ký tự chữ và số. Sau đó, phần bổ sung [^_\W]đảm bảo rằng có thêm một ký tự chữ và số trong lần chạy hiện tại mà chúng tôi không bao gồm kết quả khớp. Bây giờ nhóm 1là những gì chúng ta muốn thay thế khớp bằng nếu nó là một chữ số - nếu đó là một chữ cái chúng ta muốn thay thế nó bằng hai lần chuỗi này. Đó là nơi mà cái nhìn thứ hai phát huy tác dụng:

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

Cái này là tùy chọn, vì vậy nếu thất bại, nó sẽ không ảnh hưởng đến trận đấu. Nó đảm bảo đầu tiên mà .không một chữ số thông qua (?<=\D)- vì vậy lookbehind này chỉ liên quan khi chúng ta chữ phù hợp. Trong trường hợp đó, chúng tôi khớp nhóm \1một lần nữa (điều này luôn khớp, bởi vì chúng tôi đã bắt nhóm từ cùng một vị trí), nhưng bắt nhóm thành nhóm 2.

Do đó, chúng tôi chỉ cần thay thế regex bằng nội dung của cả hai nhóm ( $1$2). Nếu trận đấu là một chữ số, $2vẫn sẽ trống và chúng tôi chỉ viết lại tiền tố một lần. Nếu đó là một lá thư, $2cũng giống như $1và chúng tôi viết lại hai lần.


8

JavaScript (ES6) 82

Sử dụng tối ưu hóa regrec được đề xuất bởi 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='')

Kiểm tra chạy đoạn mã dưới đây trong bất kỳ trình duyệt gần đây

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>


Bò thần! Điều đó khác biệt (và tốt hơn) so với cách tôi đã làm (tương tự như cách tiếp cận của n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳). +1
Sản phẩm ETH

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

Tôi không biết làm thế nào để đánh gôn này ...

Cảm ơn Mwir247 cho regex xuống và ETHproductions cho golf một byte trong chức năng giảm .


Sử dụng điều này cho regex của bạn: /[^_\W]+/g(lưu 3 ký tự)
Mwr247

Tôi tin rằng điều này sẽ hoạt động cho .reducechức năng: (a,e)=>a+=(y+=e,++e?y:y+y)(ngắn hơn 1 byte)
ETHproductions

5

Haskell, 215 200 byte

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)

Đó là một mớ hỗn độn.

Hãy vui vẻ đọc tất cả các quirks kỳ lạ, tôi không bao giờ nghĩ rằng tôi sẽ sử dụng idnhiều như vậy.

Quá xấu những thứ mà đã làm một nửa công việc ở đây cần phải được nhập khẩu ( isDigit, isAlpha, inits).


2
Không lang-hsphải vậy lang-haskell. Bằng cách chỉ định lang-haskellnó có thể kết thúc bằng cách sử dụng một công cụ tô sáng mặc định.
Bakuriu

3

Gema, 57 ký tự

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

Chạy mẫu:

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 byte

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

Sử dụng:

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

Không biết nó có cơ bản khác với câu trả lời của Leif Willerts không. Nhưng đây là thuật toán.

  1. Tìm kiếm thư hợp lệ (Thư hoặc Num)
  2. Nếu nó thư, bắt đầu thu thập thư. Tuy nhiên, nó được lưu trữ ngược lại, làm cho chuỗi đảo ngược. Và mục đầu tiên được bỏ qua.
  3. Khi nó nhấn chữ không hợp lệ, hãy thực hiện chuyển đổi câu hỏi với đầu vào đảo ngược. Biến đổi của câu hỏi là Reverse.g.reverse, nhưng vì nó đã bị đảo ngược, nên chúng ta chỉ cần làm ngược lại.

Tôi bằng cách nào đó giữ dấu ngoặc đơn.


0

T-SQL, 357 byte

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

ví dụ: exec x(@s='1337 numb3r5') trả về1333337 nuuumumumbumbumb3umb3rumb3rumb3r5


0

Python 2, 131 byte

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

Vòng lặp thông qua các ký tự và lưu / lặp lại nếu cần.


0

Pip, 41 byte

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

Lấy văn bản làm đối số dòng lệnh. Chúng tôi sử dụng thay thế regex để thay thế tất cả các chữ chạy số ( [^_\W]+) bằng hàm gọi lại. Hàm này ánh xạ một chức năng khác đến từng ký tự của từ, tạo ra các chuỗi ký tự lớn hơn (với biến toàn cục ytheo dõi chỉ số) và lặp lại chúng X2 nếu ký tự không phải là số. (Logic sử dụng +để chuyển đổi thành một số và sau đó Qđể kiểm tra xem đây có phải là chuỗi bằng với ký tự gốc hay không.) Tuy nhiên, quá trình này bỏ đi ký tự đầu tiên, vì vậy chúng ta phải thêm nó vào sau ( a@0.).


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.