Maxxie dan Minnie multibahasa | beragampengetahuan.com – Beragampengetahuan
Melanjutkan tema belajar semua bahasa, kesempatan ini saya ambil
teka-teki pemrograman untuk mencoba pendekatan yang sama dalam beberapa
bahasa untuk membandingkan cara kerjanya.
Untuk pertemuan APL mendatang, tantangannya sudah ditentukan di bagian akhir
di posting ini, secara khusus
Ini terlihat menarik – dan saya ingin melihat seperti apa solusinya bagi sebagian orang
dari berbagai bahasa yang saya tahu (termasuk APL, demi versi yang akan datang
bertemu).
Saya akhirnya menggunakan R, (Dyalog) APL, Julia, Haskell, Python dan Rust; seseorang
memberikan solusi J; dan saya akan menambahkan informasi lain yang dibagikan kepada saya. Situs web
Tertaut di atas, solusi Clojure dikumpulkan
gagasan utama ini.
Inilah solusi saya untuk setiap bahasa; itu bukan tentang kebersamaan
bandingkan, namun Anda dapat beralih di antara yang berbeda. Kumpulan file lengkap
di sini jika Anda tertarik.
R
Saya paling akrab dengan R jadi saya ingin memulai dari sana. Saya membuatnya swap
fungsi yang menukar vektor pada indeks tertentu, bersama dengan beberapa bantuan
jadi aku bisa menggunakannya pmap_int() sangat bersih.
swap <- function(x, y, v)
xx <- v[x]
yy <- v[y]
v[x] <- yy
v[y] <- xx
v
chr_swap <- function(x, y, v)
paste0(swap(x, y, v), collapse = "")
toInt_swap <- function(x, y, v)
as.integer(chr_swap(x, y, v))
maxmin <- function(num)
chars <- strsplit(as.character(num), "")[[1]]
n <- nchar(num)
s <- seq_len(n)
opts <- expand.grid(x = s, y = s)
opts$v <- list(chars)
vals <- purrr::pmap_int(opts, toInt_swap)
keeps <- vals[nchar(vals) == n]
c(max(keeps), min(keeps))
maxmin(213)
[1] 312 123
maxmin(12345)
[1] 52341 12345
maxmin(100)
[1] 100 100
maxmin(11321)
[1] 31121 11123
itu expand.grid() menciptakan beberapa kombinasi berlebihan, namun kombinasi ini gagal
keluar secara alami jadi saya tidak repot menyaringnya. Juga karena ini
termasuk swap tidak aktif (misalnya swap indeks 2 Dan 2) sudah berisi
vektor asli. Daripada memfilter berdasarkan vektor bilangan bulat Tidak
dimulai dengan 0, saya memfilter angka yang memiliki jumlah digit yang benar
setelah mengkonversi kembali ke integer, setara.
Coba tempel kodenya
editor online webr di sini; Saya tidak yakin
apakah mungkin untuk menautkan ke keadaan yang ada, tetapi ketika ditanya apakah Anda mau
Untuk menginstal purrr ke antarmuka, harap jawab bahwa Anda melakukannya.
APL
Di Dyalog APL, mendefinisikan fungsi swap lebih mudah; perempuan @ operator mengambil satu
fungsi (berlawanan) jadi s Di sini lakukan pertukaran. Produk luarnya sangat bagus
Nyaman untuk menemukan semua kombinasi x Dan y: x ∘., y.
maxmin←
⎕IO←1 ⍝ so that x[1] is subset not x[0]
n←⍎¨⍕⍵ ⍝ convert int to vec
s←⌽@⍵⊢⍺ ⍝ swap two elements
swaps←n s ⍵ ⍝ apply swaps to a vec n
opts←,(⍳≢n)∘.,⍳≢n ⍝ combinations of 1..n
new←swaps¨opts ⍝ perform the swaps
keep←(~0=⊃¨new)/new ⍝ filter out values starting with 0
(⌈/,⌊/)10⊥¨keep ⍝ max and min of ints
maxmin 213
312 123
maxmin 12345
52341 12345
maxmin 100
100 100
maxmin 11321
31121 11123
Saya cukup puas dengan solusi ini; buat satu map sesederhana
gunakan masing-masing (¨) dan lakukan keduanya max Dan min terhubung bersama
dengan garpu ((⌈/,⌊/)) sangat estetis. Konversi dari vektor
angka menjadi satu angka menggunakan decoding basis 10 (10⊥) itu adalah metode pertama
mungkin perlu melakukannya dalam bahasa lain, tetapi dengan satu putaran.
Jika saya memiliki kebebasan dengan apa yang orang sebut ‘gula’, saya dapat mengatakannya
bahwa ini adalah solusi 1 baris
maxmin←⎕IO←1 ⋄ n←⍎¨⍕⍵ ⋄ s←⌽@⍵⊢⍺ ⋄ swaps←n s ⍵ ⋄ opts←,(⍳≢n)∘.,⍳≢n ⋄ new←swaps¨opts ⋄ keep←(~0=⊃¨new)/new ⋄ (⌈/,⌊/)10⊥¨keep
kamu bisa
Coba ini sendiri di tryapl.org
Julia
Di Julia swap Fungsi dapat menggunakan destrukturisasi, dan itu bagus, tetapi karena
bahasa menggunakan semantik pass-by-reference, saya perlu membuat salinannya
Vektornya ditukar, kalau tidak saya akan terus menukarnya berulang kali.
Catatan: artikel terbaru saya.
using Combinatorics
function swap(x, i, j)
y = copy(x)
y[i], y[j] = y[j], y[i]
y
end
function maxmin(x)
nvec = parse.(Int64, split(string(x), ""))
opts = collect(combinations(1:length(nvec), 2))
new = [[nvec]; map(x -> swap(nvec, x...), opts)]
keep = filter(x -> x[1] != 0, new)
vals = parse.(Int64, join.(keep))
(maximum(vals), minimum(vals))
end
maxmin(213)
(312, 123)
maxmin(12345)
(52341, 12345)
maxmin(100)
(100, 100)
maxmin(11321)
(31121, 11123)
Bagian yang mungkin paling sulit saya hadapi di sini adalah menyatukannya
vektor asli dengan versi yang ditukar; kelihatannya bersih sekarang, tapi
mencari tahu bagaimana memasukkan semua itu ke dalam vektor vektor yang sama membutuhkan waktu lama bagi saya
ketika.
Percikan opts Variasi dalam map Sangat bagus; tidak perlu menentukan
dipertukarkan dalam tupel. Secara keseluruhan, menurut saya, ini adalah solusi yang sangat bersih
opini – Julia benar-benar membuat bahasa yang indah.
Haskell
Melanjutkan perjalanan belajar Haskell saya, saya pikir yang terbaik adalah memilikinya
membahas ini Menjadi bahasa multi-fungsi, seseorang tidak dapat melakukan banyak hal
mendefinisikan variabel, yang satu malah menulis banyak fungsi yang akan lewat
data di sekitarnya. Ini membuat pengujian menjadi sedikit sulit, tetapi saya berhasil
terakhir. Saya harus meminjam swapElts fungsi dan nub adalah yang baru
satu untukku (pada dasarnya unique()).
import Data.List
import Data.Digits
uniq_pairs l = nub [(x,y) | x <- l, y <- l, x < y]
opts n = uniq_pairs [0..n-1]
--
swapElts i j ls = [get k x | (k, x) <- zip [0..length ls - 1] ls]
where get k x | k == i = ls !! j
| k == j = ls !! i
| otherwise = x
doswap t v = swapElts (fst t) (snd t) v
newlist v = v : map (\x -> doswap x v) (opts (length v))
keep v = filter (\x -> (head x /= 0)) (newlist v)
maxmin n = (maximum(x), minimum(x)) where
x = map (unDigits 10) (keep (digits 10 n))
maxmin 213
(312,123)
maxmin 12345
(52341,12345)
maxmin 100
(100,100)
maxmin 11321
(31121,11123)
itu Data.Digits Paket ini sangat berguna di sini – ya digits DanunDigitsmeskipun jika saya ingin menggunakan ini lebih banyak, saya akan makan kari
basis 10 diperlukan menjadi sesuatu seperti digits10 Dan unDigits10.
Kemungkinan besar akan ada perbaikan yang dilakukan di sini dan saya tertarik dengan perbaikan apa pun yang Anda miliki
dikenali!
ular piton
“Semua orang” menggunakannya jadi saya harus mempelajarinya… itulah yang selalu saya katakan pada diri saya sendiri. SAYA
tidak asing dengan kekhasan bahasa yang berbeda, tetapi setiap kali saya mencobanya
untuk melakukan sesuatu yang fungsional dengan python, saya akhirnya marah karena metode cetaknya
Generator menampilkan alamat memori, bukan beberapa elemen pertama.
Cetak nilai dan lihat <map at 0x7fb928d4a2c0> bantu aku dalam segala hal. lajang.
waktu. Ya ya, list(value) “kumpulkan” itu, tapi grrr…
Python memiliki sintaksis destrukturisasi yang sangat bagus swap berfungsi, tapi
sekali lagi, ini adalah referensi ke depan jadi saya perlu membuat salinannya terlebih dahulu.
import itertools
def swap(x, t):
y = x.copy()
i, j = t
y[i], y[j] = y[j], y[i]
return y
def minmax(num):
nums = [int(i) for i in str(num)]
opts = itertools.combinations(range(len(nums)), 2)
new = map(lambda x: swap(nums, x), list(opts))
keeps = list(filter(lambda x: x[0] != 0, new))
keeps.append(nums)
vals = list(map(lambda x: int(''.join(map(str, x))), keeps))
return (max(vals), min(vals))
minmax(213)
(312, 123)
minmax(12345)
(52341, 12345)
minmax(100)
(100, 100)
minmax(11321)
(31121, 11123)
Terlepas dari omelan saya saat menulisnya, solusinya masih cukup jelas.
Panggilan masuk list() Interleaving secara keseluruhan dapat dihindari, namun
perlu melakukannya sambil mengembangkan setidaknya memperlambat saya.
karat
Saya hampir tidak menerapkan solusi Rust karena saya pikir saya sudah melakukan cukup banyak. Dia
Namun, ini akhirnya menjadi yang paling rumit – saya tidak yakin apakah itu alasannya
milikku, atau Rust.
use itertools::Itertools;
fn swap(v: Vec<u32>, t1: usize, t2: usize) -> Vec<u32>
let mut vv = v;
let tmp1 = vv[t1];
let tmp2 = vv[t2];
vv[t1] = tmp2;
vv[t2] = tmp1;
return vv;
fn maxmin(num: u32) -> (u32, u32) c.to_digit(10).unwrap())
.collect();
let mut opts = Vec::new();
for (a, b) in (0..n).tuple_combinations()
opts.push((a, b));
let mut new: Vec<Vec<u32>> = Vec::new();
new.push(numv.clone());
for o in opts
new.push(swap(numv.clone(), o.0, o.1));
let keeps: Vec<Vec<u32>> = new.into_iter().filter(
fn main()
println!(":?", maxmin(213));
println!(":?", maxmin(12345));
println!(":?", maxmin(100));
println!(":?", maxmin(11321))
(312, 123)
(52341, 12345)
(100, 100)
(31121, 11123)
Solusi ini mengingatkan saya mengapa saya suka bekerja dengan array (atau
setidaknya bahasa yang mendukung vektor); Tidak perlu mengulanginya secara eksplisit
setiap elemen vektor untuk melakukan sesuatu. Saya harus banyak menulis push()
loop untuk memindahkan data. max() tidak beroperasi pada vektor (dalam artian
tentukan nilai maksimum n elemen); itu bekerja seperti itu pada iterator dan bisa
kegagalan, oleh karena itu semakin lama min Dan max saat ini.
Benar clone() Nilainya jelas berbeda karena tidak dapat digunakan kembali
Agak menjengkelkan, tapi aku mengerti Mengapa ia mengeluh tentang hal-hal itu.
Ini memakan waktu lebih lama dari yang saya inginkan, tetapi tentu saja saya belajar lebih banyak dalam prosesnya
sedang melakukannya.
J
Pada pertemuan APL, kami membahas solusi parsial J yang menggunakan sedikit
Pendekatannya berbeda dengan algoritma ‘swap’. Saya tidak yakin itu ada Menjadi Satu
Ya, sama elegannya dengan solusi APL, tapi saya tertarik jika
Memiliki.
Justus Perlwitz menyarankan
ini
solusinya, intinya adalah
digits =: 10&#.^:_1
sd =: .y)
swap =. (y ]) amend ]
swap &.: digits x
cart =: {{
all =. ,/ (,"0)/~ y
uniq =. ~. /:~"1 all
l =. 0"1 uniq
r =. 1"1 uniq
(l ~: r) # uniq
swapmaxmin =:
ndigits =. [: # digits
combs =. cart i. ndigits y
constr =. ((ndigits y) <: [: ndigits"0 ]) # ]
swaps =. constr y, y sd"1 combs
(>./ , <./) swaps
swapmaxmin 213
312 123
swapmaxmin 12345
52341 12345
swapmaxmin 100
100 100
swapmaxmin 11321
31121 11123
dan kamu bisa menemuinya
J taman bermain
Ada banyak hal yang ingin saya pelajari tentang J, jadi saya akan menggali lebih dalam
selesaikan sendiri.
Contents
Ringkasan
Saya paling puas dengan solusi APL; itu melakukan apa yang tertulis di kotak
tidak ada ambiguitas karena seluruhnya dibangun dari primitif (atau utilitas
fungsi didefinisikan dalam istilah fungsi tersebut). Solusi Julia juga terasa sangat bersih,
sedangkan solusi Haskell, yang sepenuhnya ditentukan dari fungsi, ditampilkan dengan baik
prinsip fungsional.
Menurut saya ini adalah contoh referensi silang yang menarik Tidak Karena itu
berguna. Untuk fungsi Julia yang dienkapsulasi, perbedaan tersebut diungkapkan dengan jelas oleh! sufiks untuk menunjukkan fungsi transformasi, dan orang sering menulis keduanya
versi yang bermutasi dan tidak bermutasi bila memungkinkan.
Menulis hal-hal ini mengajari saya lebih banyak lagi tentang cara menggunakan masing-masing bahasa ini dan
Saya berpendapat bahwa hanya dengan membaca solusinya tidak ada pengganti untuk mendapatkannya
Dapatkan beberapa kode nyata.
Komentar, perbaikan, atau solusi Anda sangat kami harapkan. Saya dapat ditemukan di
Mastodon atau gunakan komentar di bawah.
alat pengembang::session_info()
## ─ Session info ───────────────────────────────────────────────────────────────
## setting value
## version R version 4.4.1 (2024-06-14)
## os macOS Sonoma 14.6
## system aarch64, darwin20
## ui X11
## language (EN)
## collate en_US.UTF-8
## ctype en_US.UTF-8
## tz Australia/Adelaide
## date 2024-10-26
## pandoc 3.2 @ /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/aarch64/ (via rmarkdown)
##
## ─ Packages ───────────────────────────────────────────────────────────────────
## package * version date (UTC) lib source
## blogdown 1.19 2024-02-01 [1] CRAN (R 4.4.0)
## bookdown 0.41 2024-10-16 [1] CRAN (R 4.4.1)
## bslib 0.8.0 2024-07-29 [1] CRAN (R 4.4.0)
## cachem 1.1.0 2024-05-16 [1] CRAN (R 4.4.0)
## cli 3.6.3 2024-06-21 [1] CRAN (R 4.4.0)
## devtools 2.4.5 2022-10-11 [1] CRAN (R 4.4.0)
## digest 0.6.37 2024-08-19 [1] CRAN (R 4.4.1)
## ellipsis 0.3.2 2021-04-29 [1] CRAN (R 4.4.0)
## evaluate 1.0.1 2024-10-10 [1] CRAN (R 4.4.1)
## fastmap 1.2.0 2024-05-15 [1] CRAN (R 4.4.0)
## fs 1.6.4 2024-04-25 [1] CRAN (R 4.4.0)
## glue 1.8.0 2024-09-30 [1] CRAN (R 4.4.1)
## htmltools 0.5.8.1 2024-04-04 [1] CRAN (R 4.4.0)
## htmlwidgets 1.6.4 2023-12-06 [1] CRAN (R 4.4.0)
## httpuv 1.6.15 2024-03-26 [1] CRAN (R 4.4.0)
## jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.4.0)
## jsonlite 1.8.9 2024-09-20 [1] CRAN (R 4.4.1)
## knitr 1.48 2024-07-07 [1] CRAN (R 4.4.0)
## later 1.3.2 2023-12-06 [1] CRAN (R 4.4.0)
## lifecycle 1.0.4 2023-11-07 [1] CRAN (R 4.4.0)
## magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.4.0)
## memoise 2.0.1 2021-11-26 [1] CRAN (R 4.4.0)
## mime 0.12 2021-09-28 [1] CRAN (R 4.4.0)
## miniUI 0.1.1.1 2018-05-18 [1] CRAN (R 4.4.0)
## pkgbuild 1.4.4 2024-03-17 [1] CRAN (R 4.4.0)
## pkgload 1.4.0 2024-06-28 [1] CRAN (R 4.4.0)
## profvis 0.4.0 2024-09-20 [1] CRAN (R 4.4.1)
## promises 1.3.0 2024-04-05 [1] CRAN (R 4.4.0)
## purrr 1.0.2 2023-08-10 [1] CRAN (R 4.4.0)
## R6 2.5.1 2021-08-19 [1] CRAN (R 4.4.0)
## Rcpp 1.0.13 2024-07-17 [1] CRAN (R 4.4.0)
## remotes 2.5.0 2024-03-17 [1] CRAN (R 4.4.0)
## rlang 1.1.4 2024-06-04 [1] CRAN (R 4.4.0)
## rmarkdown 2.28 2024-08-17 [1] CRAN (R 4.4.0)
## rstudioapi 0.17.0 2024-10-16 [1] CRAN (R 4.4.1)
## sass 0.4.9 2024-03-15 [1] CRAN (R 4.4.0)
## sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.4.0)
## shiny 1.9.1 2024-08-01 [1] CRAN (R 4.4.0)
## urlchecker 1.0.1 2021-11-30 [1] CRAN (R 4.4.0)
## usethis 3.0.0 2024-07-29 [1] CRAN (R 4.4.0)
## vctrs 0.6.5 2023-12-01 [1] CRAN (R 4.4.0)
## xfun 0.48 2024-10-03 [1] CRAN (R 4.4.1)
## xtable 1.8-4 2019-04-21 [1] CRAN (R 4.4.0)
## yaml 2.3.10 2024-07-26 [1] CRAN (R 4.4.0)
##
## [1] /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/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
#Maxxie #dan #Minnie #multibahasa #beragampengetahuan.com