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
@onlinedi_francesco2025,
author = Di Francesco, Domenic,
title = Advent of Code 2025,
date = 2025-12-02,
url = ,
langid = en
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