User:Cscott/Advent Of Code 2023/Day 1/fr
Appearance
renvoyer (fonction ( )
locale builders= { } ;
locale fonction register(name,f)
builders[name] =f
fin ;
register( "advent.compat" ,fonction ( )renvoyer require( "Module:User:Cscott/compat" )fin ) ;
register( "day1" ,fonction (myrequire)
--[[
Day 1, first part; advent of code 2023
]]--
locale compat=myrequire( "advent.compat" ) ;
--[[
Infrastructure
]]--
fonction split(str)
lines= { } ;
pour s de string.gmatch(str, "[^\13\n]+" )faire
table.insert(lines,s)
fin ;
renvoyer lines
fin ;
fonction part1(frame, ... )
si type(frame) == "string"alors
frame= {args= {frame, ... } }
fin ;
locale s=mw.title.new(frame.args[1] ) :getContent( ) ;
renvoyer day1a(split(s) )
fin ;
fonction part2(frame, ... )
si type(frame) == "string"alors
frame= {args= {frame, ... } }
fin ;
locale s=mw.title.new(frame.args[1] ) :getContent( ) ;
renvoyer day1b(split(s) )
fin ;
--[[
Part 1
]]--
fonction day1a(lines)
locale sum=0;pour _ ,line de pairs(lines)faire
-- ignore everything but numbers
locale nums=string.gsub(line, "[^0-9]" , "" ) ;
-- ignore everything but the first and the last
nums=string.sub(nums,1,1) ..string.sub(nums, -1, -1) ;
-- coerce to integer
n=0+nums;
sum=sum+n
-- io.write(n, "\n")
fin ;
-- io.write("Sum: ", sum, "\n")
renvoyer sum
fin ;
--[[
Part 2!
]]--
locale digits= { "one" , "two" , "three" , "four" , "five" , "six" , "seven" , "eight" , "nine" } ;
fonction findDigit(str)
pour d=1, #digits faire
locale word=digits[d] ;
-- io.write("checking ",word,"\n")
si string.sub(str,1, #word) ==word alors
renvoyer d, #word
fin
fin ;
-- is the first character a digit?
si string.match(str, "^[0-9]" )alors
renvoyer (0+string.sub(str,1,1) ) ,1 sinon
renvoyer 0,0 fin
fin ;
fonction day1b(lines)
locale sum=0;pour _ ,line de pairs(lines)faire
locale first;
locale last;
-- find first digit
i=1;tant que i<= #line faire
locale piece=string.sub(line,i) ;
d,len=findDigit(piece) ;
si len>0 alors
first=d;
arrêter sinon
-- ignore this character
i=i+1 fin
fin ;
-- find last digit
i= #line;
tant que i>=1 faire
locale piece=string.sub(line,i) ;
d,len=findDigit(piece) ;
si len>0 alors
last=d;
arrêter sinon
-- ignore this character
i=i-1 fin
fin ;
-- ignore everything but the first and the last digit
locale n= (10*first) +last;
-- io.write(line, " -> ", n, "\n")
sum=sum+n
fin ;
renvoyer sum
fin ;
--[[
Testing
]]--
-- io.write("Sum: ", day1a(io.lines(compat.unpack(arg))), "\n")
-- io.write( "Sum: " ,day1a(split(io.input( "day1.example" ) :read( "*a" ) ) ) , "\n" ) ;
-- io.write("Sum: ", day1b(split(io.input("day1b.example"):read("a"))), "\n")
renvoyer {
part1=part1,
part2=part2
}
fin ) ;
locale modules= { } ;
modules[ "bit32" ] =require( "bit32" ) ;
modules[ "string" ] =require( "string" ) ;
modules[ "strict" ] = { } ;
modules[ "table" ] =require( "table" ) ;
locale fonction myrequire(name)
si modules[name] ==nulle alors
modules[name] =vrai ;
modules[name] = (builders[name] ) (myrequire)
fin ;
renvoyer modules[name]
fin ;
renvoyer myrequire( "day1" )
fin ) ( )