코드의 출현 16일차
나는 빙고보다 이게 더 싫다. 특히 패딩에 대한 텍스트가 매우 불분명했습니다. 패딩은 기본적으로 이 연습에서 무시할 수 있습니다.
reuse [L42.is/AdamsTowel]
Fs = Load:{reuse[L42.is/FileSystem]}
Decoder = {
Map = Collection.map(key=S val=I.List)
class method I.List(S that) = This.map().val(key=that).val()
L={class method I.List (S that)=\()(
for c in that.split() \add(I(string=c)))}
@Cache.Lazy class method Map map()=\[
key=S"0" val=L(S"0000");
key=S"1" val=L(S"0001");
key=S"2" val=L(S"0010");
key=S"3" val=L(S"0011");
key=S"4" val=L(S"0100");
key=S"5" val=L(S"0101");
key=S"6" val=L(S"0110");
key=S"7" val=L(S"0111");
key=S"8" val=L(S"1000");
key=S"9" val=L(S"1001");
key=S"A" val=L(S"1010");
key=S"B" val=L(S"1011");
key=S"C" val=L(S"1100");
key=S"D" val=L(S"1101");
key=S"E" val=L(S"1110");
key=S"F" val=L(S"1111");
]}
Input = Data:{
mut I.List that
var I removed = 0I
mut method I b() = (
\removed(\removed+1I)
(left,removeLeft)=\#that
left
)
read method Bool isPadding() =
\that.size()<4I ||
\that.val(0I)+\that.val(1I)+\that.val(2I) ==0I
}
Packet = Data.AddList:Data:{ List = {}
I v,I t,Num val,List sub
}
ParsePacket = {
class method Packet (mut Input that) = {
v = \val(that,bits=3I)
t = \val(that,bits=3I)
if t==4I return \(v=v,t=t,val=this.vals(that),sub=\())
size = ( if that.b()==0I 15I else 11I )
psSize = \val(that,bits=size)
(removed) = that
if size==11I return \(v=v,t=t,val=Num(psSize),sub=\()(
for i in Range(psSize) \add(ParsePacket(that))
))
X[that.that().size()>=psSize]
return \(v=v,t=t,val=Num(psSize),sub=\()(
while that.removed()-removed<psSize \add(ParsePacket(that))
))
}
class method I val(mut Input that, I bits) = 0I.acc()(
for i in Range(bits) \val((\val*2I)+that.b())
)
class method Num vals(mut Input that) = {
(b0,b1,b2,b3,b4)= that
res = Num((b1*8I)+(b2*4I)+(b3*2I)+b4)
if b0==0I return res
pre = that.removed()
rec = \vals(that)
var seen = that.removed() - pre
mul = 1Num.acc()(while seen>3I (seen-=5I, \times(16Num)))
return (res*mul)+rec
}
}
Versions={class method I (Packet that) =
that.v().acc()(for p in that.sub() \add(This(p)))
}
Part2 = {class method Num (Packet that) = {
if that.t()==0I return 0Num.acc()(for p in that.sub() \add(This(p)))
if that.t()==1I return 1Num.acc()(for p in that.sub() \times(This(p)))
if that.t()==2I return This(that.sub().left()).acc()(for p in that.sub() \val(\val.min(This(p))))
if that.t()==3I return 0Num.acc()(for p in that.sub() \val(\val.max(This(p))))
if that.t()==4I return that.val()
(left,right) = that.sub()
if that.t()==5I return if This(left)>This(right) 1Num else 0Num
if that.t()==6I return if This(left)<This(right) 1Num else 0Num
if that.t()==7I return if This(left)==This(right) 1Num else 0Num
error X" unrecognized packet type"
}}
Main = (
input = Fs.Real.#$of().read(\"input").trim()
parsed = Input(\()(for c in input.split() for e in Decoder(c) \add(e)))
ps = Packet.List()(while !parsed.isPadding() \add(ParsePacket(parsed)))
Debug(Versions(ps.left()))//993
Debug(Part2(ps.left())) //144595909277
)
이 펑키한 코드를 참고하세요 :-P
(left,removeLeft) = \#that
그것에 대해 어떻게 생각해야할지 모르겠습니다. 왼쪽을 읽고 다음으로 가는 멋진 방법이지만 '객체 분해' 구문을 남용하는 것 같은 느낌도 듭니다.. 그것에 대한 아이디어가 있습니까?
그 패턴은 쓰면 쓸수록 괜찮다는 느낌이 드는데... 안티패턴에 익숙해진 건지, 아니면 정말 좋은 표현 방법인가요?
동일한 아이디어의 다른 용도를 고려하십시오.
(b0,b1,b2,b3,b4) = that
여기서는 입력에서 5비트를 추출합니다. 이는 훌륭하고 읽기 쉬우며 위의 'removeLeft'와 동일한 패턴을 사용합니다.
Reference
이 문제에 관하여(코드의 출현 16일차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/marcoservetto/advent-of-code-day-16-1a83텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)