Maxxie dan Minnie multibahasa | beragampengetahuan.com

 – Beragampengetahuan
1 min read

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 Dan
    unDigitsmeskipun 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

    Tinggalkan Balasan

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