精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

AI打LeetCode周賽進入前10%!秘訣:自然語言編程

jf_8lIj6kO1 ? 來源:QbitAI ? 2023-06-05 16:34 ? 次閱讀

還在自己吭哧吭哧打算法平臺Leetcode的周賽?為什么不試試神奇的ChatGPT類AI呢!

用AI助手Claude參加第103場周賽,共四道題,均完成了AC,能達到參與者前10%的成績

事情的起因是知乎上一位叫蕭雅的用戶嘗試使用AI進行編程,但在測試過程中,她發現直接給出題目讓AI進行編程并輸出結果的方法,效果并不理想。

于是一種大膽的想法誕生了:使用自然語言配合逐步的思路描述,通過與AI的交互來完成編程。

具體操作中,她選擇了Anthropic公司出品的ChatGPT最強競品——Claude這個AI助手,并選取了Leetcode第103場雙周賽來完成實驗。

整體的解答過程遵循以下幾點要求:

  • 全程使用自然語言進行描述,通過一次溝通完成輸出,因此下文所有發給Claude的指令均可以復現。

  • 采用問題描述、解答思路、以及開頭書寫要求作為提問固定格式。

  • 編程采用python代碼輸出。

最終測試結果是,可以認為通過自然語言+解答思路發送給AI進行編程是可行的。

以下是測試全過程:

用自然語言讓AI打leetcode周賽

Leetcode第103場周賽題目1如下,k個元素的最大和:

56920904-037b-11ee-90ce-dac502259ad0.png

發給Claude指令如下:

問題描述如下:
'''
給你一個下標從0開始的整數數組 nums 和一個整數 k 。你需要執行以下操作恰好 k 次,最大化你的得分:
1.從 nums 中選擇一個元素 m 。
2.將選中的元素 m 從數組中刪除。
3.將新元素 m + 1 添加到數組中。
4.你的得分增加 m 。
請你返回執行以上操作恰好 k 次后的最大得分。
'''
解答思路如下:
'''
由于最大值加一后還是最大值,那么反復利用最大值即可。
設數組的最大值為m,答案就是m+(m+1)+(m+2)+?+(m+k?1)=[(2m+k?1)?k]/2
'''
請用python3書寫,并以下面這行作為開頭。
classSolution:
defmaximizeSum(self,nums:List[int],k:int)->int:

Claude回復內容如下:

這里是python代碼實現:
python
classSolution:
defmaximizeSum(self,nums:List[int],k:int)->int:
m=max(nums)
return(2*m+k-1)*k//2
解答思路:
1.首先找到數組中的最大值m。
2.然后最大的得分公式為:m+(m+1)+(m+2)+...+(m+k-1)
=(m+(m+k-1))*k/2
=(2*m+k-1)*k/2
3.直接返回計算結果。
時間復雜度:O(n)。需要遍歷數組一次得到最大值。
空間復雜度:O(1)。
這個解法直接利用了最大值與k的關系來得到最終結果,沒有實際操作數組。所以時間和空間復雜度都比較低。
請 let me know 如果您有任何疑問或需要解釋的地方。我很樂意提供幫助。

代碼提交結果:

56bf7d8a-037b-11ee-90ce-dac502259ad0.jpg

周賽題目2如下,找到兩個數組的前綴公共數組:

56d4d126-037b-11ee-90ce-dac502259ad0.png

發給Claude指令如下:

問題描述如下:
'''
給你兩個下標從0開始長度為 n 的整數排列 A 和 B 。
A 和 B 的前綴公共數組定義為數組 C ,其中 C[i]是數組 A 和 B 到下標為 i 之前公共元素的數目。
請你返回 A 和 B 的前綴公共數組。
如果一個長度為 n 的數組包含 1 到 n 的元素恰好一次,我們稱這個數組是一個長度為 n 的排列。
'''
解答思路如下:
'''
1.存儲公共前綴的大小
2.存儲a和b中已經匹配過的元素
3.同時遍歷a和b中的元素
4.將a中的當前元素x對應的二進制位置為1,標記為已匹配
5.將b中的當前元素y對應的二進制位置為1,標記為已匹配
6.計算當前公共前綴的大小,即p和q的二進制數中1的個數
7.返回公共前綴大小的列表
'''
請用python3書寫,并以下面這行作為開頭。
classSolution:
deffindThePrefixCommonArray(self,A:List[int],B:List[int])->List[int]:

Claude回復內容如下:

這里是優化后的python代碼實現:
python
classSolution:
deffindThePrefixCommonArray(self,A:List[int],B:List[int])->List[int]:
p,q=0,0
res=[]
foriinrange(min(len(A),len(B))):
p|=1<=1<'1'))
returnres
解答思路:
1.p和q初始化為0,用來記錄A和B數組中出現過的數字。
2. 同時遍歷A和B數組的元素。
3.通過p|= 1 << A[i]將A[i]位置1。
4.?通過q?|=1<1。
5.p&q得到兩個數組公共元素,然后bin(p&q).count('1')計算1的個數,得到公共元素個數c。
6. 添加c到res。
7.重復3-6直到A或B數組遍歷結束。
8. 返回res。
時間復雜度:O(m + n)。需要遍歷兩個數組。
空間復雜度:O(m + n)。需要使用res存儲結果。
這種方法無需提前記錄每個數字在A和B數組中出現的次數,而是在遍歷的同時更新p和q,簡潔高效。
請 let me know 如果您有任何疑問或需要解釋的地方。我很樂意提供幫助。

代碼提交結果:

56fba6e8-037b-11ee-90ce-dac502259ad0.jpg

周賽題目3如下,網格中魚的最大數目:

57129a2e-037b-11ee-90ce-dac502259ad0.png

發給Claude指令如下:

問題描述如下:
'''
給你一個下標從0開始大小為 m x n 的二維整數數組 grid ,其中下標在(r, c)處的整數表示:
如果grid[r][c]=0,那么它是一塊陸地。
如果grid[r][c]>0,那么它是一塊水域,且包含grid[r][c]條魚。
一位漁夫可以從任意水域格子(r, c)出發,然后執行以下操作任意次:
捕撈格子(r,c)處所有的魚,或者
移動到相鄰的水域格子。
請你返回漁夫最優策略下,最多可以捕撈多少條魚。如果沒有水域格子,請你返回0。
格子(r, c)相鄰的格子為(r, c + 1),(r, c - 1),(r + 1, c)和(r - 1, c),前提是相鄰格子在網格圖內。
'''
解答思路如下:
'''
1.獲取網格的行數和列數
2.定義深度優先搜索函數
3.如果下標越界或網格中沒有魚,則返回0
4.統計當前點的價值為s
5.將當前點標記成訪問過,不需要重置其值
6.四個方向進行深度優先搜索
7.將搜索到的魚的價值累加到s中
8.返回能夠獲得的最大價值s
9.遍歷所有的格子,計算其能夠獲得的最大價值并返回
'''
請用python3書寫,并以下面這行作為開頭,按照思路不要添加任何額外細節。
classSolution:
deffindMaxFish(self,grid:List[List[int]])->int:

Claude回復內容如下:

這里是精簡的python代碼實現:
python
classSolution:
deffindMaxFish(self,grid:List[List[int]])->int:
m,n=len(grid),len(grid[0])
defdfs(i,j):
ifnot(0<=imand0<=?jnandgrid[i][j]>0):return0
s=grid[i][j]
grid[i][j]=0
s+=dfs(i+1,j)+dfs(i-1,j)+dfs(i,j+1)+dfs(i,j-1)
returns
res=0
foriinrange(m):
forjinrange(n):
res=max(res,dfs(i,j))
returnres
解答思路:
1.獲取網格的行數m和列數n。
2.定義dfs函數進行深度優先搜索。
3.如果下標越界或網格中沒有魚,則返回0。
4.統計當前點grid[i][j]的魚的數量s。
5.將grid[i][j]標記為已訪問,不需要重置其值。
6.dfs搜索四個方向,并將搜索到的魚的數量累加到s。
7.返回s。
8.遍歷所有的格子,通過dfs計算其能夠獲得的最大價值,并更新res。
9.返回res。
時間復雜度:O(m*n)。需要遍歷整個網格。
空間復雜度:O(m*n)。遞歸深度可能達到m*n。
這是一道典型的深度優先搜索問題,需要注意狀態重置。
通過不重置grid[i][j]的值,避免了狀態重置,簡化了代碼邏輯。
請 let me know 如果您有任何疑問或需要解釋的地方。我很樂意提供幫助。

代碼提交結果:

575311b2-037b-11ee-90ce-dac502259ad0.jpg

周賽題目4如下,將數組清空:

57630ec8-037b-11ee-90ce-dac502259ad0.png

發給Claude指令如下:

問題描述如下:
'''
給你一個包含若干互不相同整數的數組 nums ,你需要執行以下操作直到數組為空:
如果數組中第一個元素是當前數組中的最小值,則刪除它。
否則,將第一個元素移動到數組的末尾。
請你返回需要多少個操作使 nums 為空。
'''
解答思路如下:
'''
數組nums的長度為n
創建一個空的堆列表heap
對nums進行i,nums這個格式的遍歷,再將當前元素值和對應索引組成后面格式的元組(num, i)加入到堆列表 heap 中,不要對這兩個格式順序做修改。
將nums中的所有元素及其下標加入最小堆heap中
用sortedcontainers里面的SortedList創建空的有序集合pos,用于存儲已經刪除的元素的下標
res用于存儲清空數組所需的最少操作數,初始化為0
哨兵li,上一個彈出的數的位置,初始化為-1
獲取堆中的最小值,并計算清除該元素所需的步數,重復直到堆為空
如果 i 在上一個彈出元素li的后面,對于每個被彈出的元素,計算從i到li在pos中的有效元素數量d,即計算值在 li的右邊且值小于 i 的元素數量。再將從當前位置到i之間的長度減去d,加入總步數 res 中
如果當前元素的位置在上一個被彈出元素 li 的前面,則計算從 li 到數組結尾的有效元素數量d,即集合中小于等于i的元素數量與集合中小于n的元素數量相加,再減去集合中小于li的元素數量為有效元素數量d。再將從當前位置 li 到數組末尾的元素數量加上i,再減去d,加入總步數res中
將元素i的下標加入已刪除元素的有序集合pos中
更新上一個彈出的數位置
返回清空數組所需的最少操作數res
'''
請用python3書寫,并以下面這行作為開頭。
classSolution:
defcountOperationsToEmptyArray(self,nums:List[int])->int:

Claude回復內容如下:

這里是python代碼實現:
python
fromsortedcontainersimportSortedList

classSolution:
defcountOperationsToEmptyArray(self,nums:List[int])->int:
n=len(nums)
heap=[]
fori,numinenumerate(nums):
heappush(heap,(num,i))
pos=SortedList()
res=0
li=-1
whileheap:
num,i=heappop(heap)
ifi>li:
d=pos.bisect_left(i)-pos.bisect_right(li)
res+=i-li-d
else:
d=pos.bisect_right(n)-pos.bisect_right(li)+pos.bisect_left(i)
res+=n-li+i-d
pos.add(i)
li=i
returnres
解答思路:
1.數組 nums 的長度為n。
2.創建一個空的堆列表heap。
3.對nums進行i,nums這個格式的遍歷,再將當前元素值和對應索引組成后面格式的元組(num, i)加入到堆列表 heap 中,不要對這兩個格式順序做修改。
4.用sortedcontainers里面的SortedList創建空的有序集合pos,用于存儲已經刪除的元素的下標。
5.res用于存儲清空數組所需的最少操作數,初始化為06.哨兵li,上一個彈出的數的位置,初始化為-17.獲取堆中的最小值,并計算清除該元素所需的步數,重復直到堆為空。
8.如果i在上一個彈出元素li的后面,對于每個被彈出的元素,計算從i到li在pos中的有效元素數量d,即計算值在 li的右邊且值小于 i 的元素數量。再將從當前位置到i之間的長度減去d,加入總步數res中。
9.如果當前元素的位置在上一個被彈出元素li的前面,則計算從li到數組結尾的有效元素數量d,即集合中小于等于i的元素數量與集合中小于n的元素數量相加,再減去集合中小于li的元素數量為有效元素數量d。再將從當前位置li到數組末尾的元素數量加上i,再減去d,加入總步數res中。
10.將元素i的下標加入已刪除元素的有序集合pos中。
11.更新上一個彈出的數位置li = i。
12.返回清空數組所需的最少操作數res。
時間復雜度:O(nlogn)。需要排序。
空間復雜度:O(n)。需要堆和集合。
這是一道運用堆與有序集合的題目。通過維護哨兵位置和已刪除元素,得到最優解。
請 let me know 如果您有任何疑問或需要解釋的地方。我很樂意提供幫助。

代碼提交結果:

57802008-037b-11ee-90ce-dac502259ad0.jpg

實踐后的思考

對于這個問題最初的想法就來自于在AI助手有了突破之后,嘗試能否通過自然語言編程來代替程序語言編程。

自然語言編程指的是使用我們日常語言來表達計算機程序的概念和算法,而非傳統的程序語言如C++和Python等。

自然語言具有良好的表達形式,更易于理解和表述,更加親和易懂,人們可以用最自然的語言來表達自己的思想和創意,而無需陷入復雜的程序語言語法。

自然語言編程可以讓人們更為容易表達自己的需求,并快速實現理想中的功能。

然而,自然語言編程也存在明顯劣勢

首先,自然語言表達是模糊的和不精確的。我們所講的語言中,存在很多概念和意思是相對的和依賴語境的,這些難以在計算機程序中得到明確和一致的表達,這都給程序的理解使用和調試帶來了很大困難。

其次,自然語言難以表達計算機程序需要的精確和嚴謹的概念,它自身的嚴謹性不夠。

程序語言提供了形式化的語法和豐富的數據類型來定義程序邏輯,給出程序的統一性標準,有著共同的語言約定和對應規則,這都是自然語言很難達到的。

最后,要實現人與機器之間完全自然的語言交互和理解,這需要機器具備廣泛而深入的知識水平和推理能力,而人工智能能否準確理解這些,需要標準來進行評估。目前的自然語言處理技術能否完全理解人類語言的深層次含義,實現人與機器完全自然的語言交互仍然需要商榷。

通過使用Claude打leetcode周賽,對于如何使用自然語言描述程序多了一點自己的認識。

自然語言可以表達所有的程序語言,具有更寬泛的表達能力。事實上,在學習和解釋任何一門程序語言時,所依賴的都是自然語言。

程序語言本質上只是人與機器間的一種中間溝通工具,而其實這些年它的發展也在不斷地從機器可解析的形式向更加貼近人類理解的自然語言靠攏,更偏人類正常溝通的方向靠近。

所以,程序語言并不比自然語言本身擁有更強的表達能力。相反,自然語言可以承載更豐富、更廣泛的概念,實現更加抽象和深層次的思維傳達。

程序語言之所以存在,其目的就在于讓機器可以理解人類用自然語言表達的思想和邏輯。因此,程序語言并不是一個更優于自然語言的表現形式。

實踐發現,在書寫自然語言編程描述時,需要著重考慮到以下幾個參考點:

  • 語言表述:用盡可能精準自然的語言來進行溝通回復,避免重復性詞語,盡可能不使用可能/或許這種不確定性的描述。

  • 語義理解:過于復雜或者專業的表達會增加理解難度,需要補充更為清晰易懂的技術背景,會得到更好的輸出。

  • 交互模式:用更為直接明了的命令形式進行表達,雖然不及聊天形式自然,但更為清晰簡明。

  • 規范結構:需要在表達方式和交互規則上增加一定框架,對輸入輸出都會有更為直觀的展示。

以上這些只是一些想法,自然語言編程背后涉及的知識和技術遠不止此。

能超過50%的周賽參與者

用AI編寫程序,為什么不選擇熱度最高的ChatGPT,或其他生成代碼專用AI?就這個問題背后的原因,量子位詢問了蕭雅本人。

她表示,沒有選擇生成代碼專用AI是因為想用最根本的模型進行解答,再考慮到所有輸入是中文+代碼,有10萬token的Claude對中文的理解和處理優于ChatGPT等產品

實際體驗后她得出結論,通過與AI的交互來完成編程這種方法在某些步驟和環節比手寫代碼節省時間,尤其是改bug和學習新語言的時間。

“比如說本身對c++非常熟悉,而可能這個代碼需要python書寫才能更匹配,哪怕對語言不是很了解,但是整體的思路和想法有很大共通的。”她補充解釋道,“這個語言做的好的地方,相對的那個語言應該也會有對應的庫,但是可以在不那么精通另一個語言的情況下依然很好的書寫代碼。”

雖然能加快變成速度,但新方法還是沒有辦法超過90%-100%的作答者,不過至少能超過50%的周賽參與者。

理由是這種自然語言編程的方法和近些年的編程語言發展模式很接近,讓語言設計都更偏向于人類,而遠離計算機硬件

此外,這個方法和人的學習過程是一致的,人在學習編程語言的時候都是用自然語言進行解釋的,這是最好的描述工具。

她舉例說,團隊合作書寫代碼的時候,所有代碼的描述也是通過自然語言說清楚再進行思維碰撞,這種方法可以很大程度提高工作效率。

最終目標肯定是直接給出題目就可以讓AI進行解答,現在是做不到這點的,這種方法只是AI書寫代碼的其中一步。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • AI
    AI
    +關注

    關注

    87

    文章

    30146

    瀏覽量

    268415
  • 編程語言
    +關注

    關注

    10

    文章

    1938

    瀏覽量

    34598
  • 自然語言
    +關注

    關注

    1

    文章

    287

    瀏覽量

    13332

原文標題:AI打LeetCode周賽進入前10%!秘訣:自然語言編程

文章出處:【微信號:玩轉VS Code,微信公眾號:玩轉VS Code】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    python自然語言

    學和人工智能,但同樣受到諸如機器學習,計算統計學和認知科學這些相對新興的學科影響。python下面只要安裝自然語言工具包nltk,下面版主開始正式進入學習。Natural Language
    發表于 05-02 13:50

    語義理解和研究資源是自然語言處理的兩大難題

    科技改變生活,智能化設備在我們生活中的應用范圍增加,智能設備對于語言交互,人機交互的技術需求也在增加,這些需求也在促進現在的技術研究進步。從現在的自然語言發展現狀來看,自然語言的發展難題主要集中在
    發表于 09-19 14:10

    【推薦體驗】騰訊云自然語言處理

    `相信大家對NLP自然語言處理的技術都不陌生,它是計算機科學領域和AI領域中的一個分支,它與計算機和人類之間使用自然語言進行交互密切相關,而NLP的最終目標是使計算機能夠像人類一樣理解語言
    發表于 10-09 15:28

    自然語言處理的分詞方法

    自然語言處理——75 自動分詞基本算法
    發表于 03-19 11:46

    自然語言處理的語言模型

    自然語言處理——53 語言模型(數據平滑)
    發表于 04-16 11:11

    自然語言處理的詞性標注方法

    自然語言處理——78 詞性標注方法
    發表于 04-21 11:38

    自然語言處理筆記

    自然語言處理筆記9-哈工大 關毅
    發表于 06-04 16:34

    自然語言處理——總結、習題

    自然語言處理——79 總結、習題
    發表于 06-19 11:22

    什么是自然語言處理?

    會識別出我們正確說的話。 我們使用免費服務將在線遇到的外語短語翻譯成英語, 有時它們可以為我們提供準確的翻譯。 盡管自然語言處理取得了長足的進步,但仍有很大的改進空間。[理...
    發表于 07-23 10:22

    什么是自然語言處理

    什么是自然語言處理?自然語言處理任務有哪些?自然語言處理的方法是什么?
    發表于 09-08 06:51

    什么是自然語言處理_自然語言處理常用方法舉例說明

    自然語言處理是計算機科學領域與人工智能領域中的一個重要方向。它研究能實現人與計算機之間用自然語言進行有效通信的各種理論和方法。自然語言處理是一門融語言學、計算機科學、數學于一體的科學。
    發表于 12-28 16:56 ?1.8w次閱讀
    什么是<b class='flag-5'>自然語言</b>處理_<b class='flag-5'>自然語言</b>處理常用方法舉例說明

    自然語言處理怎么最快入門_自然語言處理知識了解

    自然語言處理就是實現人機間自然語言通信,實現自然語言理解和自然語言生成是十分困難的,造成困難的根本原因是自然語言文本和對話的各個層次上廣泛存
    發表于 12-28 17:10 ?5286次閱讀

    自然語言處理是什么?有什么用?

    和突破,并越來越多地應用于各個行業。正如國際知名學者海中先生曾經所言:“自然語言處理是極有吸引力的研究領域,它具有重大的理論意義和實用價值。”
    的頭像 發表于 02-08 16:00 ?6084次閱讀

    自然語言處理的概念和應用 自然語言處理屬于人工智能嗎

      自然語言處理(Natural Language Processing)是一種人工智能技術,它是研究自然語言與計算機之間的交互和通信的一門學科。自然語言處理旨在研究機器如何理解人類語言
    發表于 08-23 17:31 ?1323次閱讀

    自然語言處理饋網絡綜述

    自然語言處理(NLP)饋網絡是人工智能和語言學領域的一個重要交叉學科,旨在通過計算機模型理解和處理人類語言饋神經網絡(Feedforw
    的頭像 發表于 07-12 10:10 ?276次閱讀