Dilema numerik | beragampengetahuan.com – Beragampengetahuan
Oleh: Jonathan Carroll
Diposting ulang dari:
Di lain hari, teka-teki singkat lainnya yang harus dipecahkan dengan menggunakan beberapa pemrograman
bahasa! Ini bagus karena menyelesaikannya tidak memerlukan banyak kode, tapi
ini menggunakan beberapa aspek penilaian yang menarik.
Saya melihat postingan ini
bukanlah hal baru (mulai tahun 2022) menimbulkan masalah baik yang perlu dipecahkan:
Dengan angka 123456789, jumlahkan menjadi 100.
Urutannya harus tetap sama tetapi Anda dapat menggunakan penjumlahan, pengurangan,
perkalian, pembagian, tanda kurung, dll. Semua bilangan harus digunakan tepat satu kali.
dan mendemonstrasikan solusi di Haskell
import Control.Monad (forM)
import Language.Haskell.Interpreter
expressions :: [String]
expressions =
let ops = [ '+', '-', '/', '*' ]
in [ [ '1', a, '2', b, '3', c, '4', d, '5', e, '6', f, '7', g, '8', h, '9' ]
| a <- ops, b <- ops
, c <- ops, d <- ops
, e <- ops, f <- ops
, g <- ops, h <- ops
]
result = runInterpreter $ do
setImports ["Prelude"]
exprs <- forM expressions evaluate
pure $ filter (\(_, a) -> a == "100") $ fromRight [] exprs
where
Saya mencoba mempelajari Haskell tahun ini, jadi ini adalah kesempatan bagus untuk mencobanya
mengikuti. Saya masih berusaha untuk dapat menjalankan skrip pendek
– itu ghci Alat untuk penggunaan interaktif memiliki sedikit kurva pembelajaran dan tidak
segera izinkan saya untuk menggunakan masukan tersebut (atau apakah saya melakukan kesalahan) sehingga sementara saya
Saya pikir saya bisa mengikuti langkah-langkah seperti yang disajikan, saya belum bisa menggali lebih dalam
berinteraksi seperti yang saya inginkan.
Namun, ide umumnya adalah menggunakan pemahaman untuk memperluas semua kombinasi
operator yang diperbolehkan (+, -, /Dan *) antara nilai 1 sampai 9. Saya
agak familiar dengan cara memahami dan memainkannya dalam tulisan saya
Triad Pythagoras dengan pemahaman
dalam banyak bahasa, termasuk Haskell.
Saya ingin melihat bagaimana saya bisa menyelesaikan masalah ini di R, dan saya tahu saya perlu melakukannya
beberapa penyesuaian karena ketidakmampuan R untuk memahami.
Salah satu cara untuk mendapatkan semua kombinasi operator antar nilai adalah dengan menggunakanexpand.grid() menghasilkan semua kombinasi inputnya
expand.grid(1:3, letters[1:3])
## Var1 Var2
## 1 1 a
## 2 2 a
## 3 3 a
## 4 1 b
## 5 2 b
## 6 3 b
## 7 1 c
## 8 2 c
## 9 3 c
Mendefinisikan operator sebagai string, saya bisa membuatnya data.frame nilai dan
semua kombinasi operator di antara mereka
ops <- c("*", "+", "-", "/")
combos <- expand.grid(1, ops, 2, ops, 3, ops, 4, ops, 5, ops, 6, ops, 7, ops, 8, ops, 9)
head(combos)
## Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 Var10 Var11 Var12 Var13 Var14
## 1 1 * 2 * 3 * 4 * 5 * 6 * 7 *
## 2 1 + 2 * 3 * 4 * 5 * 6 * 7 *
## 3 1 - 2 * 3 * 4 * 5 * 6 * 7 *
## 4 1 / 2 * 3 * 4 * 5 * 6 * 7 *
## 5 1 * 2 + 3 * 4 * 5 * 6 * 7 *
## 6 1 + 2 + 3 * 4 * 5 * 6 * 7 *
## Var15 Var16 Var17
## 1 8 * 9
## 2 8 * 9
## 3 8 * 9
## 4 8 * 9
## 5 8 * 9
## 6 8 * 9
Hal ini menciptakan banyak kombinasi – dengan 4 kemungkinan operator dari 8 kemungkinan operator
lokasi ya \(4^8\) = 65.536 kombinasi.
Tempelkan angka dan operator ini ke dalam ekspresi
exprs <- apply(combos, 1, \(x) paste0(x, collapse = ""))
head(exprs)
## [1] "1*2*3*4*5*6*7*8*9" "1+2*3*4*5*6*7*8*9" "1-2*3*4*5*6*7*8*9"
## [4] "1/2*3*4*5*6*7*8*9" "1*2+3*4*5*6*7*8*9" "1+2+3*4*5*6*7*8*9"
Saya mendapatkan sesuatu yang dapat saya evaluasi seolah-olah saya sedang mengetik 1*2*3 ke dalam dasbor. saya bisa mendapatkan
Hasilnya mengevaluasi mereka yang memiliki
results <- sapply(exprs, \(x) eval(parse(text = x)))
head(results)
## 1*2*3*4*5*6*7*8*9 1+2*3*4*5*6*7*8*9 1-2*3*4*5*6*7*8*9 1/2*3*4*5*6*7*8*9
## 362880 362881 -362879 90720
## 1*2+3*4*5*6*7*8*9 1+2+3*4*5*6*7*8*9
## 181442 181443
Sekarang saya tinggal melihat mana yang menghasilkan nilai 100. Karena sapply
membuat vektor dengan ekspresi itu sendiri sebagai namanya, saya dapat mengekstrak namanya
Hasilnya adalah 100
answers <- names(which(results == 100))
answers
## [1] "1*2*3-4*5+6*7+8*9" "1+2+3-4*5+6*7+8*9" "1+2-3*4-5+6*7+8*9"
## [4] "1-2*3-4-5+6*7+8*9" "1+2-3*4+5*6+7+8*9" "1-2*3-4+5*6+7+8*9"
## [7] "1-2*3+4*5+6+7+8*9" "1*2*3+4+5+6+7+8*9" "1+2+3+4+5+6+7+8*9"
## [10] "1+2*3+4*5-6+7+8*9" "1+2*3*4*5/6+7+8*9" "1*2*3*4+5+6-7+8*9"
## [13] "1*2*3*4+5+6+7*8+9" "1-2+3*4*5-6+7*8-9" "1-2+3*4*5+6*7+8-9"
Semua ini dapat dengan mudah diverifikasi secara manual
1*2*3*4+5+6+7*8+9
## [1] 100
Satu hal yang saya perhatikan di sini adalah saya mendapat satu hasil lebih banyak dibandingkan dengan postingan Haskell
pembuatan
length(answers)
## [1] 15
Salah satu jawabannya menonjol karena mengandung pembagian, dan tentu saja ini
yang tidak muncul di artikel Haskell. Saya tidak yakin mengapa – saya
berpikir bahwa prioritas operator adalah sama antara R dan Haskell, setidaknya dalam hal
ekspresi ini
3 / 2 + 1
## [1] 2.5
ghci> 3 / 2 + 1
2.5
Tapi karena aku masih belum bisa kok berlari Saya sendiri yang menulis kode Haskell itu, saya tidak bisa
Verifikasi solusi tersebut.
Solusi R saya untuk teka-teki ini adalah
ops <- c("*", "+", "-", "/")
combos <- expand.grid(1, ops, 2, ops, 3, ops, 4, ops, 5, ops, 6, ops, 7, ops, 8, ops, 9)
exprs <- apply(combos, 1, \(x) paste0(x, collapse = ""))
results <- sapply(exprs, \(x) eval(parse(text = x)))
names(which(results == 100))
Saya ingin mencoba suatu bahasa Mengerjakan berpengetahuan luas – coba Julia!
Membangun pemahaman mungkin agak lama, tapi tidak masalah
ops = ['+', '-', '*', '/']
## 4-element VectorChar:
## '+': ASCII/Unicode U+002B (category Sm: Symbol, math)
## '-': ASCII/Unicode U+002D (category Pd: Punctuation, dash)
## '*': ASCII/Unicode U+002A (category Po: Punctuation, other)
## '/': ASCII/Unicode U+002F (category Po: Punctuation, other)
exprs = ['1' * a * '2' * b * '3' * c * '4' * d * '5' * e * '6' * f * '7' * g * '8' * h * '9'
for a in ops, b in ops, c in ops,
d in ops, e in ops, f in ops,
g in ops, h in ops];
first(exprs, 10)
## 10-element VectorString:
## "1+2+3+4+5+6+7+8+9"
## "1-2+3+4+5+6+7+8+9"
## "1*2+3+4+5+6+7+8+9"
## "1/2+3+4+5+6+7+8+9"
## "1+2-3+4+5+6+7+8+9"
## "1-2-3+4+5+6+7+8+9"
## "1*2-3+4+5+6+7+8+9"
## "1/2-3+4+5+6+7+8+9"
## "1+2*3+4+5+6+7+8+9"
## "1-2*3+4+5+6+7+8+9"
Itu menciptakan array multidimensi
size(exprs)
## (4, 4, 4, 4, 4, 4, 4, 4)
jadi perlu diratakan menjadi vektor dengan vec(). Dari situ mirip
mengikuti pendekatan R dan saya dapat menggunakan eval(Meta.parse()) sampel, hafal
bahwa seseorang dapat ‘menyebarkan’ operasi skalar ke operasi vektor menggunakan titik
(.) operator
results = eval.(Meta.parse.(vec(exprs)));
first(results, 10)
## 10-element VectorReal:
## 45
## 41
## 44
## 42.5
## 39
## 35
## 38
## 36.5
## 46
## 34
Mencari nilai sama dengan 100 mirip dengan metode R
exprs[findall(results .== 100)]
## 15-element VectorString:
## "1*2*3*4+5+6+7*8+9"
## "1-2+3*4*5+6*7+8-9"
## "1-2+3*4*5-6+7*8-9"
## "1+2+3+4+5+6+7+8*9"
## "1*2*3+4+5+6+7+8*9"
## "1-2*3+4*5+6+7+8*9"
## "1+2*3+4*5-6+7+8*9"
## "1-2*3-4+5*6+7+8*9"
## "1+2-3*4+5*6+7+8*9"
## "1+2*3*4*5/6+7+8*9"
## "1*2*3*4+5+6-7+8*9"
## "1-2*3-4-5+6*7+8*9"
## "1+2-3*4-5+6*7+8*9"
## "1+2+3-4*5+6*7+8*9"
## "1*2*3-4*5+6*7+8*9"
dan sekali lagi kita melihat 15 jawaban termasuk satu dengan pembagian dan konfirmasi
Hasil R.
Ini adalah eksplorasi yang menarik – saya rasa saya tidak ingin menghadapinya Tidak tersedia
kode, tetapi solusi kode adalah peluang bagus untuk menggunakan beberapa
bahasa.
Saya menduga ada beberapa cara berbeda untuk menyelesaikan masalah ini selain cara brute force ini
perluas setiap kombinasi, mungkin dengan pemecah atau semacamnya. Jika Anda memilikinya, saya akan melakukannya
senang melihatnya. saya pikir @coolbutuseless melakukan hal seperti ini tetapi paling dekat
Saya dapat menemukan artikel ini
yang sedikit berbeda.
Jika Anda memiliki komentar, saran atau perbaikan, seperti biasa, silakan menggunakannya
Bagian komentar di bawah, atau hubungi saya
mastodon.
alat pengembang::session_info()
## ─ Session info ───────────────────────────────────────────────────────────────
## setting value
## version R version 4.3.3 (2024-02-29)
## os Pop!_OS 22.04 LTS
## system x86_64, linux-gnu
## ui X11
## language (EN)
## collate en_AU.UTF-8
## ctype en_AU.UTF-8
## tz Australia/Adelaide
## date 2024-07-06
## pandoc 3.2 @ /usr/lib/rstudio/resources/app/bin/quarto/bin/tools/x86_64/ (via rmarkdown)
##
## ─ Packages ───────────────────────────────────────────────────────────────────
## package * version date (UTC) lib source
## blogdown 1.18 2023-06-19 [1] CRAN (R 4.3.2)
## bookdown 0.36 2023-10-16 [1] CRAN (R 4.3.2)
## bslib 0.6.1 2023-11-28 [3] CRAN (R 4.3.2)
## cachem 1.0.8 2023-05-01 [3] CRAN (R 4.3.0)
## callr 3.7.3 2022-11-02 [3] CRAN (R 4.2.2)
## cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.3)
## crayon 1.5.2 2022-09-29 [3] CRAN (R 4.2.1)
## devtools 2.4.5 2022-10-11 [1] CRAN (R 4.3.2)
## digest 0.6.34 2024-01-11 [3] CRAN (R 4.3.2)
## ellipsis 0.3.2 2021-04-29 [3] CRAN (R 4.1.1)
## evaluate 0.23 2023-11-01 [3] CRAN (R 4.3.2)
## fastmap 1.1.1 2023-02-24 [3] CRAN (R 4.2.2)
## fs 1.6.3 2023-07-20 [3] CRAN (R 4.3.1)
## glue 1.7.0 2024-01-09 [1] CRAN (R 4.3.3)
## htmltools 0.5.7 2023-11-03 [3] CRAN (R 4.3.2)
## htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.2)
## httpuv 1.6.12 2023-10-23 [1] CRAN (R 4.3.2)
## icecream 0.2.1 2023-09-27 [1] CRAN (R 4.3.2)
## jquerylib 0.1.4 2021-04-26 [3] CRAN (R 4.1.2)
## jsonlite 1.8.8 2023-12-04 [3] CRAN (R 4.3.2)
## JuliaCall 0.17.5 2022-09-08 [1] CRAN (R 4.3.3)
## knitr 1.45 2023-10-30 [3] CRAN (R 4.3.2)
## later 1.3.1 2023-05-02 [1] CRAN (R 4.3.2)
## lifecycle 1.0.4 2023-11-07 [1] CRAN (R 4.3.3)
## magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.3)
## memoise 2.0.1 2021-11-26 [3] CRAN (R 4.2.0)
## mime 0.12 2021-09-28 [3] CRAN (R 4.2.0)
## miniUI 0.1.1.1 2018-05-18 [1] CRAN (R 4.3.2)
## pkgbuild 1.4.2 2023-06-26 [1] CRAN (R 4.3.2)
## pkgload 1.3.3 2023-09-22 [1] CRAN (R 4.3.2)
## prettyunits 1.2.0 2023-09-24 [3] CRAN (R 4.3.1)
## processx 3.8.3 2023-12-10 [3] CRAN (R 4.3.2)
## profvis 0.3.8 2023-05-02 [1] CRAN (R 4.3.2)
## promises 1.2.1 2023-08-10 [1] CRAN (R 4.3.2)
## ps 1.7.6 2024-01-18 [3] CRAN (R 4.3.2)
## purrr 1.0.2 2023-08-10 [3] CRAN (R 4.3.1)
## R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.3)
## Rcpp 1.0.11 2023-07-06 [1] CRAN (R 4.3.2)
## remotes 2.4.2.1 2023-07-18 [1] CRAN (R 4.3.2)
## rlang 1.1.4 2024-06-04 [1] CRAN (R 4.3.3)
## rmarkdown 2.25 2023-09-18 [3] CRAN (R 4.3.1)
## rstudioapi 0.15.0 2023-07-07 [3] CRAN (R 4.3.1)
## sass 0.4.8 2023-12-06 [3] CRAN (R 4.3.2)
## sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.2)
## shiny 1.7.5.1 2023-10-14 [1] CRAN (R 4.3.2)
## stringi 1.8.3 2023-12-11 [3] CRAN (R 4.3.2)
## stringr 1.5.1 2023-11-14 [3] CRAN (R 4.3.2)
## urlchecker 1.0.1 2021-11-30 [1] CRAN (R 4.3.2)
## usethis 2.2.2 2023-07-06 [1] CRAN (R 4.3.2)
## vctrs 0.6.5 2023-12-01 [1] CRAN (R 4.3.3)
## xfun 0.41 2023-11-01 [3] CRAN (R 4.3.2)
## xtable 1.8-4 2019-04-21 [1] CRAN (R 4.3.2)
## yaml 2.3.8 2023-12-11 [3] CRAN (R 4.3.2)
##
## [1] /home/jono/R/x86_64-pc-linux-gnu-library/4.3
## [2] /usr/local/lib/R/site-library
## [3] /usr/lib/R/site-library
## [4] /usr/lib/R/library
##
## ──────────────────────────────────────────────────────────────────────────────
Terkait
Software Terbaru Saat Ini
Aplikasi yang sedang trend saat ini
object oriented programming, programming language, programming adalah, web programming, belajar programming, tournament software, software, software adalah, contoh software, apa itu software, pengertian software, aplikasi, aplikasi penghasil uang, aplikasi bokep, aplikasi video, programming
#Dilema #numerik #beragampengetahuan.com