首頁 web前端 js教程 穀神星搜尋

穀神星搜尋

Dec 08, 2024 am 09:14 AM

Ceres Search

代碼來臨 2024 年第 4 天

第 1 部分

X 標記(數百個?)點

令我驚訝的是,到目前為止還沒有像這樣的文字搜尋謎題。

這似乎令人畏懼,但我的策略是:

Find the index of each X in the grid
For each X
  Check the next three letters in a straight path in each of the eight directions
  If the path ends up spelling XMAS
    Add one to a running total
登入後複製
登入後複製

在範例中檢查此策略使我相信這是一種成功的方法。

現在是令人興奮的部分:從頭開始編碼整個事情!

找到網格中每個 X 的索引...最終

首先,我必須將輸入解析為二維字元陣列:

let grid = input.split('\n').map(line => line.split(''))
登入後複製

我在網格謎題中經常遇到的一個障礙是考慮越界索引。

如果我從邊界單元格 - 或靠近邊界的單元格開始 - 並朝邊緣方向走這麼遠,我最終會遇到越界的行或列。

我有兩種策略來處理這個問題:

  1. 向我的條件添加檢查以查找不存在的行或列
  2. 用足夠的行和列填滿網格,這樣就不會出現越界的風險

對於這個挑戰,我選擇#2。

用 3 個單元格厚邊框填滿網格,如下圖所示:

grid = grid.map(line => ['.','.','.',...line,'.','.','.'])
grid = [
  new Array(grid[0].length).fill('.'),
  new Array(grid[0].length).fill('.'),
  new Array(grid[0].length).fill('.'),
  ...grid,
  new Array(grid[0].length).fill('.'),
  new Array(grid[0].length).fill('.'),
  new Array(grid[0].length).fill('.')
]
登入後複製

範例網格現在如下所示:

................
................
................
...MMMSXXMASM...
...MSAMXMSMSA...
...AMXSXMAAMM...
...MSAMASMSMX...
...XMASAMXAMM...
...XXAMMXXAMA...
...SMSMSASXSS...
...SAXAMASAAA...
...MAMMMXMMMM...
...MXMXAXMASX...
................
................
................
登入後複製

現在我準備好對填充網格中每個 X 的座標進行編目:

let Xs = []
for (let row = 0; row < grid.length; row++) {
  for (let col = 0; col < grid[0].length; col++) {
    if (grid[row][col] == "X") {
      Xs.push([row, col])
    }
  }
}
登入後複製

成功:在範例網格中找到了所有 19 個 X!

從每個X向八個方向走三步

所有八個相對座標都編碼為 8 元素數組:

let dirs = [
  [-1,-1],
  [-1,0],
  [-1,1],
  [0,-1],
  [0,1],
  [1,-1],
  [1,0],
  [1,1]
]
登入後複製

現在主要演算法:

For each X
  For each direction
    Create an array that starts with X
    Do 3 times
      Move one cell in this direction
      Add the value of that cell to the array
    Check whether the concatenation of all four values is "XMAS"
      If it is, increment a tally
登入後複製

在 JavaScript 中:

Xs.reduce((total, coord) => {
  dirs.forEach((dir) => {
    let [row, col] = coord;
    let [y, x] = dir;
    let word = ["X"];
    for (let i = 0; i < 3; i++) {
      row += y;
      col += x;
      word.push(grid[row][col]);
    }
    if (word.join("") == "XMAS") {
      total++;
    }
  });
  return total;
}, 0);
登入後複製

它為範例輸入產生正確的答案!

當我在拼圖輸入上運行它時會發生什麼? ! !

我得到一個數字:幾千個「XMAS」

這是正確答案嗎?

就是這樣! ! !

嗚呼! ! !

迫不及待想看看第二部有什麼精彩內容......

第2部分

哦天哪。這變得有點複雜了。但可行!

在第 1 部分中,我一直在尋找 X。

現在,我正在尋找

女士

在第 1 部分中,我將字母寫成一條直線來組成單字。

現在,我正在尋找 5 單元短語的四種配置:

M S   M M   S M   S S
 A     A     A     A
M S   S S   S M   M M
登入後複製

一個 M 可以是多個 X-MAS 的一部份。

透過檢查每一個M,我很可能會遇到好幾次。

我需要為每場比賽建立一個字串化座標的 Set()。這樣,我只佔一個 X-MAS 實例一次。

突然——輝煌! - 主意

我不會檢查每一個M。

我會檢查每一個A。

我將按順時針順序檢查對角線相鄰的四個單元格。

X-MAS 比賽將符合以下四種模式之一:

Find the index of each X in the grid
For each X
  Check the next three letters in a straight path in each of the eight directions
  If the path ends up spelling XMAS
    Add one to a running total
登入後複製
登入後複製


`

唷!這比我最初的想法要簡單得多。

而且我應該能夠重新利用我的大部分第 1 部分程式碼!

複製貼上調整

在網格中找到所有 As:
js
令 As = [];
for (let row = 0; row for (let col = 0; col if (網格[行][列] == "A") {
As.push([行, 列]);
}
}
}

建立要檢查的相對座標順序:
js
讓阿迪爾斯 = [
[-1, -1],
[-1, 1],
[1, 1],
[1, -1],
];

將比賽的得分相加:
js
令part2 = As.reduce((總計, 座標) => {
設順時針 = Adirs.map((dir) => {
令 [行,列] = 座標;
令 [y, x] = dir;
返回網格[行y][列x];
});
if (["MSSM", "MMSS", "SMMS", "SSMM"].includes(順時針.join(""))) {
總計;
}
回傳總計;
}, 0);

它為範例輸入產生正確的答案!

現在檢查我的拼圖輸入...

確實! ! !正確答案! ! !

我很高興我突然想到使用 As 而不是 Ms.

我確信,為我節省了數小時的時間來解決頭痛問題。

這是另一個有趣且容易上手的謎題!

我想知道第五天會發生什麼事。

以上是穀神星搜尋的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1654
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1252
29
C# 教程
1225
24
前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

如何實現視差滾動和元素動畫效果,像資生堂官網那樣?
或者:
怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? 如何實現視差滾動和元素動畫效果,像資生堂官網那樣? 或者: 怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? Apr 04, 2025 pm 05:36 PM

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

前端開發中如何實現類似 VSCode 的面板拖拽調整功能? 前端開發中如何實現類似 VSCode 的面板拖拽調整功能? Apr 04, 2025 pm 02:06 PM

探索前端中類似VSCode的面板拖拽調整功能的實現在前端開發中,如何實現類似於VSCode...

JavaScript引擎:比較實施 JavaScript引擎:比較實施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

See all articles