Jump to content

User:Cscott/Advent Of Code 2023/Day 1/fr

From Wikipedia, the free encyclopedia
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 ) ( )