برنامه نویسی

چیدن پنجه

ظهور کد 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.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا