چیدن پنجه

ظهور کد 2024 روز 13
قسمت 1
BIG GULP: هر جایگرانه؟
دیگری ترسناک shortest path
چالش
خوشبختانه ، به لطف محدودیت مشخص شده ، با نیروی بی رحمانه قابل انجام است:
- بیش از
100
دکمه فشار
این بدان معناست که اگر راه حلی وجود داشته باشد ، در درون آن وجود دارد 1
از 10,000
مجازات: 100 * 100 = 10,000
هر دستگاه به عنوان 3 خط (به علاوه 1 خط خالی) در ورودی نشان داده شده است که در کل 4 خط قرار دارد.
ورودی من است 1280
خطوط طولانی
بنابراین ، بیشترین محاسباتی که الگوریتم من انجام می دهد این است:
100
* 100
------
10000
*
1280
/ 4
------
320
======
3200000
3.2M
محاسبات به هیچ وجه بد نیست.
نیروی بی رحم ممکن است گزینه ای برای قسمت 1 باشد.
ارزش امتحان کردن!
تلاش برای بیرحمانه راه حل
تبدیل رشته ها به عدد صحیح
ابتدا باید شش عدد مهم را از ورودی هر دستگاه استخراج کنم:
input
.split('\n')
.map(block => {
let [AX, AY, BX, BY, PX, PY] = [
...block.matchAll(/d+/g).map(el => +el[0])
]
})
من آن را اینجا نوشتم. سپس آن را در یک ویرایشگر کد اجرا کردم.
سپس اشکال زدایی کردم و آن را ثابت کردم تا اینکه کد را که انتظار داشتم دیدم.
الگوریتم کاری من به این شکل است:
input
.split('\n\n')
.map(block => [
...block.matchAll(/\d+/g)
].map(el => +el[0])
)
من اشتباهات احمقانه ای مرتکب شدم.
اما اکنون این را در کنسول خود می بینم:
[
[ 94, 34, 22, 67, 8400, 5400 ],
[ 26, 66, 67, 21, 12748, 12176 ],
[ 17, 86, 84, 37, 7870, 6450 ],
[ 69, 23, 27, 71, 18641, 10279 ]
]
عالی!
آماده سازی برای 10K مجوزهای
برخی از متغیرهای ردیابی با مقادیر استارت و حلقه های تو در تو که به آنها حساب می شود 100
، همه داخل reduce
که هر دستگاه را پردازش می کند:
let part1 = input.reduce( (total, machine) => {
let [AX, AY, BX, BY, PX, PY] = machine
let min = Infinity
let minA = Infinity
let minB = Infinity
for (let A = 0; A <= 100; A++) {
for (let B = 0; B <= 100; B++) {
}
}
return total
})
در مرحله بعد ، برخی از چاشنی ها ، موارد اضافی و چند برابر:
// inside the nested for loops
if ((A * AX + B * BX == PX) && (A * AY + B * BY == PY)) {
if (3 * A + B < min) {
minA = 3 * A
minB = B
min = minA + minB
}
}
باز هم ، من آن را اول اینجا نوشتم.
سپس من آن را در ویرایشگر کد خود کپی کردم و آن را اجرا کردم.
و من مبلغ برنده پیش بینی شده را دیدم!
من هیجان زده شدم و بقیه الگوریتم را نوشتم.
پس از تمیز کردن و اشکال زدایی ، کد کار نهایی در اینجا آمده است:
let part1 = input.reduce( (total, machine) => {
let [AX, AY, BX, BY, PX, PY] = machine
let min = Infinity
for (let A = 0; A <= 100; A++) {
for (let B = 0; B <= 100; B++) {
if ((A * AX + B * BX == PX) && (A * AY + B * BY == PY)) {
if (3 * A + B < min) {
min = 3 * A + B
}
}
}
}
if (min < Infinity) {
total += min
}
return total
}, 0)
اجرای آن بر روی ورودی مثال ، پاسخ صحیح را ایجاد می کند.
در مورد ورودی پازل من چطور؟
…
خوب ، در یک ثانیه به پایان رسید.
و در دهه 10 از هزاران پاسخی ایجاد کرد.
درست است؟
…
این است!
شیرین!
من پیش بینی نمی کنم که دانش علوم کامپیوتر را برای بازگرداندن الگوریتم نیروی بی رحمانه خود به چیزی که می تواند قسمت 2 را حل کند ، بازگرداند.
من هنوز از دیدن پیچ و تاب هیجان زده ام!
قسمت 2
yyyyuuupp. فقط چیزی که من مشکوک شدم
1 تریلیون بالاتر؟ yikes!
درست مثل قسمت 2 دیروز ، من گیر افتاده ام.
ضربه گیر
بعد از یک خط 10 روز 2 ستاره ، من در یک خط 3 روزه 1 ستاره هستم.
برای عادلانه بودن ، این معمولاً هر سال جایی است که 0 یا 1 ستاره می گیرم.
حداقل من 1 گرفتم!
به بعد به روز 14.