pengenalan kode 2025

 – Beragampengetahuan
5 mins read

pengenalan kode 2025 – Beragampengetahuan

Oleh: Domenic Di Francesco

Diposting ulang dari:

Contents

TLDR

Code Emergence adalah situs yang dibuat oleh Eric Wastl yang merilis teka-teki pemrograman (yang semakin menantang) setiap hari. Tahun ini kita tidak akan mendapatkan 25 hari seperti biasanya (saya tidak pernah melakukannya), melainkan akan berakhir pada 12 Desember (lihat pengumuman di Reddit). Ini adalah perubahan yang disambut baik bagi saya.

Peringatan spoiler: sangat tidak optimal, tapi semoga solusi Julia dapat dibaca terlebih dahulu, jadi sebaiknya Anda berhati-hati. Mari kita lihat bagaimana kita melangkah…

Bermain dengan:


Hari 1: kata sandi dari brankas palsu 🔓

Jadi kita punya brankas ini, dengan dial disetel ke 50dan urutan lintasannya, lihat di bawah:

seq = ["L68", "L30", "R48", "L5", "R60", "L55", "L1", "L99", "R14", "L82"]

Di sini, huruf “R” berarti kita memutar dial ke kanan dan huruf “L” berarti kita memutar dial ke kiri, diikuti dengan angka yang menunjukkan jumlah putaran. “L68” berarti memutar ke kiri sebanyak 68 kali. Pelat jamnya melingkari, jadi jika kita belok kiri dari 0, kita akan sampai ke 99, 98, dan seterusnya.

Kami ditanya:

  • bagian 1: berapa kali kita mencapai nol setelah satu putaran?
  • bagian 2: berapa kali total kita memutar melalui 0?

Pembagian lantai fld() akan menghitung berapa kali kita mengorbit nol (dan ke arah mana).

function get_passwords(seq::VectorString, dial_start::Int = 50, dial_mod::Int = 100)

    dial = dial_start; pass_zeros = 0; end_zeros = 0

    for turn  seq
        direction = turn[1]; turns = parse(Int, turn[2:end])
        
        if direction == 'R'

            pass_zeros += fld(dial + turns, dial_mod)
            dial += turns

        elseif direction == 'L'

            # we need to catch the case where the dial starts at 0 and not count that first turn
            pass_zeros -= fld(dial - turns - 1, dial_mod) - fld(dial - 1, dial_mod)
            dial -= turns
            
        end

        dial = mod(dial, dial_mod)

        if dial == 0
            end_zeros += 1
        end
    end

    return (end_zeros=end_zeros, pass_zeros=pass_zeros)
end
get_passwords (generic function with 3 methods)

Tindakan pembuka yang bagus, dan saya membuat kesalahan dalam tebakan pertama saya untuk bagian 2, melupakan kasus di mana dial dimulai pada 0 dan kami berbelok ke kiri. Kita tidak boleh menghitung belokan pertama itu sebagai melewati nol sehingga saya harus menambahkan titik awal dan akhir pada offset -1 tersebut.

seq |> get_passwords
(end_zeros = 3, pass_zeros = 6)

Hari 2: ID palsu di toko suvenir 🎁

Kami mendapatkan string ‘ID produk’ ini dari toko suvenir dan kami perlu mengurutkannya untuk mengetahui mana yang tidak valid. ID bermasalah yang kita cari sudah dibuat-buat monopoli ulangi serangkaian angka.

product_ids = ["11-22", "95-115", "998-1012", "1188511880-1188511890", "222220-222224",
        "1698522-1698528","446443-446449","38593856-38593862","565653-565659",
        "824824821-824824827","2121212118-2121212124"]

Pada bagian 1 kita mencari urutan pengulangan yang unik, sehingga paruh pertama ID sama dengan paruh kedua. Kemudian di bagian 2, panjang string itu bisa berubah. Inilah solusi saya:

function is_invalid(id::Int; part_1::Bool = false)
    
    id_string = string(id); n_digits = length(id_string)

    if part_1
        midpoint = length(id_string) ÷ 2
        return id_string[begin:midpoint] == id_string[midpoint+1:end]
    end

    for pattern_length  1:(n_digits ÷ 2) # a pattern more than half the length can't repeat

        if id_string == id_string[1:pattern_length] ^ (length(id_string) ÷ pattern_length)
        # is the id made *only* of this repeated pattern?
            return true
        end

    end

    return false
end
is_invalid (generic function with 1 method)

Teka-tekinya sendiri tampak lebih sederhana dari kemarin, tetapi baru setelah saya membaca deskripsinya beberapa kali. Awalnya saya pikir kami akan meminta untuk mencari ID yang berisi beberapa (apa saja) urutan berulang, tetapi mengetahui bahwa seluruh ID harus menjadi satu pengulangan menyederhanakan banyak hal.

invalid_ids = Int[]
for id  product_ids

    parts = split(id, "-")
    id_start = parse(Int, parts[1]); id_end = parse(Int, parts[2])

    for id  id_start:id_end
        if is_invalid(id)
            push!(invalid_ids, id)
        end
    end

end 

invalid_ids |> sum
4174379265

BenchmarkTools.jl katakan padaku ini terjadi 459.768 msdengan alokasi yang banyak 606.35 MiBmungkin karena semua string terpecah, digabungkan, dan diubah bolak-balik menjadi bilangan bulat. Saya rasa saya tidak akan punya waktu untuk memikirkan cara yang lebih cerdas untuk melakukan hal ini, namun saya yakin saya akan terpaksa melakukannya dalam beberapa hari mendatang. Senang menjadi kasar pada saat ini.

Hari ini anak-anakku membangunkanku pagi-pagi sekali sehingga aku akan berada di posisi teratas di papan peringkat, tapi aku ikut dalam kuis, bukan untuk meraih kemenangan.

Hari 3: ⏳

Mengutip

kutipan BibTeX:
@onlinedi_francesco2025,
  author = Di Francesco, Domenic,
  title = Advent of Code 2025,
  date = 2025-12-02,
  url = ,
  langid = en

Untuk atribusi, harap kutip karya ini sebagai:

DiFrancesco, Domenic. 2025. “Kelahiran Kode 2025.”

2 Desember 2025. .

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

#pengenalan #kode

Tinggalkan Balasan

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