Penerjemah Universal Spooky Meme

43

pengantar

Ternyata, meme cinta alien sama seperti kita. Setiap ras alien yang kami temui sejauh ini memiliki versinya sendiri 2spooky4me(lihat pertanyaan berikut ) dan setara, dengan beberapa variasi. Penghuni planet CUTE1f tidak bisa menangani banyak hantu, jadi hantu yang mereka sukai adalah 1spooky2me, sementara para pemudi kerangka menyukai mereka hantu, jadi mereka cenderung menggunakannya 9spooky11me.

Tantangan

Menerjemahkan meme adalah pekerjaan yang sulit, jadi Anda telah ditugaskan menulis penerjemah meme universal untuk membantu orang-orang ini mengakses memenet dengan benar. Program Anda akan menerima meme dan transformasi untuk diterapkan pada urutan digit dalam meme itu agar sesuai untuk penduduk planet yang berbeda.

Memasukkan

Program Anda akan menerima dua input string:

  1. Meme input (misalnya 2spooky4me). Cocok [a-zA-Z0-9]+.
  2. Transformasi untuk diterapkan padanya (mis +1. Untuk beralih dari 2spooky4meke 3spooky5me). Pertandingan [+\-*/^]\d+(Anda harus menerima +, -, *, /, dan ^sebagai operator, terlepas dari representasi asli dalam bahasa Anda).

Keluaran

Program Anda harus mengembalikan output string (dicetak ke output standar atau setara) dengan transformasi yang diberikan diterapkan pada urutan digit dalam meme input. Dalam peristiwa yang aneh, ternyata juga semua ras yang ditemui sejauh ini lebih memilih meme integral daripada yang fraksional, sehingga transformasi ini harus melakukan aritmatika bilangan bulat (misalnya 1spooky1me /2harus menghasilkan 0spooky0me).

Contohnya

Operasi aritmatika standar berlaku:

Input:  2spooky4me +1
Output: 3spooky5me

Input:  2spooky4me -1
Output: 1spooky3me

Input:  2spooky4me *15
Output: 30spooky60me

Input:  10spooky900me /5
Output: 2spooky180me

Urutan digit adalah integral; pemotongan bilangan bulat harus terjadi dalam kasus-kasus seperti ini:

Input:  idontunderstandmemes3 /2
Output: idontunderstandmemes1

Input Anda mungkin tidak memiliki urutan digit apa pun:

Input:  notreallyafunnymeme *100
Output: notreallyafunnymeme

Anda harus mendukung eksponensial, meskipun itu bukan operasi asli dalam bahasa pilihan Anda:

Input:  2spooky4me ^3
Output: 8spooky64me

Tidak ada batasan panjang string dari jumlah urutan digit dalam string:

Input:  some1meme2sequences3can4be5really6long7 /2
Output: some0meme1sequences1can2be2really3long3

Tambahan

Jika bahasa Anda mendukung bilangan bulat presisi sembarang sebagai fitur bahasa, Anda harus menggunakannya. Jika tidak, Anda tidak perlu mendukung integer presisi sewenang-wenang. Misalnya, Anda harus menggunakan Integerdalam Haskell bukan Intkarena itu tersedia sebagai bagian dari bahasa; di Java, Anda tidak diharuskan untuk menggunakannya BigIntegerkarena ini fitur perpustakaan, bukan fitur bahasa.

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

Ini , sehingga celah standar dilarang, dan jawaban terpendek dalam byte menang!

Papan peringkat

Cuplikan Stack di bagian bawah posting ini menghasilkan leaderboard dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

## Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:

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

Itai Ferber
sumber
3
Kasing terakhir Anda salah. Anda memiliki satu nol terlalu banyak dalam output untuk menjadi / 5.
Nic Hartley
5
Pertama-tama ini adalah posting pertama yang disatukan dengan cukup baik, jadi selamat :) Perhatikan kami memiliki Sandbox di mana Anda dapat memposting tantangan Anda untuk umpan balik sebelum ditayangkan.
FryAmTheEggman
3
Selamat datang di PPCG (meskipun Anda tampaknya sudah berada di sini selama 2+ tahun). Tantangan pertama yang bagus. Apakah adendum tentang bilangan bulat presisi arbitrer mengamanatkan bahwa, misalnya, Java harus digunakan BigIntegeruntuk perhitungannya?
AdmBorkBork
18
Setiap ras alien yang kami temui sejauh ini ... Itu sepenuhnya benar! :-)
Luis Mendo
2
Ini tantangan Anda dan akhirnya terserah Anda, tetapi itu tidak terlalu adil terhadap bahasa yang menggunakan sintaksis yang berbeda.
Dennis

Jawaban:

10

Jolf, 15 14 byte

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

Coba di sini!

Penjelasan

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

Menyenangkan untuk dicatat, saya memperbarui Jolf setelah tantangan ini, menambahkan beberapa bawaan RegExp. Ini bisa 12 11 byte:

ρiLRdC!6+HI
Conor O'Brien
sumber
24

Ruby, 50 44 43 byte

FGITW menjawab. Harus cepat!

Terima kasih kepada @Neil untuk menghemat 6 byte.

Oh benar, dicoret 44 masih 44

->m,t{m.gsub(/\d+/){eval$&+t.sub(?^,'**')}}
Nilai Tinta
sumber
Oh, man, ini hampir persis jawaban saya menusuk jauh di: a=gets;$><<gets.gsub(/\d+/){eval$&+a}. Milik saya melewatkan hal ^! = **, dan mungkin sedikit lebih lama.
Nic Hartley
3
+1 untuk seluruh solusi Anda menjadi 4 byte lebih pendek dari yang dibutuhkan di PowerShell hanya untuk menangani ^. : D
AdmBorkBork
15

Perl, 36 34 byte

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

Kode sumber panjangnya 30 byte dan membutuhkan sakelar -pi( +4 byte ). Dibutuhkan input pertama dari STDIN, input kedua sebagai argumen -i.

Terima kasih kepada @DenisIbaev untuk bermain golf 2 byte!

Uji di Ideone .

Dennis
sumber
Ya, saya pikir jika ada yang bisa mengalahkan jawaban Ruby saya, itu akan menjadi Dennis dan / atau berada di Perl, dan Anda akhirnya memenuhi kedua harapan pada saat yang sama
Value Ink
1
-piadalah 4 byte?
CalculatorFeline
@CatsAreFluffy Konsensus saat ini adalah untuk menghitung jarak sunting dari doa tanpa tanda. Itu termasuk ruang untuk terpisah -pidari sisa perintah.
Dennis
"0|$&"lebih pendek dari "0|".$&.
Denis Ibaev
@DenisIbaev Karena inputnya alfanumerik, "0|$&$^I"berfungsi juga. Terima kasih!
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{$_}})

Ooof ... 47 bytes hanya untuk memperhitungkan ^karena itu bukan operator asli di PowerShell. Disimpan 2 byte berkat @TessellatingHeckler.

Mengambil input sebagai $a=<word>, $b=<operation>seperti .\universal-spooky-meme.ps1 2spooky4me ^3. Kami -split $apada digit, melampirkan bahwa dalam parens sehingga kami menjaga pembatas, dan pipa array yang dihasilkan melalui loop |%{...}. Jika bagian saat ini adalah angka, kita berada di bagian pertama if. Kita perlu memeriksa apakah karakter pertama $badalah ^. Jika tidak, kami hanya menggabungkan bagian kami saat ini dan $bdan mengirimkannya ke iex(mirip dengan eval), lalu meninggalkannya di saluran pipa. Kalau tidak, kita perlu membuat string eksponensial dengan "$_*"*$b.Trim('^')+1dan mem-pipe-nya iex, dan membiarkannya pada pipeline. Untuk 2spooky4me ^3contoh yang diberikan , ini akan menjadi 2*2*2*1dan 4*4*4*1, masing-masing.

Kalau tidak, kita biarkan saja apa adanya di pipeline.

Semua hasil tersebut dikumpulkan dari pipa dengan parens enkapsulasi sebelum -joindisatukan kembali menjadi satu string. Itu adalah re-left pada pipeline, dan output tersirat pada penghentian program.

Contohnya

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

PS C:\Tools\Scripts\golfing> .\universal-spooky-meme.ps1 2spooky4me /3
0spooky1me
AdmBorkBork
sumber
Saya menulis sendiri sebelum melihat jawaban, lalu saya mencubit beberapa ide Anda juga - terima kasih. Saya pikir Anda bisa menggantikan Floor(("$_$b"|iex))dengan Floor((iex $_$b))untuk menyelamatkan pasangan, atau mungkin iex $_+$b.
TessellatingHeckler
@TessellatingHeckler Terima kasih untuk dua byte!
AdmBorkBork
8

JavaScript (ES7), 58 57 byte

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

Sunting: Disimpan 1 byte ketika saya ingat itu replacejuga berfungsi pada string literal.

Neil
sumber
Keren, saya sedang mengerjakan solusi ES6
Bálint
Bisakah Anda menjelajah untuk menyimpan satu byte?
gcampbell
1
@ gcampbell Ya, tapi saya terlalu malas untuk melakukannya.
Neil
6

Pyth, 29

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

Ini bekerja dengan mengekstraksi setiap angka dari meme, dan kemudian interleaving ( .i) diikuti oleh spasi dan dibungkus daftar dengan argumen lain. Jadi, jika nomor kami adalah 7dan kami memiliki ^20kita akan mendapatkan daftar: ["^", "7 ", "20"]. Meratakan dan menggunakan Pyth eval( .v) pada ini selalu memberikan operasi yang kita inginkan. Akhirnya nilai-nilai ini disatukan dengan string asli yang terpecah pada kemunculan angka.

Ini bisa lebih pendek satu byte jika kedua input dikelilingi oleh karakter kutipan, atau dua byte lebih pendek jika hanya satu dari mereka yang dapat dikutip.

Cobalah di sini atau jalankan Test Suite

FryAmTheEggman
sumber
6

Python 2, 156 89 88 87 byte

Terinspirasi oleh jawaban lain yang menggunakan fungsi substitusi bahasa mereka dengan penangan fungsi untuk memproses bagian numerik dari istring nput panjang dengan operator. Sial untuk Python, ^harus diganti oleh **, yang menelan biaya 18 byte kekalahan. The .group(0)panggilan hanya untuk mengakses objek pertandingan 's representasi string tidak membuat hal-hal yang lebih baik ...

Terima kasih kepada QPaysTaxes karena telah menemukan ruang palsu dan RootTwo untuk argumen yang tidak perlu .group!

import re
lambda i,o:re.sub(r'\d+',lambda p:str(eval(p.group()+o.replace('^','**'))),i)
ojdo
sumber
Saya pikir Anda dapat menyingkirkan ruang setelahi,o:
Nic Hartley
Anda dapat menyimpan dua byte lagi: (1) dengan menggunakan p.group(). (defaultnya ke 0); dan (2) masukkan r=re.sub;ganti re.subpanggilan pertama dengan rdan kemudian gunakan r('^','**',o)sebagai gantinyao.replace(...)
RootTwo
@RootTwo: Bagi saya, r('^','**',o)maka membutuhkan melarikan diri ^ke \^agar sesuai dengan karakter, bukan awalo , menghemat bersih tanpa byte :-( - tapi terima kasih telah menunjukkan yang tidak perlu 0!
ojdo
5

Javascript (ES6) 99 byte

Contoh lain, mengapa kita benci menunggu ES7 untuk mendapatkan kompatibilitas

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

Contoh yang bisa dijalankan:

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

Bálint
sumber
Regex yang cocok Anda tampaknya agak tidak aktif. Dalam contoh yang dapat dijalankan, Anda meninggalkan huruf besar, yang menghapusnya dari hasil ("2spooky4ME", "+1" => "3spooky5"), dan dalam contoh pertama, Anda cocok dengan \d+|\D+, yang setara dengan .+. [a-zA-Z0-9]+adalah regex yang Anda inginkan, bukan? Atau [a-zA-Z]+|[0-9]+jika pemisahan itu membuat perbedaan?
Itai Ferber
Mungkin akan lebih mudah untuk memanggil Math.powsecara langsung karena Anda harus huruf besar-kecil pula. Juga, apakah Anda menggunakan divisi integer?
Neil
@Neil Saya lupa itu, menit
Bálint
@ Neil apakah ada cara yang lebih baik untuk langit-langit?
Bálint
1
@ ItaiFerber \d+|\D+Tidak sama dengan .+. Mereka tidak sama karena ekspansi tisu terjadi sebelum or. Itu akan sama jika terlihat seperti (\d|\D)+, tetapi karena, itu tidak akan cocok dengan semua yang dikatakan 2adalam satu kelompok, itu akan menjadi dua kelompok yang terpisah.
FryAmTheEggman
5

Julia, 71 59 54 byte

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

Persyaratan untuk digunakan bigjika tersedia membuat ini jauh lebih lama daripada ...

Cobalah online!

Dennis
sumber
4

Kotlin, 416 413 Bytes

Kurangnya eval()di Kotlin benar-benar meningkatkan jumlah 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()}));}}

Cobalah secara Online!

Tidak disatukan

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() }))
    }
}
The_Lone_Devil
sumber
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'\..*'"}})

(baris baru hanya di sini untuk menghindari pengguliran horizontal, mereka bekerja ketika disimpan sebagai satu baris).

Komentar, dan versi ungolfed diminta:

$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)
  • Pustaka regex .Net dapat melakukan penggantian dengan scriptblock yang mengeksekusi pada konten pertandingan, dan PowerShell melemparkan tipe string ke angka, dan iexseperti eval()dalam bahasa lain. Itu hanya "2spooky" "+3"->eval("2+3")
  • Kecuali ... itu tidak dapat menangani ^operator atau eksponensial nyaman lainnya seperti **, itu hanya dapat menggunakan [math]::Pow()panggilan perpustakaan sehingga ada blok besar untuk menangani cabang itu.
    • Versi yang diperbarui mencuri ide dari @TimmyD dan melakukan penggandaan string sebagai gantinya - "2*" * nyang menjadi "2*2*2*2*"dan kemudian menambahkan +1di akhir untuk mengalikan dengan satu alih-alih mengeluh tentang trailing *.
  • Kecuali ... .Net melakukan Rounding Banker yang membulatkan ke angka genap terdekat secara default, dan 3/2 = 2 daripada 3/2 = 1. Tantangan ini membutuhkan pemotongan, dan itu artinya [math]::Truncate(). Sebagai gantinya, saya menyimpan karakter dengan menggunakan -replaceuntuk memotong titik desimal dan apa pun setelahnya.

Kasus uji:

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. Dalam tes terakhir angka-angka meluap menjadi tipe [BigInteger]secara otomatis, tetapi mereka diberikan dalam notasi ilmiah. Untungnya, setiap ras yang dikenal mampu berkomunikasi antara bintang-bintang memiliki perkembangan ilmiah yang cukup untuk dapat memproses notasi ilmiah tanpa masalah.

TessellatingHeckler
sumber
1
Anda dapat melihat di jawaban lain bagaimana mereka memberikan versi golf yang agak tidak dapat dibaca dan kemudian versi yang tidak dipisahkan untuk memeriksa perilaku kode. Anda harus melakukan ini dengan milik Anda (yaitu, hapus baris baru dalam versi golf).
jpmc26
Terima kasih atas kreditnya, tetapi bukan trik saya - saya menariknya dari utas Tips PowerShell.
AdmBorkBork
Rupanya, saya cukup peduli untuk meninggalkan komentar, dan orang lain cukup peduli untuk meningkatkan komentar saya. ;)
jpmc26
Tidak, saya katakan Anda harus memiliki versi yang sepenuhnya golf dan versi yang sepenuhnya ungolfed. Yang golf membutuhkan pengguliran. Yang ungolfed tidak akan dan akan lebih mudah dibaca daripada yang Anda miliki.
jpmc26
1
@ jpmc26 Ok, saya sudah mengedit dalam versi, komentar yang ungolfed.
TessellatingHeckler
3

Bash + GNU coreutils, 144 Bytes

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

Ini terlihat pada perubahan antara digit dan non-digit, itu sebabnya karakter input acak tidak valid (koma) ditambahkan ke string input. Koma ini kemudian diabaikan dalam output. Konvensi OP mengikuti persis sintaks bcyang digunakan di sini untuk melakukan matematika.

rexkogitans
sumber
Ngomong-ngomong karena diskusi dalam solusi PowerShell oleh @TessellatingHeckler: Dalam solusi saya, Anda dapat menerjemahkan program ke satu baris dengan mengganti jeda baris ke titik koma, yang tidak mengubah panjangnya.
rexkogitans
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)
Pengobrol
sumber
Mengapa tidak memposting fungsi saja?
Bálint
2

R, 163 byte

Sebagai seseorang yang belajar ekspresi reguler dan penggantian string dalam R, ini terbukti menjadi tantangan yang cukup sulit. Terutama karena mencocokkan angka-angka itu mudah tetapi saya tidak dapat menemukan cara untuk menggunakan banyak pergantian gsub. Selain itu, saya tidak tahu apakah eval(parse(paste0(...ini cara yang paling efisien untuk beralih antar operasi. Mungkin switchfungsi-lebih cocok di sini.

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

Penjelasan

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
}
Billywob
sumber
Saya pikir Anda dapat menghemat satu ton byte jika Anda menggunakan gsub dengan penutupan pada pertandingan, yang merupakan apa yang Anda mengisyaratkan dalam komentar Anda. Saya tidak tahu bagaimana melakukannya di R. Saya berjuang dengan itu juga sampai saya tahu bagaimana melakukannya di Groovy; cukup banyak pengubah permainan.
Magic Gurita Guci
2

Javascript (ES6), 85 Bytes

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

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

Tidak Disatukan:

x = (s) => {
  var a = s.split(" ");
  return [...a[0]].map(x => (!isNaN(x)) ? eval(x + a[1]) : x).join ``
}
console.log(x("2spookie5me +1"));
Bladimir Ruiz
sumber
Adakah yang tahu jika saya dapat membagi spasi menggunakan operator Spread? Dari s.split ("") ini; ke ["" ... s]; Setidaknya itulah idenya.
Bladimir Ruiz
Anda tidak perlu ()menggunakan argumen lambda, Anda tidak perlu var, dan Anda harus menggunakan parens dan operator koma sebagai ganti kawat gigi danreturn
Cyoce
Juga, ^adalah kasus khusus untuk JavaScript, itu adalah XOR bitwise bukannyaMath.pow
Sunny Pun
2

Groovy, 64 60 Bytes

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

Mengganti semua instance digit dengan penutupan yang mengevaluasi operasi pada bagian digit kata yang dilewati. Jika melewati fungsi eksponen, itu menggantinya dengan notasi yang tepat. Groovy secara implisit menangani konversi BigInteger / BigDecimal saat menggunakan Eval.me()karena string yang diuraikan dapat berpotensi berada di luar 2^32-1jangkauan.

Dijelaskan

{a,b->...} - Penutupan dengan dua argumen.

a.replaceAll(/\d+/,{...}) - Cari semua urutan digit dalam string dan ganti dengan penutupan.

{Eval.me(it+b.replace("^","**"))} - Lebih khusus lagi, penutupan dengan setiap pertandingan memiliki operasi ditambahkan padanya, kemudian dievaluasi sebagai kode asyik.

.replace("^","**")- Ganti instance pertama ^dengan operator eksponen groovy **dalam operasi yang disediakan. Jika Anda ingin ini bekerja dengan string persamaan penuh yang menggunakan eksponen, gunakan replaceAll()sebagai ganti untuk hukuman +3 byte.

Catatan samping yang menyenangkan adalah skenario pengujian yang valid:
(22348952345238905290858906209862398036spooky409552me, /200*4943^8-23939+((100/203)+600)

Guci Gurita Ajaib
sumber
1

RProgN , 39 Bytes

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

Dijelaskan

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

Secara teknis jawaban tidak valid, karena bahasa ini tidak ada untuk itu. Namun, itu tidak dirancang khusus untuk itu, atau penambahan khusus apa pun. Jadi saya menjalankannya. Menuntutku.

Cobalah secara Online!

ATaco
sumber
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}

Sayangnya EVALdinonaktifkan secara default. Juga, Anda harus menggunakan divuntuk divisi integer.

bb94
sumber