1 min read

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 menggunakan
expand.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
## 
## ──────────────────────────────────────────────────────────────────────────────

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

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *