มินิกอล์ฟวันจันทร์ # 6: Meeesesessess upp teeexexextext


48

Monday Mini-Golf:ชุดของความท้าทายสั้น ๆโพสต์ (หวังว่า!) ทุกวันจันทร์

เรื่องจริง1 : เมื่อวันก่อนฉันเล่นบนแท็บเล็ตของฉันเมื่อฉันมีความคิดที่จะเยี่ยมชมหน้าที่ฉันใช้บนพีซีของฉันเพื่อทดสอบจาวา หลังจากโหลดหน้าฉันเข้าโปรแกรมง่าย ๆ นี้:

alert("Hello!")

จากนั้นฉันก็กดปุ่มดำเนินการและรู้สึกประหลาดใจเมื่อมันบอกฉันว่ารหัสที่ฉันป้อนนั้นไม่ถูกต้อง ฉันลองดูที่กล่องข้อความและดูสิ่งนี้:

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 defabbbcbc deeefef

เมื่อมาถึงจุดนี้ฉันรู้สึกซึมซับในการหาและเปลี่ยนมันให้กลายเป็นความท้าทายที่น่าสนใจที่ฉันลืมไปว่าทำไมฉันถึงอยู่ที่นั่นตั้งแต่แรก (ฉันหาวิธีพิมพ์ตามปกติอย่างไร: กด space-backspace หลังจากตัวละครทุกตัวน่าเบื่อมาก แต่คุณต้องทำในสิ่งที่คุณต้องทำ)

ท้าทาย

เป้าหมายของการท้าทายคือการเขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในข้อความที่จะประมวลผลทำการเปลี่ยนแปลงตามรายการด้านบนและส่งออก / ส่งคืนผลลัพธ์

รายละเอียด

  • อินพุตจะมีเฉพาะ 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ธง เนื่องจากนี่เป็นเพียงการทดแทน regex เดียวคุณสามารถทดสอบได้ที่นี่ (คลิกที่แท็บบริบทเพื่อดูผลลัพธ์)

คำอธิบาย

นี่ตรงกับหลักและตัวอักษรใด ๆ ที่ไม่ใช่คนแรกในการวิ่ง ในขณะที่.สามารถจับคู่อักขระที่ไม่ใช่บรรทัดการป้อนได้ lookbehinds รับรองเงื่อนไขอื่น ๆ :

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

นี้ตรงกับถอยหลัง.จากตำแหน่งหลังจากที่ ครั้งแรกมันตรงกับหนึ่งหรือมากกว่าหนึ่งตัวอักษรและตัวเลขและจับพวกเขาเข้าไปในกลุ่มด้วย1 ([^_\W]+)สิ่งนี้จะทำให้แน่ใจได้ทันทีว่า.สอดคล้องกับตัวอักษรและตัวเลขเอง จากนั้นเพิ่มเติม[^_\W]ทำให้แน่ใจว่ามีตัวอักษรและตัวเลขอีกหนึ่งตัวในการเรียกใช้ปัจจุบันซึ่งเราไม่ได้รวมการแข่งขัน ตอนนี้กลุ่ม1คือสิ่งที่เราต้องการแทนที่การจับคู่ด้วยถ้าเป็นตัวเลข - ถ้าเป็นตัวอักษรที่เราต้องการแทนที่ด้วยสตริงนี้สองครั้ง นั่นคือสิ่งที่ lookbehind ที่สองเข้ามาเล่น:

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

อันนี้เป็นตัวเลือกดังนั้นหากล้มเหลวจะไม่มีผลกับการแข่งขันเลย มันเป็นครั้งแรกเพื่อให้แน่ใจว่า.เป็นไม่ได้หลักผ่านทาง(?<=\D)- ดังนั้น lookbehind นี้มีความเกี่ยวข้องเฉพาะเมื่อเรากำลังเห็นที่ตรงกับตัวอักษร ในกรณีที่เราจะจับคู่กลุ่ม\1อีกครั้ง (ซึ่งมักจะตรงกับเพราะเราได้บันทึกกลุ่มจากตำแหน่งเดียวกัน) 2แต่จับมันเข้าไปในกลุ่ม

ดังนั้นเราเพียงแทนที่ regex ด้วยเนื้อหาของทั้งสองกลุ่ม ( $1$2) หากการแข่งขันเป็นตัวเลข$2จะยังคงว่างเปล่าและเราจะเขียนคำนำหน้าเพียงครั้งเดียว ถ้ามันเป็นตัวอักษร$2ก็เหมือนกับ$1และเราเขียนมันกลับสองครั้ง


8

JavaScript (ES6) 82

การใช้การเพิ่มประสิทธิภาพ regexp ที่แนะนำโดย 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 สำหรับ regex แข็งแรงเล่นกอล์ฟลงและ ETHproductions หนึ่งกอล์ฟไบต์ในฟังก์ชั่นลด


ใช้สิ่งนี้สำหรับ regex ของคุณ: /[^_\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ว่าอาจสิ้นสุดโดยใช้ปากกาเน้นข้อความเริ่มต้น
Bakuriu


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!"

ไม่รู้ว่ามันต่างจากคำตอบของ Leif Willerts หรือไม่ แต่นี่คืออัลกอริทึม

  1. ค้นหาจดหมายที่ถูกต้อง (จดหมายหรือตัวเลข)
  2. ถ้ามันเป็นตัวอักษรเริ่มเก็บจดหมาย อย่างไรก็ตามมันถูกเก็บไว้แบบย้อนกลับทำให้สตริงกลับด้าน และรายการแรกจะถูกละเว้น
  3. เมื่อถึงตัวอักษรที่ไม่ถูกต้องให้ทำการแปลงคำถามด้วยอินพุตที่กลับด้าน การแปลงคำถามเป็น reverse.g. ย้อนกลับ แต่เนื่องจากย้อนกลับไปแล้วเราก็ย้อนกลับ

อย่างใดฉันเก็บวงเล็บ redudant


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

Pip, 41 ไบต์

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

รับข้อความเป็นอาร์กิวเมนต์บรรทัดคำสั่ง เราใช้การแทนที่ regex เพื่อแทนที่การทำงานตัวอักษรและตัวเลขทั้งหมด ( [^_\W]+) ด้วยฟังก์ชันการเรียกกลับ ฟังก์ชั่นนี้แมปฟังก์ชั่นอื่นกับตัวละครแต่ละตัวของคำที่สร้างการทำงานของตัวละครที่มีขนาดใหญ่ขึ้นอย่างต่อเนื่อง (กับตัวแปรทั่วโลกyติดตามดัชนี) และทำซ้ำพวกเขา X2 ถ้าตัวละครไม่ได้เป็นตัวเลข (ตรรกะที่ใช้+ในการแปลงเป็นตัวเลขและจากนั้นQตรวจสอบว่านี่เป็นสตริงที่เท่ากับอักขระดั้งเดิม) กระบวนการนี้จะแยกอักขระตัวแรกออกไปดังนั้นเราจึงต้องเพิ่มในภายหลัง ( a@0.)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.