AoC 2019

https://adventofcode.com/2019

Day1

)copy loaddata
a←LoadTEXT 'input.txt'
a←{⍎⍵}¨¯1↓a
d1←{+/(⌊⍵÷3)-2}
d2←{
     f←{r←d1 ⍵ ⋄ r≤0:⍺ ⋄ (⍺+r)∇ r}
     +/(0 f⊢)¨⍵
 }

Day2

d2←'1,0,...'
d2←⎕JSON '[',d2,']'
∇R←q3 prog;⎕IO;mem;c;op;r1;r2;r3
 ⎕IO←0
 mem←prog
 mem[1]←12
 mem[2]←2
 c←0
LOOP:
 op←mem[c]
 →(1 2 99=op)/ADD MUL HALT
ADD:op←'+'
 →COM
MUL:op←'×'
COM:
 r1←mem[c+1]
 r2←mem[c+2]
 r3←mem[c+3]
 mem[r3]←⍎op,'/mem[r1 r2]'
 c+←4
 →LOOP
HALT:
 R←mem[0]
∇
⍝ Part 2 is easy once you discover the relation between input and output is polynomial
1 个赞

day3

q1

:Namespace Day3
⍝ === VARIABLES ===

...
⍝ === End of variables definition ===

(⎕IO ⎕ML ⎕WX)←1 1 3

 draw←{
     walk←{
         f←{d n←⍵
             d≡'R':n 0
             d≡'U':0 n
             d≡'L':(-n)0
             d≡'D':0(-n)}
         ⍺+f ⍵
     }
     worker←{
         0=≢⍵:⍺⍺
         W((⍺⍺,⊂W)∇∇)1↓⍵⊣W←⍺ walk⊃⍵
     }
     0 0((⊂0 0)worker)⍵
 }

 expand←{
     e←{A B←⍵ ⋄ (K/A)(⌽⍣(⊃~K),)¨(⊃-∘(⍳∘|××)-/),(~K←A=B)/↑A B}
     ⊃,/e¨((1 0⍴⍨⍴)⊂⊢)((⌽+⊢)0(@1)(⍴⍵)⍴1)/⍵

 parse←{(⊃,(⍎1↓⊢))¨(','≠⍵)⊆⍵}

 q1←{
     l1 l2←⍵
     f←expand∘draw∘parse
     ⌊/(+/|)¨I/⍨(I←f l1)∊f l2
 }

:EndNamespace 

q2

q2←{
     l1 l2←⍵
     f←expand∘draw∘parse
     s←{(⍸K)[⍒(K←⍵∊⍺)/⍵]}
     ⌊/(f l2)(s+s⍨)f l1
 }
1 个赞

day4

q1←{
     ⍴(((∧⌿2≤⌿⊢)∧(∨⌿2=⌿⊢))(6⍴10)⊤⍵)/⍵
 }
q2←{
     ⍴⍵/⍨(∨/{0 1 0≡⍵}⌺3)¨↓⍉2=⌿(6⍴10)⊤⍵
 }

Day5 和 Day2 类似,略去。

Day6, 用 dfs。 直接贴 q2

test←{
     c1←1 2 3 4 5 2 6 4 5 7 8 8 9
     c2←2 3 4 5 10 6 11 9 7 8 12 13 14
     dfs←{⊃∇⍨/⌽(⊂⍺ ⍺⍺ ⍵),⍺ ⍵⍵ ⍵}
     next←{
         f depth id←⍵
         c←(id=c1)/c2
         p←(id=c2)/c1
         {id,(depth+1),⍵}¨{(f≠⍵)/⍵}c,p
     }
     acc←{
         f depth id←⍵
         14=id:⍺+depth
         ⍺
     }
     (0(acc dfs next)0 0 13)-2
 }

吐槽一下,那个 byte code interpreter 用了三题了,不知道是出题人太沒創意还是为了故意 punish 那些前面题目沒好好 polish 的人。

Day8

add←{(⍴⍵)⍴(∊⍺){'2'=⍺:⍵ ⋄ ⍺}¨∊⍵}
reshape←{⍵⍴⍨((⍴⍵)÷×/⍺),⌽⍺}
q1←{                               
     new←25 6 reshape ⍵             
     sect←(⍸(⌊/=⊢)(+/⍣2)'0'=new)⌷new
     ((+/'2'=⊢)×(+/'1'=⊢)),sect     
 }
q2←{                            
     ⎕IO←0                       
     '⎕ '['0'=add⌿25 6 reshape ⍵]
 }

不接着往下玩了?

今年一半的题都是那设计得很没品的 byte code simulator 翻来覆去出,贴出来实在太没意思,更何况我看你们回贴的都没有,这逼没法装下去了

1 个赞

你已经钦定我们麻瓜看不懂了,看不懂怎么回复啊。 :joy:

2 个赞

建一个leetcode in elisp的Post哇, 每天来盖楼观摩。

因为看不懂 :sweat:,觉得这贴很流弊,但不知道回复什么?:eyes::thinking::thinking:

1 个赞

那喊个666也可以,总不能啥都不干就想白嫖老夫的答案吧

1 个赞

有好好的 Common Lisp 不用我为啥要用 elisp 这种不但语言特性比 CL 少性能还比 CL 弱的东西……

1 个赞

666666。

2 个赞

解个AoC大概不需要用到只有CL有的语言特性。

完全看不懂就无法真心喊出6了,要是写段CL写个什么continuation我还能模糊地感觉到6然后喊出真心的666 :disappointed_relieved: 不过随便回复一下还是义不容辞的嗯

有些颜文字混进去了 :joy:

(顺便说一下插入表情的时候不会自动在前面加空格,需要手动添加)

那开leetcodes in cl呗.

前天那题(Day 16 - Advent of Code 2019)我创建了个 6,000,000 左右个 element 的 list/vector。 用 (make-vector 6000000 0) Emacs 就挂老久了。Clozure CL (make-array 6000000) 秒 return。

当然理论上可以用 mod,但是理论上还可以手算呢。用的编程语言优化好,性能好,在这种不限制暴力解的题就是优势。

Part2 我和別人一起写的,他用 C++ 暴力解跑了一分多鐘出來了,我用 APL 写的解运行只用了 0.11 秒,但比他多花了一个多小时才整出來。