นักแปล Meme สากลเหมือนผี


43

บทนำ

ปรากฎว่าเอเลี่ยนรักมีมมากเท่ากับที่เราทำ เผ่าพันธุ์มนุษย์ต่างดาวทุกคนที่เราพบมามีเวอร์ชั่นของตนเอง2spooky4me(ดูคำถามต่อไปนี้ ) และสิ่งที่เทียบเท่าแม้ว่าจะมีการเปลี่ยนแปลงบางอย่าง ที่อาศัยอยู่ของดาวเคราะห์ CUTE1f ไม่สามารถจัดการจำนวนมากสางเพื่อสางต้องการของพวกเขาคือ1spooky2meในขณะที่ memers skeletor7 9spooky11meรักพวกเขาสางบางอย่างเพื่อให้พวกเขามีแนวโน้มที่จะใช้งาน

ท้าทาย

การแปลมส์นั้นเป็นงานที่ยากดังนั้นคุณได้รับมอบหมายให้เขียนนักแปล meme สากลเพื่อช่วยให้คนเหล่านี้เข้าถึง memenet ได้อย่างถูกต้อง โปรแกรมของคุณจะยอมรับ meme และการแปลงเพื่อนำไปใช้กับลำดับหลักใน meme นั้นเพื่อให้เหมาะสมกับผู้อยู่อาศัยของดาวเคราะห์ดวงอื่น

อินพุต

โปรแกรมของคุณจะได้รับอินพุตสตริงสองสตริง:

  1. อินพุต meme (เช่น2spooky4me) [a-zA-Z0-9]+ไม้ขีด
  2. การแปลงที่ใช้กับมัน (เช่น+1จาก2spooky4meไปถึง3spooky5me) ไม้ขีดไฟ[+\-*/^]\d+(คุณต้องยอมรับ+, -, *, /และ^เป็นผู้ประกอบการโดยไม่คำนึงถึงการแสดงพื้นเมืองในภาษาของคุณ)

เอาท์พุต

โปรแกรมของคุณต้องส่งคืนสตริงเอาต์พุต (พิมพ์ไปยังเอาต์พุตมาตรฐานหรือเทียบเท่า) โดยการแปลงที่กำหนดจะใช้กับลำดับหลักในอินพุต meme ในเหตุการณ์ประหลาด ๆ มันกลับกลายเป็นว่าทุกเผ่าพันธุ์ที่พบเจอนั้นชอบมากกว่าหนึ่งมส์เศษส่วนดังนั้นการเปลี่ยนแปลงเหล่านี้ควรจะทำการคำนวณเลขจำนวนเต็ม (เช่น1spooky1me /2ควรส่งผลให้0spooky0me)

ตัวอย่าง

ใช้การดำเนินการทางคณิตศาสตร์มาตรฐาน:

Input:  2spooky4me +1
Output: 3spooky5me

Input:  2spooky4me -1
Output: 1spooky3me

Input:  2spooky4me *15
Output: 30spooky60me

Input:  10spooky900me /5
Output: 2spooky180me

ลำดับตัวเลขเป็นส่วนประกอบ การตัดจำนวนเต็มควรเกิดขึ้นในกรณีเช่นนี้:

Input:  idontunderstandmemes3 /2
Output: idontunderstandmemes1

ข้อมูลที่คุณป้อนอาจไม่มีลำดับหลักใด ๆ :

Input:  notreallyafunnymeme *100
Output: notreallyafunnymeme

คุณต้องรองรับการยกกำลังแม้ว่ามันจะไม่ใช่การดำเนินการแบบดั้งเดิมในภาษาที่คุณเลือก:

Input:  2spooky4me ^3
Output: 8spooky64me

ไม่มีข้อ จำกัด เกี่ยวกับความยาวสตริงของจำนวนลำดับตัวเลขในสตริง:

Input:  some1meme2sequences3can4be5really6long7 /2
Output: some0meme1sequences1can2be2really3long3

ภาคผนวก

หากภาษาของคุณรองรับจำนวนเต็มความแม่นยำโดยพลการเป็นคุณสมบัติภาษาคุณต้องใช้สิ่งเหล่านั้น หากไม่เป็นเช่นนั้นคุณไม่จำเป็นต้องสนับสนุนจำนวนเต็มที่มีความแม่นยำตามอำเภอใจ ตัวอย่างเช่นคุณต้องใช้Integerใน Haskell แทนที่จะใช้Intเพราะเป็นส่วนหนึ่งของภาษา ในJavaคุณไม่จำเป็นต้องใช้BigIntegerเพราะเป็นคุณสมบัติห้องสมุดไม่ใช่คุณสมบัติภาษา

Input:  2000000000000000000000000000000000000000000000000000000000000000000000000000000‌​000000000000000000000000000000000spooky4me /2
Output: 1000000000000000000000000000000000000000000000000000000000000000000000000000000‌​000000000000000000000000000000000spooky2me

นี่คือดังนั้นช่องโหว่มาตรฐานจึงเป็นสิ่งต้องห้ามและคำตอบที่สั้นที่สุดในการชนะไบต์!

ลีดเดอร์บอร์ด

สแต็คส่วนย่อยที่ด้านล่างของโพสต์นี้สร้างกระดานแต้มนำจากคำตอบ a) เป็นรายการคำตอบสั้นที่สุดต่อภาษาและ b) เป็นกระดานแต้มนำโดยรวม

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

## Ruby, <s>104</s> <s>101</s> 96 bytes

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของไฟล์สองไฟล์หรือคุณต้องการแสดงรายการบทลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

## Perl, 43 + 2 (-p flag) = 45 bytes

คุณสามารถทำให้ชื่อภาษาเป็นลิงค์ซึ่งจะปรากฏในตัวอย่างข้อมูล:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


3
กรณีทดสอบสุดท้ายของคุณผิด คุณมีหนึ่งศูนย์มากเกินไปในเอาต์พุตเพื่อให้เป็น / 5
Nic Hartley

5
ก่อนอื่นนี่คือการรวมโพสต์แรกเข้าด้วยกันด้วยความยินดี :) โปรดทราบว่าเรามีSandboxที่คุณสามารถโพสต์ความท้าทายเพื่อรับข้อเสนอแนะก่อนที่จะเผยแพร่
FryAmTheEggman

3
ยินดีต้อนรับสู่ PPCG (แม้ว่าคุณจะอยู่ที่นี่นานกว่า 2 ปี) ความท้าทายแรกที่ดี ภาคผนวกเกี่ยวกับจำนวนเต็มความแม่นยำตามอำเภอใจยกตัวอย่างเช่น Java ต้องใช้BigIntegerสำหรับการคำนวณหรือไม่?
AdmBorkBork

18
เผ่าพันธุ์มนุษย์ต่างดาวทุกคนที่เราเคยพบมา ...มันเป็นความจริงโดยสิ้นเชิง! :-)
Luis Mendo

2
มันเป็นความท้าทายของคุณและท้ายที่สุดก็ขึ้นอยู่กับคุณ แต่นั่นไม่ยุติธรรมสำหรับภาษาที่ใช้ไวยากรณ์ที่แตกต่างกัน
Dennis

คำตอบ:


10

Jolf, 15 14 ไบต์

ρi«\d+»dC!6+HI

ลองที่นี่!

คำอธิบาย

ρi«\d+»dC!6+HI
ρ «\d+»         replace all digits
 i              in the input
       d        (functional replace)
         !6     eval (using jolf's custom infix eval)
           +H   the number as a string plus
             I  the second input
        C       floor the result (integer truncate)

สนุกที่จะต้องทราบฉันปรับปรุง Jolf หลังจากความท้าทายนี้เพิ่ม RegExp builtins นี่อาจเป็น12 11 ไบต์:

ρiLRdC!6+HI

24

Ruby, 50 44 43 ไบต์

คำตอบ FGITW ต้องไปเร็ว!

ขอบคุณ @Neil สำหรับการบันทึก 6 ไบต์

โอ้ถูกต้อง, ข้ามออก 44 ยังคงเป็น 44

->m,t{m.gsub(/\d+/){eval$&+t.sub(?^,'**')}}

โอ้มนุษย์นี่เป็นคำตอบที่ฉันเกือบจะพูดพลางไปที่: a=gets;$><<gets.gsub(/\d+/){eval$&+a}. ฉันคิดถึงสิ่งที่ ^! = ** แต่และอาจนานกว่านี้สักหน่อย
Nic Hartley

3
+1 สำหรับการมีวิธีการแก้ปัญหาของคุณทั้งหมด 4 ไบต์สั้นกว่าสิ่งที่จำเป็นใน PowerShell ^เพียงเพื่อจับ : D
AdmBorkBork

15

Perl, 36 34 ไบต์

s/\d+/"0|$&$^I"=~s#\^#**#r/gee

ซอร์สโค้ดยาว30 ไบต์และต้องการสวิตช์-pi( +4 ไบต์ ) มันต้องใช้เวลาการป้อนข้อมูลแรกจาก STDIN -iเข้าที่สองเป็นอาร์กิวเมนต์ไปยัง

ขอบคุณ @DenisIbaev สำหรับการตีกอล์ฟ 2 ไบต์!

ทดสอบบนIdeone


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

1
-pi4 ไบต์คืออะไร?
CalculatorFeline

@CatsAreFluffy ฉันทามติปัจจุบันคือการนับระยะทางแก้ไขจากการเรียกใช้โดยไม่ต้องตั้งค่าสถานะ นั่นรวมถึงช่องว่างเพื่อแยกออก-piจากส่วนที่เหลือของคำสั่ง
Dennis

"0|$&""0|".$&จะสั้นกว่า
เดนิส Ibaev

@DenisIbaev เนื่องจากอินพุตเป็นตัวอักษรและตัวเลขจึงใช้"0|$&$^I"งานได้เช่นกัน ขอบคุณ!
เดนนิส

9

PowerShell v2 +, 139 137 ไบต์

param($a,$b)-join($a-split"(\d+)"|%{if($_-match"\d+"){if($b[0]-ne'^'){[math]::Floor((iex $_$b))}else{"$_*"*$b.Trim('^')+1|iex}}else{$_}})

Ooof ... 47 ไบต์เพียงบัญชี^เนื่องจากไม่ใช่ตัวดำเนินการดั้งเดิมใน PowerShell บันทึก 2 ไบต์ด้วย @TessellatingHeckler

จะเข้าเป็น$a=<word>, เช่น$b=<operation> .\universal-spooky-meme.ps1 2spooky4me ^3เรา-split $aอยู่กับตัวเลขล้อมรอบว่าใน parens |%{...}ดังนั้นเราจึงให้ตัวคั่นและท่ออาร์เรย์ผลผ่านห่วง ifหากชิ้นปัจจุบันเป็นจำนวนที่เราในครั้งแรก เราจำเป็นต้องตรวจสอบว่าตัวอักษรตัวแรกของเป็น$b ^หากไม่เป็นเช่นนั้นเราก็ต่อชิ้นงานปัจจุบันของเราเข้าด้วยกัน$bแล้วส่งไปที่iex(คล้ายeval) แล้วปล่อยไว้บนท่อ มิฉะนั้นเราต้องสร้างสตริงการยกกำลังด้วย"$_*"*$b.Trim('^')+1และไปป์ที่iexนั้นและวางไว้บนไพพ์ไลน์ สำหรับตัวอย่างที่กำหนด2spooky4me ^3สิ่งนี้จะเป็น2*2*2*1และ4*4*4*1ตามลำดับ

มิฉะนั้นเราจะปล่อยสตริงตามที่เป็นอยู่บนไพพ์ไลน์

ผลลัพธ์เหล่านี้ทั้งหมดจะถูกรวบรวมจากไปป์ไลน์ด้วย parens ที่ห่อหุ้มก่อนที่จะถูก-joinรวมเข้าด้วยกันเป็นหนึ่งสตริง นั่นคือ re-left บนไปป์ไลน์และเอาท์พุทเป็นนัยเมื่อสิ้นสุดโปรแกรม

ตัวอย่าง

PS C:\Tools\Scripts\golfing> .\universal-spooky-meme.ps1 2spooky4me ^5
32spooky1024me

PS C:\Tools\Scripts\golfing> .\universal-spooky-meme.ps1 2spooky4me /3
0spooky1me

ฉันเขียนของตัวเองก่อนที่จะดูคำตอบจากนั้นฉันก็บีบความคิดของคุณออกมาด้วย - ขอบคุณ ฉันคิดว่าคุณสามารถแทนที่Floor(("$_$b"|iex))ด้วยเพื่อประหยัดคู่หรืออาจจะFloor((iex $_$b)) iex $_+$b
TessellatingHeckler

@TessellatingHeckler ขอบคุณสำหรับสองไบต์!
AdmBorkBork

8

JavaScript (ES7), 58 57 ไบต์

(s,t)=>s.replace(/\d+/g,n=>0|eval(n+t.replace('^','**')))

แก้ไข: บันทึก 1 ไบต์เมื่อฉันจำได้ว่าreplaceยังทำงานกับสตริงตัวอักษร


เยี่ยมมากฉันกำลังทำงานกับโซลูชัน ES6
Bálint

คุณสามารถแกงเพื่อช่วยประหยัดไบต์ได้ไหม?
gcampbell

1
@ gcampbell ใช่ แต่ฉันขี้เกียจเกินไป
Neil

6

Pyth, 29

Jws.i:zK"\d+"3m.vs.iJ]+d;:zK1

วิธีนี้ใช้งานได้โดยการแยกแต่ละหมายเลขออกจาก meme จากนั้น interleaving ( .i) ตามด้วยช่องว่างแล้วล้อมในรายการด้วยอาร์กิวเมนต์อื่น ดังนั้นถ้าจำนวนของเราเป็น7และเรามีเราจะได้รับรายการ:^20 ["^", "7 ", "20"]การทำให้แบนราบและการใช้ Pyth's eval( .v) บนสิ่งนี้จะให้การดำเนินการที่เราต้องการเสมอ ในที่สุดค่าเหล่านี้จะถูกสอดแทรกด้วยการแบ่งสตริงดั้งเดิมตามจำนวนที่เกิดขึ้น

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

ลองที่นี่หรือเรียกใช้ชุดทดสอบ


6

Python 2, 156 89 88 87 ไบต์

แรงบันดาลใจจากคำตอบอื่น ๆ ที่ใช้ฟังก์ชั่นการแทนที่ภาษาของพวกเขาด้วยฟังก์ชั่นการจัดการในการประมวลผลส่วนที่เป็นตัวเลขของiสตริง nput ยาวด้วยoperator โชคไม่ดีสำหรับ Python ^จะต้องถูกแทนที่ด้วย**ซึ่งมีราคา 18 ไบต์ การ.group(0)โทรเพื่อเข้าถึงการแทนค่าสตริงของวัตถุที่ตรงกันนั้นไม่ได้ช่วยอะไรดีกว่า ...

ขอบคุณ QPaysTaxes สำหรับการจำพื้นที่ปลอมและ RootTwo สำหรับการโต้แย้งที่ไม่จำเป็น.group!

import re
lambda i,o:re.sub(r'\d+',lambda p:str(eval(p.group()+o.replace('^','**'))),i)

ฉันคิดว่าคุณสามารถกำจัดพื้นที่หลังจากi,o:
Nic Hartley

คุณสามารถบันทึกไบต์ที่สองเพิ่มเติมได้ที่: (1) p.group()โดยใช้ (ค่าเริ่มต้นคือ 0); และ (2) แทรกr=re.sub;แทนที่re.subสายแรกด้วยrแล้วใช้r('^','**',o)แทนo.replace(...)
RootTwo

@RootTwo: สำหรับฉัน r('^','**',o)แล้วต้องหนี^ไป\^เพื่อให้ตรงกับตัวละครไม่ใช่จุดเริ่มต้นของoการประหยัดสุทธิไม่มีไบต์ :-( - แต่ขอบคุณที่ชี้ให้เห็นว่าไม่จำเป็น0!
ojdo

5

Javascript (ES6) 99 ไบต์

อีกตัวอย่างหนึ่งทำไมเราเกลียดที่จะรอให้ ES7 เข้ากันได้

(a,b)=>a.match(/\d+|\D+/g).map(_=>(d=- -_)?eval(b[0]=="\^"?Math.pow(_,b.slice(1)):d+b)|0:_).join``

ตัวอย่าง Runnable:

f=(a,b)=>a.match(/\d+|\D+/g).map(_=>(d=- -_)?Math.ceil(eval(b[0]=="\^"?Math.pow(_,b.slice(1)):d+b)):_).join``

alert(f(prompt("Enter string!"), prompt("Enter operation!")));


regexes ที่ตรงกันของคุณดูเหมือนจะปิดไปหน่อย ในตัวอย่าง Runnable คุณออกจากตัวพิมพ์ใหญ่ตัวอักษรซึ่งแถบพวกเขาออกผล ( "2spooky4ME", "+1" => "3spooky5") และในตัวอย่างแรกคุณตรงกับที่เทียบเท่ากับ\d+|\D+ คุณต้องการ regex ใช่ไหม หรือถ้าการแยกนั้นสร้างความแตกต่าง .+[a-zA-Z0-9]+[a-zA-Z]+|[0-9]+
Itai Ferber

มันอาจจะง่ายกว่าที่จะเรียกใช้Math.powโดยตรงเนื่องจากคุณต้องใช้กรณีพิเศษอยู่ดี นอกจากนี้คุณใช้การแบ่งจำนวนเต็มหรือไม่
Neil

@Neil ฉันลืมไปแล้วว่านาที
Bálint

@Neil มีวิธีที่ดีกว่าสำหรับเพดานหรือไม่
Bálint

1
@ItaiFerber \d+|\D+ไม่เหมือนกัน.+มาก พวกเขาจะไม่เหมือนกันเพราะการขยายตัว Kleene orเกิดขึ้นก่อน มันจะเหมือนกันถ้ามันดูเหมือน(\d|\D)+แต่อย่างที่มันไม่ตรงกับคำพูดทั้งหมด2aในกลุ่มเดียวมันจะเป็นสองกลุ่มแยกกัน
FryAmTheEggman


4

Kotlin, 416 413 Bytes

การขาดeval()Kotlin ในตัวนับจำนวนไบต์จริงๆ ...

fun main(a:Array<String>){var r=Regex("\\d+");var i=a[0];var n=a[1].takeLast(a[1].length-1).toInt();when(a[1][0]){'+'->print(r.replace(i,{m->""+(m.value.toInt()+n)}));'*'->print(r.replace(i,{m->""+(m.value.toInt()*n)}));'/'->print(r.replace(i,{m->""+(m.value.toInt()/n)}));'-'->print(r.replace(i,{m->""+(m.value.toInt()-n)}));'^'->print(r.replace(i,{m->""+(Math.pow(m.value.toDouble(),n.toDouble())).toInt()}));}}

ลองออนไลน์!

Ungolfed

fun main(a: Array<String>) {
    var r = Regex("""\d+""")
    var i = a[0]
    var n = a[1].takeLast(a[1].length - 1).toInt()
    when (a[1][0]) {
        '+' -> print(r.replace(i, { m -> "" + (m.value.toInt() + n) }))
        '*' -> print(r.replace(i, { m -> "" + (m.value.toInt() * n) }))
        '/' -> print(r.replace(i, { m -> "" + (m.value.toInt() / n) }))
        '-' -> print(r.replace(i, { m -> "" + (m.value.toInt() - n) }))
        '^' -> print(r.replace(i, { m -> "" + (Math.pow(m.value.toDouble(), n.toDouble())).toInt() }))
    }
}

4

PowerShell (v4), 124 120 ไบต์

# New 120 byte version:
$s,$a=$args;[regex]::Replace($s,'\d+',{($(if($a-ne($a=$a.Trim('^'))){
"$args*"*$a+1}else{"$args$a"})|iex)-replace'\..*'})

# Previous 124 byte version
$s,$a=$args;[regex]::Replace($s,'\d+',{if($a[0]-eq'^'){
[math]::pow("$args",$a.Trim('^'))}else{iex "$args$a-replace'\..*'"}})

(บรรทัดใหม่อยู่ที่นี่เพื่อหลีกเลี่ยงการเลื่อนแนวนอนเท่านั้นมันจะทำงานเมื่อบันทึกเป็นหนึ่งบรรทัด)

ความคิดเห็นและมีการร้องขอเวอร์ชันที่ไม่ได้รับการดัดแปลง:

$meme, $instruction = $args

# Scriptblock which processes the numbers
# to be replaced. $args is the input number.
$replacement = {

    # Generates a string of the calculation, by:
    # Removing leading ^ character, if present.
    # ^3 -> 3,      +3 -> +3
    # See if it was present, and switch code paths.
    # (Can be one combined step in the golf)
    # Switch code paths for "raise to the power of",
    # or basic arithmetic.
    $trimmedInstruction = $instruction.Trim('^')
    $tmp = if ( $instruction -ne $trimmedInstruction ) {

        # String multiplication, changes
        # function input "45" and instruction "3" into
        # "45*45*45*+1". The "3" implicitly casts to [int]
        # the +1 is there to make the trailing * not crash.
        "$args*" * $instruction + 1

    } else {
        # Cobble the basic math together as a string
        # "45" and "+10" becomes
        # "45+10"
        "$args$instruction"
    }

    # eval() the generated string (e.g. "45+10" or "45*45*45*+1")
    $tmp = Invoke-Expression $tmp      # iex

    # Use a regex golf to replace trailing .23423
    # decimals in case of division with remainder.
    # Acts as [math]::floor(), harmless on other numbers.
    $tmp -replace'\..*'
}

# A regular expression replacement which picks out all 
# the numbers (\d+) and runs them through the
# replacement function. Returns a string which 
# ends up on stdout
[regex]::Replace($meme, '\d+', $replacement)
  • .Net regex library สามารถทำการแทนที่ด้วย scriptblock ที่ดำเนินการกับเนื้อหาของการจับคู่และ PowerShell จะแยกสตริงประเภทเป็นตัวเลขและiexเหมือนกับeval()ในภาษาอื่น ๆ มันแค่"2spooky" "+3"->eval("2+3")
  • ยกเว้น ... มันไม่สามารถจัดการ^ตัวดำเนินการหรือการยกกำลังแบบอื่น ๆ ได้อย่างสะดวกสบาย**มันสามารถใช้การ[math]::Pow()เรียกไลบรารีเท่านั้นดังนั้นจึงมีบล็อกขนาดใหญ่เพื่อจัดการสาขานั้น
    • รุ่นที่ปรับปรุงขโมยความคิดจาก @TimmyD และไม่สตริงคูณแทน - "2*" * nซึ่งจะกลายเป็น"2*2*2*2*"แล้วเพิ่มในท้ายที่จะคูณด้วยหนึ่งแทนการบ่นเกี่ยวกับการต่อท้าย+1*
  • ยกเว้น ... สุทธิไม่ธนาคารปัดเศษซึ่งรอบจำนวนที่ใกล้ที่สุดได้โดยเริ่มต้นและ 3/2 = 2 มากกว่า 3/2 = 1. [math]::Truncate()ความท้าทายนี้เรียกร้องให้มีการตัดและวิธีการที่ ฉันบันทึกอักขระโดยใช้-replaceเพื่อตัดจุดทศนิยมและอะไรก็ได้หลังจากนั้น

กรณีทดสอบ:

PS D:\> .\meme.ps1 2spooky4me +1
3spooky5me

PS D:\> .\meme.ps1 2spooky4me -1
1spooky3me

PS D:\> .\meme.ps1 2spooky4me *15
30spooky60me

PS D:\> .\meme.ps1 10spooky900me /5
2spooky180me

PS D:\> .\meme.ps1 idontunderstandememes3 /2
idontunderstandememes1

PS D:\> .\meme.ps1 "idontunderstandememes3" "/2"
idontunderstandememes1

PS D:\> .\meme.ps1 "notreallyafunnymeme" "*100"
notreallyafunnymeme

PS D:\> .\meme.ps1 "2spooky4me" "^3"
8spooky64me

PS D:\> .\meme.ps1 "some1meme2sequences3can4be5really6long7" "/2"
some0meme1sequences1can2be2really3long3

PS D:\> .\meme.ps1 2000000000000000000000000000000000000000000000000000000000000000000000000000000‌​000000000000000000000000000000000spooky4me /2
1E+78‌​0spooky2me

NB ในการทดสอบครั้งล่าสุดตัวเลขที่มาก[BigInteger]เกินไปจะถูกพิมพ์ออกมาโดยอัตโนมัติ แต่จะแสดงในรูปแบบทางวิทยาศาสตร์ โชคดีที่ทุกเผ่าพันธุ์ที่รู้จักกันสามารถสื่อสารระหว่างดวงดาวได้มีการพัฒนาทางวิทยาศาสตร์เพียงพอที่จะสามารถประมวลผลสัญกรณ์ทางวิทยาศาสตร์ได้โดยไม่มีปัญหา


1
คุณสามารถดูคำตอบอื่น ๆ ได้ว่าพวกเขามีเวอร์ชัน golfed ค่อนข้างอ่านไม่ได้อย่างไรและจากนั้นเป็นเวอร์ชัน ungolfed แยกต่างหากสำหรับการตรวจสอบพฤติกรรมของรหัส คุณควรทำสิ่งนี้กับคุณ (กล่าวคือลบบรรทัดใหม่ในเวอร์ชัน golfed)
jpmc26

ขอบคุณสำหรับเครดิต แต่ไม่ใช่เคล็ดลับของฉัน - ฉันดึงมันจาก PowerShell Tips thread
AdmBorkBork

เห็นได้ชัดว่าฉันสนใจมากพอที่จะแสดงความคิดเห็นและมีคนอื่นสนใจมากพอที่จะลบล้างความคิดเห็นของฉัน ;)
jpmc26

ไม่ฉันบอกว่าคุณควรจะมีเวอร์ชั่นที่ตีกอล์ฟได้สมบูรณ์ คนที่ตีกอล์ฟจะต้องมีการเลื่อน คนที่ไม่ได้รับการอวดจะไม่สามารถอ่านได้มากกว่าคนที่คุณมี
jpmc26

1
@ jpmc26 โอเคฉันได้แก้ไขในเวอร์ชันที่ไม่แสดงความคิดเห็น
TessellatingHeckler

3

Bash + GNU coreutils, 144 ไบต์

d=
u=$1,
for((i=0;i<${#u};i++)){ l=${u:i:1}
[[ "$l" =~ [0-9] ]]&&d=$d$l||{ [ -z $d ]||echo -n `bc<<<$d$2`&&{ [ $l != , ]&&echo -n $l; };d=; }
}

สิ่งนี้จะดูที่การเปลี่ยนแปลงระหว่างตัวเลขและไม่ใช่ตัวเลขนั่นคือสาเหตุที่อักขระป้อนข้อมูลที่ไม่ถูกต้อง (จุลภาค) ถูกผนวกเข้ากับสตริงอินพุต เครื่องหมายจุลภาคนี้จะถูกละเว้นในผลลัพธ์ แบบแผนของ OP จะตามด้วยไวยากรณ์bcที่ใช้ในการคำนวณทางคณิตศาสตร์


อย่างไรก็ตามเนื่องจากการอภิปรายใน PowerShell-solution โดย @TessellatingHeckler: ในโซลูชันของฉันคุณสามารถแปลโปรแกรมเป็นบรรทัดเดียวโดยแทนที่การแบ่งบรรทัดเป็นอัฒภาคซึ่งไม่เปลี่ยนความยาวของมัน
rexkogitans


2

R, 163 ไบต์

ในฐานะคนที่เรียนรู้การแสดงออกปกติและการแทนที่สตริงใน R สิ่งนี้พิสูจน์ได้ว่าเป็นความท้าทายที่ค่อนข้างยาก โดยเฉพาะอย่างยิ่งเนื่องจากการจับคู่หมายเลขนั้นเป็นเรื่องง่าย แต่ฉันไม่สามารถหาวิธีใช้การแทนที่หลายรายการgsubได้ นอกจากนี้ฉันไม่รู้ว่าeval(parse(paste0(...เป็นวิธีที่มีประสิทธิภาพที่สุดในการสลับระหว่างการดำเนินการ บางทีswitchฟังก์ชั่นนี้เหมาะสมกว่าที่นี่

function(s,o){p=strsplit;y=p(gsub("\\d+","?",s),"?")[[1]];x=na.omit(as.integer(p(s,"[a-zA-Z]+")[[1]]));y[y=="?"]=floor(eval(parse(,,paste0("x",o))));cat(y,sep="")}

คำอธิบาย

f=function(s,o){
    p=strsplit                                    # alias for stringsplit    
    y=p(gsub("\\d+","?",s),"?")[[1]]              # substitute numbers with "?" and split into vector on "?"
    x=na.omit(as.integer(p(s,"[a-zA-Z]+")[[1]]))  # split at alphabetical char, return vector with numbers to be operated on
    y[y=="?"]=floor(eval(parse(,,paste0("x",o)))) # replace inserted "?" with vector of numbers operated on
    cat(y,sep="")                                 # print concatenated vector
}

ฉันคิดว่าคุณสามารถบันทึกได้ถึงหนึ่งตันหากคุณใช้ gsub พร้อมกับปิดการแข่งขันซึ่งเป็นสิ่งที่คุณพูดถึงในความคิดเห็นของคุณ ฉันไม่รู้จะทำยังไงใน R ฉันต่อสู้กับสิ่งนั้นด้วยจนกระทั่งฉันรู้ว่าจะทำอย่างไรใน Groovy; เป็นคนเปลี่ยนเกม
Magic Octopus Urn

2

Javascript (ES6), 85 ไบต์

x=(s)=>{var a=s.split(" ");return[...a[0]].map(x=>(!isNaN(x))?eval(x+a[1]):x).join``}

console.log(x("2spookie5me +1"));

Ungolfed:

x = (s) => {
  var a = s.split(" ");
  return [...a[0]].map(x => (!isNaN(x)) ? eval(x + a[1]) : x).join ``
}
console.log(x("2spookie5me +1"));

ใครรู้ว่าฉันสามารถแยกช่องว่างโดยใช้ตัวดำเนินการกระจาย จาก s.split นี้ (""); ถึง ["" ... s]; อย่างน้อยก็ความคิด
Bladimir Ruiz

คุณไม่ต้องการ()รอบอาร์กิวเมนต์ lambda คุณไม่ต้องการvarและคุณควรใช้ parens และเครื่องหมายจุลภาคแทนการจัดฟันและreturn
Cyoce

นอกจากนี้ยัง^เป็นกรณีพิเศษสำหรับ JavaScript มันเป็น bitor XOR แทนMath.pow
Sunny Pun

2

Groovy, 64 60 ไบต์

{a,b->a.replaceAll(/\d+/,{Eval.me(it+b.replace("^","**"))})}

แทนที่อินสแตนซ์ของตัวเลขทั้งหมดด้วยการปิดที่ประเมินการดำเนินการกับส่วนหลักของคำที่ส่งผ่าน หากผ่านฟังก์ชันเลขชี้กำลังมันจะแทนที่ด้วยเครื่องหมายที่เหมาะสม Groovy จัดการการแปลง BigInteger / BigDecimal โดยปริยายเมื่อใช้Eval.me()เนื่องจากสตริงการวิเคราะห์คำอาจอยู่นอก2^32-1ช่วง

อธิบาย

{a,b->...} - ปิดด้วยสองข้อโต้แย้ง

a.replaceAll(/\d+/,{...}) - ค้นหาลำดับตัวเลขทั้งหมดในสตริงและแทนที่ด้วยการปิด

{Eval.me(it+b.replace("^","**"))} - โดยเฉพาะอย่างยิ่งการปิดการแข่งขันแต่ละครั้งที่มีการดำเนินการต่อท้ายจากนั้นประเมินว่าเป็นรหัส Groovy

.replace("^","**")- แทนที่อินสแตนซ์แรกของ^ด้วยตัวดำเนินการเลขชี้กำลัง Groovy **ในการดำเนินการที่มีให้ หากคุณต้องการให้มันทำงานกับสตริงสมการทั้งหมดที่ใช้เลขชี้กำลังให้ใช้replaceAll()แทนค่าปรับ +3 ไบต์

สนุกเคียงข้างเขาเป็นสถานการณ์การทดสอบที่ถูกต้อง:
(22348952345238905290858906209862398036spooky409552me, /200*4943^8-23939+((100/203)+600)


1

RProgN , 39 ไบต์

►x='%d+'§x'%D+'''Rx'%d+'''Rg'y'=y_}R

อธิบาย

►x='%d+'§x'%D+'''Rx'%d+'''Rg'y'=y_}R
►                                       # Spaceless segment.
 x=                                     # Assign the top value of the stack '[+*/-]\d+' 
   '$d+'§                         }R     # Replace everything in the pattern %d+ (all numbers) based on an anonymous function 
         x'%D+'''R                      # Replace all Non-digits in the modifer with nothing, leaving just the second argument for the operator.
                  x'%d+'''R             # Snip all digits, separating our operator from our digits such that digit operator exists in the stack.
                           g'y'=        # Grab the function that is represented by the top of the stack (the operator in this case)
                                y       # Run it
                                 _      # Floor the result. 

คำตอบที่ไม่ถูกต้องทางเทคนิคเพราะภาษานี้ไม่มีอยู่ อย่างไรก็ตามมันไม่ได้ออกแบบมาโดยเฉพาะสำหรับมันหรือการเพิ่มใด ๆ โดยเฉพาะ ดังนั้นฉันจะใช้มัน ฟ้องฉัน

ลองออนไลน์!


0

Perl 6, 111 ไบต์

{/(\w+)\s(<[+\-*/^]>)(\d+)/&&my \b=+$2;my \o=(*+b,*-b,* *b,*div b,* **b)[index "+-*/^",$1];$0.subst(/\d+/,o):g}

น่าเสียดายที่EVALปิดใช้งานตามค่าเริ่มต้น นอกจากนี้คุณต้องใช้divสำหรับการหารจำนวนเต็ม

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