Universal Meme Meme dịch


43

Giới thiệu

Hóa ra, người ngoài hành tinh yêu memes cũng nhiều như chúng ta. Tuy nhiên, mọi chủng tộc ngoài hành tinh chúng ta gặp phải đều có phiên bản riêng 2spooky4me(xem câu hỏi sau ) và tương đương, với một số biến thể. Cư dân của hành tinh CUTE1f không thể xử lý nhiều ma quỷ, vì vậy, ma 1spooky2mequỷ ưa thích của họ là , trong khi những người ghi nhớ skeletor7 yêu thích họ một số ma quỷ, vì vậy họ có xu hướng sử dụng 9spooky11me.

Thử thách

Dịch meme là một công việc khó khăn, vì vậy bạn đã được giao nhiệm vụ viết một trình dịch meme phổ quát để giúp những người này truy cập vào memenet một cách chính xác. Chương trình của bạn sẽ chấp nhận một meme và một phép biến đổi để áp dụng cho các chuỗi chữ số trong meme đó để làm cho nó phù hợp với cư dân của một hành tinh khác.

Đầu vào

Chương trình của bạn sẽ nhận được hai chuỗi đầu vào:

  1. Các meme đầu vào (ví dụ 2spooky4me). Các trận đấu [a-zA-Z0-9]+.
  2. Việc chuyển đổi để áp dụng cho nó (ví dụ +1, để đi từ 2spooky4međến 3spooky5me). Trận đấu [+\-*/^]\d+(bạn phải chấp nhận +, -, *, /, và ^như các nhà khai thác, không phụ thuộc vào diện tự nhiên trong ngôn ngữ của bạn).

Đầu ra

Chương trình của bạn phải trả về một đầu ra chuỗi (được in thành đầu ra tiêu chuẩn hoặc tương đương) với phép chuyển đổi đã cho được áp dụng cho các chuỗi chữ số trong meme đầu vào. Trong một diễn biến kỳ lạ, nó cũng chỉ ra rằng tất cả các chủng tộc gặp phải cho đến nay đều thích các memes tích phân hơn các phân số, vì vậy các phép biến đổi này sẽ thực hiện số học số nguyên (ví dụ như 1spooky1me /2sẽ dẫn đến 0spooky0me).

Ví dụ

Các phép toán số học tiêu chuẩn được áp dụng:

Input:  2spooky4me +1
Output: 3spooky5me

Input:  2spooky4me -1
Output: 1spooky3me

Input:  2spooky4me *15
Output: 30spooky60me

Input:  10spooky900me /5
Output: 2spooky180me

Chuỗi số là không thể thiếu; cắt ngắn số nguyên nên xảy ra trong trường hợp như thế này:

Input:  idontunderstandmemes3 /2
Output: idontunderstandmemes1

Đầu vào của bạn có thể không có bất kỳ chuỗi chữ số nào:

Input:  notreallyafunnymeme *100
Output: notreallyafunnymeme

Bạn phải hỗ trợ lũy thừa, ngay cả khi đó không phải là thao tác gốc trong ngôn ngữ bạn chọn:

Input:  2spooky4me ^3
Output: 8spooky64me

Không có giới hạn về độ dài chuỗi số lượng chuỗi số trong chuỗi:

Input:  some1meme2sequences3can4be5really6long7 /2
Output: some0meme1sequences1can2be2really3long3

Phụ lục

Nếu ngôn ngữ của bạn hỗ trợ các số nguyên chính xác tùy ý như một tính năng ngôn ngữ, bạn phải sử dụng các số nguyên đó. Nếu không, bạn không cần phải hỗ trợ các số nguyên chính xác tùy ý. Ví dụ: bạn phải sử dụng Integertrong Haskell thay Intvì vì nó có sẵn như là một phần của ngôn ngữ; trong Java, bạn không bắt buộc phải sử dụng BigIntegervì đó là tính năng thư viện, không phải tính năng ngôn ngữ.

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

Đây là , vì vậy các lỗ hổng tiêu chuẩn bị cấm và câu trả lời ngắn nhất tính theo byte sẽ thắng!

Bảng xếp hạng

Đoạn trích Stack ở cuối bài này tạo bảng xếp hạng từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

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


3
Trường hợp thử nghiệm cuối cùng của bạn là sai. Bạn có quá nhiều số không trong đầu ra cho nó là / 5.
Nic Hartley

5
Trước hết, đây là một bài viết hợp lý được kết hợp hợp lý, vì vậy xin chúc mừng :) Lưu ý chúng tôi có một Sandbox nơi bạn có thể đăng thử thách của mình để phản hồi trước khi nó được phát hành.
FryAmTheEggman

3
Chào mừng bạn đến với PPCG (mặc dù bạn dường như đã ở đây hơn 2 năm). Thử thách đầu tiên tốt đẹp. Phần phụ lục về các số nguyên chính xác tùy ý có bắt buộc rằng, ví dụ, Java phải sử dụng BigIntegercho các tính toán của nó không?
admBorkBork

18
Mọi chủng tộc ngoài hành tinh chúng ta đã gặp cho đến nay ... Điều đó hoàn toàn đúng! :-)
Luis Mendo

2
Đó là thách thức của bạn và cuối cùng tùy thuộc vào bạn, nhưng điều đó không thực sự công bằng đối với các ngôn ngữ xảy ra sử dụng một cú pháp khác.
Dennis

Câu trả lời:


10

Jolf, 15 14 byte

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

Hãy thử nó ở đây!

Giải trình

ρ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)

Thú vị lưu ý, tôi đã cập nhật Jolf sau thử thách này, thêm một số nội dung RegExp. Đây có thể là 12 11 byte:

ρiLRdC!6+HI

24

Ruby, 50 44 43 byte

Câu trả lời FGITW. Phải đi thật nhanh!

Cảm ơn @Neil vì đã lưu 6 byte.

Ồ đúng rồi, gạch bỏ 44 vẫn là 44

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

Ồ, anh bạn, đây gần như chính xác là một câu trả lời tôi đã chọc vào : a=gets;$><<gets.gsub(/\d+/){eval$&+a}. Của tôi đã bỏ lỡ điều ^! = **, và có lẽ lâu hơn một chút.
Nic Hartley

3
+1 để có toàn bộ giải pháp của bạn ngắn hơn 4 byte so với những gì cần thiết trong PowerShell chỉ để xử lý ^. : D
admBorkBork

15

Perl, 36 34 byte

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

Mã nguồn dài 30 byte và nó yêu cầu các bộ chuyển mạch -pi( +4 byte ). Nó nhận đầu vào đầu tiên từ STDIN, đầu vào thứ hai làm đối số -i.

Cảm ơn @DenisIbaev vì đã chơi golf 2 byte!

Kiểm tra nó trên Ideone .


Đúng, tôi đã tìm ra nếu ai đó có thể đánh bại câu trả lời Ruby của tôi, đó sẽ là Dennis và / hoặc ở Perl, và cuối cùng bạn đã thực hiện được cả hai kỳ vọng
Value Ink

1
-pilà 4 byte?
Máy

@CatsAreFluffy Đồng thuận hiện tại là tính khoảng cách chỉnh sửa từ lệnh gọi mà không có cờ. Điều đó bao gồm một không gian để tách biệt -pivới phần còn lại của lệnh.
Dennis

"0|$&"ngắn hơn "0|".$&.
Denis Ibaev

@DenisIbaev Vì đầu vào là chữ và số, "0|$&$^I"cũng hoạt động. Cảm ơn!
Dennis

9

PowerShell v2 +, 139 137 byte

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

Giả mạo ... 47 byte chỉ để giải thích ^vì đó không phải là toán tử gốc trong PowerShell. Đã lưu 2 byte nhờ @TessellatingHeckler.

Đưa đầu vào như $a=<word>, $b=<operation>như .\universal-spooky-meme.ps1 2spooky4me ^3. Chúng tôi -split $atrên các chữ số, kèm theo đó là parens để chúng tôi giữ các dấu phân cách và dẫn mảng kết quả qua một vòng lặp |%{...}. Nếu mảnh hiện tại là một số, chúng ta sẽ ở đầu tiên if. Chúng ta cần kiểm tra xem ký tự đầu tiên $b^. Nếu không, chúng ta chỉ cần ghép mảnh hiện tại của chúng ta $bvà gửi nó đến iex(tương tự eval), sau đó để nó trên đường ống dẫn. Mặt khác, chúng ta cần tạo một chuỗi lũy thừa với "$_*"*$b.Trim('^')+1và đường ống đó đến iex, và để nó trên đường ống. Đối với cho 2spooky4me ^3ví dụ, đây sẽ là 2*2*2*14*4*4*1, tương ứng.

Mặt khác, chúng ta chỉ để lại chuỗi như trên đường ống.

Tất cả các kết quả đó được thu thập từ đường ống với các dấu ngoặc được đóng gói trước khi được -joinghép lại thành một chuỗi. Đó là phần còn lại trên đường ống và đầu ra được ẩn khi kết thúc chương trình.

Ví dụ

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

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

Tôi đã tự viết trước khi xem câu trả lời, sau đó tôi cũng chèn ép một số ý tưởng của bạn - cảm ơn. Tôi nghĩ rằng bạn có thể thay thế Floor(("$_$b"|iex))với Floor((iex $_$b))lưu một cặp vợ chồng, hoặc có thể iex $_+$b.
TessellatingHeckler

@TessellatingHeckler Cảm ơn hai byte!
admBorkBork

8

JavaScript (ES7), 58 57 byte

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

Chỉnh sửa: Đã lưu 1 byte khi tôi nhớ rằng nó replacecũng hoạt động trên các chuỗi ký tự.


Thật tuyệt, tôi đang làm việc trên một giải pháp ES6
Bálint

Bạn có thể cà ri để tiết kiệm một byte?
gcampbell

1
@gcampbell Có, nhưng tôi quá lười.
Neil

6

Bình thường, 29

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

Điều này hoạt động bằng cách trích xuất từng số từ meme, và sau đó xen kẽ ( .i) nó theo sau là khoảng trắng và được bọc trong một danh sách với đối số khác. Vì vậy, nếu số của chúng tôi là 7và chúng tôi đã ^20có danh sách : ["^", "7 ", "20"]. Làm phẳng và sử dụng Pyth's eval( .v) trên điều này luôn mang lại hoạt động mà chúng ta muốn. Cuối cùng, các giá trị này được xen kẽ với phân tách chuỗi gốc khi xuất hiện các số.

Đây có thể là một byte ngắn hơn nếu cả hai đầu vào được bao quanh bởi các ký tự trích dẫn hoặc ngắn hơn hai byte nếu chỉ một trong số chúng có thể được trích dẫn.

Dùng thử tại đây hoặc chạy Test Suite


6

Python 2, 156 89 88 87 byte

Lấy cảm hứng từ các câu trả lời khác sử dụng hàm thay thế ngôn ngữ của họ bằng trình xử lý hàm để xử lý các phần số của ichuỗi thông số dài bằng operator. Không may mắn cho Python, ^phải được thay thế bằng **, chi phí lên tới 18 byte. Cuộc .group(0)gọi chỉ để truy cập vào chuỗi đại diện của đối tượng phù hợp không làm cho mọi thứ tốt hơn ...

Cảm ơn QPaysTaxes vì ​​đã phát hiện ra một không gian giả và RootTwo cho các đối số không cần thiết .group!

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

Tôi nghĩ bạn có thể thoát khỏi không gian saui,o:
Nic Hartley

Bạn có thể lưu thêm hai byte: (1) bằng cách sử dụng p.group(). (nó mặc định là 0); và (2) chèn r=re.sub;thay thế re.subcuộc gọi đầu tiên bằng rvà sau đó sử dụng r('^','**',o)thay vìo.replace(...)
RootTwo

@RootTwo: Đối với tôi, r('^','**',o)sau đó đòi hỏi phải thoát ^để \^theo thứ tự để phù hợp với nhân vật, chứ không phải đầu o, net tiết kiệm không byte :-( - nhưng nhờ chỉ ra không cần thiết 0!
ojdo

5

Javascript (ES6) 99 byte

Một ví dụ khác, tại sao chúng tôi ghét chờ ES7 để có được khả năng tương thích

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

Ví dụ có thể chạy được:

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 phù hợp của bạn có vẻ là một chút tắt. Trong ví dụ có thể chạy được, bạn bỏ các chữ cái viết hoa, loại bỏ chúng ra khỏi kết quả ("2spooky4ME", "+1" => "3spooky5") và trong ví dụ đầu tiên, bạn khớp với \d+|\D+, tương đương với .+. [a-zA-Z0-9]+là regex bạn muốn, không? Hoặc [a-zA-Z]+|[0-9]+nếu sự chia tách làm cho một sự khác biệt?
Itai Ferber

Có lẽ sẽ dễ dàng hơn để gọi Math.powtrực tiếp vì dù sao bạn cũng phải xử lý trường hợp đặc biệt. Ngoài ra, bạn đang sử dụng phân chia số nguyên?
Neil

@Neil Tôi quên mất rằng, phút
Bálint

@Neil có cách nào tốt hơn cho trần không?
Bálint

1
@ItaiFerber \d+|\D+Không hoàn toàn giống như .+. Chúng không giống nhau vì sự mở rộng kleene xảy ra trước or. Nó sẽ giống nhau nếu nó trông giống như vậy (\d|\D)+, nhưng như vậy, nó sẽ không khớp với tất cả các câu nói 2atrong một nhóm, nó sẽ là hai nhóm riêng biệt.
FryAmTheEggman

5

Julia, 71 59 54 byte

/ 
x%y=replace(x,r"\d+",t->"big($t)"y|>parse|>eval)

Yêu cầu sử dụng bignếu có sẵn làm cho việc này lâu hơn nhiều so với nó có thể là ...

Hãy thử trực tuyến!


4

Kotlin, 416 413 byte

Việc thiếu một eval()trong Kotlin thực sự đã tăng số byte đó ...

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()}));}}

Hãy thử trực tuyến!

Bị đánh cắp

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 byte

# 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'\..*'"}})

(các dòng mới chỉ ở đây để tránh cuộn ngang, chúng hoạt động khi được lưu dưới dạng một dòng).

Nhận xét và phiên bản không được yêu cầu:

$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)
  • Thư viện regex .Net có thể thay thế bằng một scriptblock thực thi nội dung của trận đấu và PowerShell chuyển các chuỗi thành số và iexgiống như eval()trong các ngôn ngữ khác. Nó chỉ làm "2spooky" "+3"->eval("2+3")
  • Ngoại trừ ... nó không thể xử lý ^toán tử hoặc bất kỳ lũy thừa thuận tiện nào khác **, nó chỉ có thể sử dụng lệnh [math]::Pow()gọi thư viện để có một khối lớn để xử lý nhánh đó.
    • Phiên bản cập nhật đánh cắp một ý tưởng từ @TimmyD và thực hiện phép nhân chuỗi - thay vào "2*" * nđó "2*2*2*2*", sau đó thêm +1vào cuối để nhân với một thay vì phàn nàn về dấu vết *.
  • Ngoại trừ ... .Net thực hiện Làm tròn Ngân hàng làm tròn số chẵn gần nhất theo mặc định và 3/2 = 2 thay vì 3/2 = 1. Thử thách này yêu cầu cắt ngắn và điều đó có nghĩa [math]::Truncate(). Thay vào đó, tôi lưu các ký tự bằng cách sử dụng -replaceđể cắt một dấu thập phân và bất cứ thứ gì sau nó.

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

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

Lưu ý Trong thử nghiệm cuối cùng, các số [BigInteger]tự động tràn vào loại , nhưng chúng được hiển thị theo ký hiệu khoa học. May mắn thay, mọi chủng tộc được biết đến có thể giao tiếp giữa các ngôi sao đều có đủ sự phát triển khoa học để có thể xử lý ký hiệu khoa học mà không gặp vấn đề gì.


1
Bạn có thể thấy trong các câu trả lời khác về cách họ cung cấp một phiên bản golf không thể đọc được và sau đó là một phiên bản không được phân tách riêng để kiểm tra hành vi mã. Bạn nên làm điều này với của bạn (cụ thể là, loại bỏ các dòng mới trong phiên bản golf).
jpmc26

Cảm ơn về khoản tín dụng, nhưng không phải là mẹo của tôi - tôi đã rút nó từ chuỗi Mẹo PowerShell.
admBorkBork

Rõ ràng, tôi quan tâm đủ để để lại một bình luận, và một người khác quan tâm đủ để nâng cao nhận xét của tôi. ;)
jpmc26

Không, tôi đã nói rằng bạn nên có một phiên bản chơi golf hoàn toàn và một phiên bản hoàn toàn không có ý thức. Một trong những golfed sẽ yêu cầu di chuyển. Người không có ý chí sẽ không và sẽ dễ đọc hơn người bạn có.
jpmc26

1
@ jpmc26 Ok, tôi đã chỉnh sửa trong một phiên bản nhận xét không được chỉnh sửa.
TessellatingHeckler

3

Bash + GNU coreutils, 144 byte

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=; }
}

Điều này xem xét sự thay đổi giữa các chữ số và không chữ số, đó là lý do tại sao một ký tự đầu vào không hợp lệ ngẫu nhiên (dấu phẩy) được gắn vào chuỗi đầu vào. Dấu phẩy này sau đó được bỏ qua trong đầu ra. Quy ước của OP tuân theo chính xác cú pháp bcđược sử dụng ở đây để làm toán.


Nhân tiện, vì thảo luận trong giải pháp PowerShell của @TessellatingHeckler: Trong giải pháp của tôi, bạn có thể dịch chương trình thành một dòng bằng cách thay thế ngắt dòng thành dấu chấm phẩy, không thay đổi độ dài của nó.
rexkogitans 17/05/2016

3

Lua, 145 93 byte

r=io.read;m=r()o=r()m=m:gsub("%d",function(n)return loadstring("return..."..o)(n)end)print(m)

Tại sao không chỉ đăng một chức năng?
Bálint

2

R, 163 byte

Là một người học các biểu thức chính quy và thay thế chuỗi trong R, điều này tỏ ra là một thử thách khá khó khăn. Đặc biệt là vì khớp số rất dễ nhưng tôi không thể tìm ra cách sử dụng nhiều thay thế gsub. Hơn nữa, tôi không biết liệu eval(parse(paste0(...có phải là cách hiệu quả nhất để chuyển đổi giữa các hoạt động. Có lẽ các switchchức năng phù hợp hơn ở đây.

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="")}

Giải trình

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
}

Tôi nghĩ rằng bạn có thể tiết kiệm được một tấn byte nếu bạn sử dụng gsub với việc đóng trên các trận đấu, đó là những gì bạn gợi ý trong nhận xét của mình. Tôi không biết làm thế nào để làm điều đó trong R mặc dù. Tôi cũng vật lộn với điều đó cho đến khi tôi tìm ra cách để làm điều đó trong Groovy; là một thay đổi trò chơi khá nhiều.
Bạch tuộc ma thuật Urn

2

Javascript (ES6), 85 byte

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

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

Ung dung:

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

Bất cứ ai cũng biết nếu tôi có thể phân chia không gian bằng cách sử dụng toán tử lây lan? Từ s.split này (""); đến ["" ... s]; Ít nhất đó là ý tưởng.
Bladimir Ruiz

Bạn không cần ()xung quanh đối số lambda, bạn không cần var, và bạn nên sử dụng parens và toán tử dấu phẩy thay vì dấu ngoặc nhọn vàreturn
Cyoce

Ngoài ra, ^là một trường hợp đặc biệt đối với JavaScript, nó là XOR bitwise thay vìMath.pow
Sunny Pun

2

Groovy, 64 60 byte

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

Thay thế tất cả các trường hợp chữ số bằng một bao đóng để đánh giá hoạt động trên các phần chữ số của từ được truyền. Nếu thông qua một hàm số mũ, nó sẽ thay thế nó bằng ký hiệu thích hợp. Groovy hoàn toàn xử lý chuyển đổi BigInteger / BigDecimal khi sử dụng Eval.me()vì các chuỗi được phân tích cú pháp có thể nằm ngoài 2^32-1phạm vi.

Giải thích

{a,b->...} - Đóng với hai đối số.

a.replaceAll(/\d+/,{...}) - Tìm kiếm tất cả các chuỗi chữ số trong chuỗi và thay thế bằng một bao đóng.

{Eval.me(it+b.replace("^","**"))} - Cụ thể hơn, một bao đóng với mỗi trận đấu có hoạt động được nối với nó, sau đó được đánh giá là mã Groovy.

.replace("^","**")- Thay thế phiên bản đầu tiên ^bằng toán tử lũy thừa Groovy **trong hoạt động được cung cấp. Nếu bạn muốn điều này hoạt động với các chuỗi phương trình đầy đủ sử dụng số mũ, replaceAll()thay vào đó hãy sử dụng hình phạt +3 byte.

Vui vẻ lưu ý của mình là một kịch bản thử nghiệm hợp lệ:
(22348952345238905290858906209862398036spooky409552me, /200*4943^8-23939+((100/203)+600)


1

RProgN , 39 byte

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

Giải thích

►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. 

Kỹ thuật trả lời không hợp lệ, vì ngôn ngữ này không tồn tại cho nó. Tuy nhiên, nó không được thiết kế riêng cho nó, cũng không có bất kỳ bổ sung cụ thể nào. Vì vậy, tôi đang chạy nó. Kiện tôi.

Hãy thử trực tuyến!


0

Perl 6, 111 byte

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

Thật không may EVALbị tắt theo mặc định. Ngoài ra, bạn phải sử dụng divđể phân chia số nguyên.

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.