ToCode
Open in Telegram
1 419
Subscribers
No data24 hours
No data7 days
No data30 days
Posts Archive
1 419
$ bison -t -v -d calc.y
$ flex calc.l
$ gcc -o calc calc.tab.c lex.yy.c
讜讝讛 讬爪专 诇讬 拽讜讘抓 讘砖诐 calc 砖讛讜讗 讛诪讞砖讘讜谉 讛讛驻讜讱. 讘讛讬谞转谉 拽讜讘抓 拽诇讟 注诐 转专讙讬诇讬 讞砖讘讜谉, 讻诇 转专讙讬诇 讘砖讜专讛 谞驻专讚转, 讛拽讜讚 讛讘讗 讬驻转讜专 讗转 讻讜诇诐 讜讬讚驻讬住 讗转 讛转讜爪讗讜转:
./calc < ../input/day18.txt
## 讛讙讬砖讛 讛专讙讜诇讗专讬转: 讗驻砖专 诇讛讞诇讬祝 讘讬讟讜讬 专讙讜诇讗专讬 讘转讜爪讗讛 砖诇 驻讜谞拽爪讬讛
讙诐 诪讬 砖诇讗 诪讻讬专 讗转 flex 讜 bison 诇讗 讞讬讬讘 诇注讘讜讚 拽砖讛 注诇 讛转专讙讬诇 讛讝讛. 讚专讱 谞讜住驻转 拽诇讛 诇驻转讜专 讗讜转讜 讛讬讗 砖讬诪讜砖 讘讘讬讟讜讬讬诐 专讙讜诇讗专讬讬诐 讜讘讬讻讜诇转 砖诇 讘讬讟讜讬 专讙讜诇讗专讬 诇注砖讜转 讛讞诇驻讛 讘讗诪爪注讜转 驻讜谞拽爪讬讛, 讻诇讜诪专 讗谞讞谞讜 诪讝讛讬诐 拽讟注 讘转讜讱 讛诪讞专讜讝转, 砖讜诇讞讬诐 讗讜转讜 诇驻讜谞拽爪讬讛 讜诪讞诇讬驻讬诐 讗转 讛拽讟注 讘转讜爪讗讛 砖诇 讛驻讜谞拽爪讬讛.
讘诪拽专讛 砖诇 讛诪讞砖讘讜谉 讛讛驻讜讱 讬砖 诇谞讜 3 讗讜驻专讟讜专讬诐 注诐 住讚专 拽讚讬诪讜讬讜转 诇拽讞转 讘讞砖讘讜谉:
1. 住讜讙专讬讬诐, 讗讜转诐 爪专讬讱 诇驻转讜专 诇驻谞讬 讛讻诇
2. 讞讬讘讜专, 讗讜转讜 爪专讬讱 诇驻转讜专 讻砖讗讬谉 讬讜转专 住讜讙专讬讬诐
3. 讻驻诇, 讗讜转讜 谞驻转讜专 讻砖住讬讬诪谞讜 讗转 讻诇 转专讙讬诇讬 讛讞讬讘讜专
诇讻谉 讗谞讬 讬讻讜诇 诇讻转讜讘 驻讜谞拽爪讬讛 砖转注讘讜讚 讻讱:
1. 讗诐 讬砖 住讜讙专讬讬诐 讘讘讬讟讜讬, 讛讬讗 转讬拽讞 讗转 讛住讜讙专讬讬诐 讛驻谞讬诪讬讬诐 讘讬讜转专 讜转谞住讛 诇驻转讜专 讗讜转诐
2. 讗诐 讬砖 驻诇讜住 讘讘讬讟讜讬 讛讬讗 转讞驻砖 讗转 砖谞讬 讛诪住驻专讬诐 砖住讘讬讘讜 讜转讞诇讬祝 讗转 讻诇 讛砖诇讬砖讬讛 讘转讜爪讗转 讛讞讬讘讜专 (讗谞讞谞讜 讬讜讚注讬诐 砖讝讛 诪住驻专讬诐, 讻讬 讗诐 讛讬讜 住讜讙专讬讬诐 诪住讘讬讘 诇驻诇讜住 讛讬讬谞讜 谞讻谞住讬诐 驻谞讬诪讛 诇驻转讜专 讗讜转诐 诇驻讬 住注讬祝 1)
3. 讗诐 讬砖 讻驻诇 讘讘讬讟讜讬 讛讬讗 转讞驻砖 讗转 砖谞讬 讛诪住驻专讬诐 砖住讘讬讘讜 讜转讞诇讬祝 讗转 讻诇 讛砖诇讬砖讬讬讛 讘诪讻驻诇讛.
讝讗转 讛讚专讱 讘讛 讗谞讬 驻转专转讬 讗转 讛转专讙讬诇 讘诪拽讜专 讜拽讜讚 讛驻讜谞拽爪讬讛 讘砖驻转 Elixir 谞专讗讛 讻讱:
def solve_part2(expr) do
cond do
String.contains?(expr, "(") ->
Regex.replace(~r/\(([^()]+)\)/, expr, fn _, expr -> solve_part2(expr) end)
|> solve_part2
String.contains?(expr, "+") ->
Regex.replace(~r/(\d+) \+ (\d+)/, expr, fn
_, op1, op2 -> Integer.to_string(String.to_integer(op1) + String.to_integer(op2))
end)
|> solve_part2
String.contains?(expr, "*") ->
Regex.replace(~r/(\d+) \* (\d+)/, expr, fn
_, op1, op2 -> Integer.to_string(String.to_integer(op1) * String.to_integer(op2))
end)
|> solve_part2
true -> expr
end
end
## 讛讙讬砖讛 诪讜谞讞讬转 讛注爪诪讬诐: 讗驻砖专 诇砖谞讜转 讗转 诪砖诪注讜转 讛讗讜驻专讟讜专讬诐 砖诇 讛砖驻讛
驻讬转专讜谉 讬爪讬专转讬 砖诇讬砖讬 讜拽爪专 讘讬讜转专 诇转专讙讬诇 讛讝讛 讛讜讗 讛注诪住转 讗讜驻专讟讜专讬诐. 诇讗 讻诇 砖驻转 转讻谞讜转 诪讗驻砖专转 讗转 讝讛 讗讘诇 讗诐 讬砖 诇讻诐 砖驻讛 砖诪讗驻砖专转 诇砖谞讜转 讗转 讛讻驻诇 讻讱 砖讬讞讝讬专 诇诪砖诇 住讻讜诐, 讜讗讜诇讬 讗讜驻专讟讜专 讗讞专 砖讬讞讝讬专 诇诪砖诇 讻驻诇, 讗转诐 讬讻讜诇讬诐 驻砖讜讟 诇讛讞诇讬祝 讗转 讛诪砖诪注讜转 砖诇 讛讗讜驻专讟讜专讬诐 讗讘诇 住讚专 讛拽讚讬诪讜讬讜转 讬讬砖讗专 讻诪讜 讘诪拽讜专. 讛谞讛 讚讜讙诪讛 讘砖驻转 专讜讘讬:
class Integer
alias_method :real_plus, :+
alias_method :real_mul, :*
def -(other)
self.real_mul(other)
end
def *(other)
self.real_plus(other)
end
end
def solve(expr)
puts(eval(expr.gsub("*", "-").gsub("+", "*")))
end
solve("2 + 2 * 2")
solve("1 + (2 * 3) + (4 * (5 + 6))")
讗谞讬 诪讞诇讬祝 讗转 住讬诪谉 讛讻驻诇 讘住讬诪谉 讛讞讬住讜专, 讜讗转 住讬诪讜谉 讛讞讬讘讜专 讘住讬诪谉 讛讻驻诇, 讗讘诇 讘讗讜转讜 讝诪谉 讙诐 诪讞诇讬祝 讗转 讛诪砖诪注讜转 砖诇 讛住讬诪谞讬诐 讻讱 砖讞讬住讜专 讘注爪诐 讬注砖讛 讻驻诇, 讜讻驻诇 讘注爪诐 讬注砖讛 讞讬讘讜专. 诪驻注讬诇讬诐 eval 讜谞讜转谞讬诐 诇专讜讘讬 诇住讬讬诐 讗转 讛拽住诐.1 419
# 砖诇讜砖讛 驻讬转专讜谞讜转 讬爪讬专转讬讬诐 诇 AoC 2020 Day 18 - 住讚专 驻注讜诇讜转
诇转专讙讬诇 砖诇 讬讜诐 18 讛讬讛 驻讬转专讜谉 讗讞讚 讗讬谞讟讜讗讬讟讬讘讬 讜诪住讜专讘诇 讜讛讬讜 注讜讚 讛专讘讛 驻讬转专讜谞讜转 讬爪讬专转讬讬诐 砖讗讬驻砖专讜 诇讛讙讬注 诇转讜爪讗讛 讛专讘讛 讬讜转专 诪讛专. 讘驻讜住讟 讝讛 讗爪讬讙 讗转 讛转专讙讬诇 讘注讘专讬转 讜谞专讗讛 砖诇讜砖 讚专讻讬诐 讬爪讬专转讬讜转 诇讙砖转 讗诇讬讜.
## 诪讛 爪专讬讱 诇注砖讜转
讛诪砖讬诪讛 砖诇谞讜 讛讬讗 诇注讝讜专 诇讞讘专 讘讘注讬讜转 讘诪转诪讟讬拽讛. 讗讘诇 讛诪转诪讟讬拽讛 讘诪讞讘专转 砖诇 讛讞讘专 讛讜诇讻转 诇驻讬 讞讜拽讬诐 砖讜谞讬诐 诪诪讛 砖讗谞讞谞讜 诪讻讬专讬诐: 讘诪拽讜诐 砖讻驻诇 讬讘讜讗 诇驻谞讬 讞讬讘讜专 讛诪爪讘 讛驻讜讱 讜讬砖 诇讘爪注 讗转 讛讞讬讘讜专 诇驻谞讬 讛讻驻诇. 讗讬谉 讞讬住讜专 讗讜 讞诇拽讬 讜讗驻砖专 诇讛砖转诪砖 讘住讜讙专讬讬诐 讻讚讬 诇拽讘讜注 住讚专 驻注讜诇讜转, 诪诪砖 讻诪讜 讗爪诇谞讜.
诇讻谉 讘讞砖讘讜谉 讛诪讜讝专 砖诇 讛讞讘专 讛转专讙讬诇 讛讘讗 讬讬转谉 讗转 讛转讜爪讗讛 8:
2 + 2 * 2
讗讬讱 讝讛 注讜讘讚? 拽讜讚诐 诪讞讘专讬诐 讗转 讛 2 + 2 讻讚讬 诇拽讘诇 4, 讜讗讝 讗转 讛转讜爪讗讛 讻讜驻诇讬诐 讘-2 讜诪拽讘诇讬诐 砖诪讜谞讛. 讛转专讙讬诇 讛讘讗 注诐 住讜讙专讬讬诐 谞讜转谉 51:
1 + (2 * 3) + (4 * (5 + 6))
谞转讞讬诇 注诐 讛住讜讙专讬讬诐 讛驻谞讬诪讬讬诐 讘爪讚 讬诪讬谉, 讻诇讜诪专 谞讞讘专 5 讜-6 讻讚讬 诇拽讘诇 11, 讗讜转讜 谞讻驻讜诇 讘-4 讻讚讬 诇拽讘诇 44, 诇讝讛 谞讞讘专 讗转 转讜爪讗转 讛住讜讙专讬讬诐 讛讘讗讬诐 (6) 讜讗转 1, 住讱 讛讻诇 44 讜注讜讚 7 砖讜讜讛 51.
讛驻讬转专讜谉 讛诪住讜专讘诇 诇转专讙讬诇 讬讛讬讛 诇讞诇拽 讗转 讛砖讜专讛 诇专砖讬诪讛 砖诇 诪住驻专讬诐 讜驻注讜诇讜转 讜讗讝 诇专讜抓 讘诇讜诇讗讛 注诇 讛专砖讬诪讛, 讻诇 讛讝诪谉 诇讝讻讜专 诪讛 讛讚讘专讬诐 讛拽讜讚诪讬诐 砖专讗讬谞讜, 讜诇讛转拽讚诐 诇讗讟 诇讗讟 讘驻讬转专讜谉. 讗谞讬 诇讗 讗专讗讛 讗转 讛讙讬砖讛 讛讝讗转 讻讗谉. 讘诪拽讜诐 讝讛, 讘讜讗讜 谞专讗讛 砖诇讜砖讛 专注讬讜谞讜转 讬讜转专 讬爪讬专转讬讬诐 诇驻讬转专讜谉 讛转专讙讬诇.
## 讛讙讬砖讛 讛讬讜谞讬拽住讗讬转: 讗驻砖专 诇讻转讜讘 诪讞砖讘讜谉 注诐 Bison 讜 Flex
讻讬讜讜谉 专讗砖讜谉 讬讛讬讛 诇讛砖转诪砖 讘讻诇讬诐 bison 讜 flex 讻讚讬 诇讻转讜讘 诪讞砖讘讜谉 讞讚砖 诇驻讬 讗讬讝讛 讞讜拽讬诐 砖讗谞讞谞讜 专讜爪讬诐. 讛讻诇讬 flex 诇讜拽讞 拽讜讚 诪拽讜专 讜讘讗诪爪注讜转 讘讬讟讜讬讬诐 专讙讜诇讗专讬讬诐 诪讙讚讬专 讗讬讝讛 "讟讜拽谞讬诐" 讬砖 讘拽讜讚 讛讝讛, 讜讛讻诇讬 bison 诇讜拽讞 讗转 讛讟讜拽谞讬诐 讛讗诇讛 讜诪讙讚讬专 诪讛 诇注砖讜转 讗讬转诐 讻砖诪爪讗谞讜 讗讜转诐 讘讗诪爪注讜转 讻诇诇讬 讚讬拽讚讜拽. 讬砖 转讬注讜讚 讟讜讘 注诇 砖谞讬 讛讻诇讬诐 讗讝 讗诐 讛拽讜讚 讬注谞讬讬谉 讗转讻诐 砖讜讜讛 诇讞驻砖 注诇 讝讛. 讛拽讜讚 砖讗谞讬 诪专讗讛 讻讗谉 诪讘讜住住 注诇 讛拽讜讚 讛讻诇诇讬 讬讜转专 诇诪讞砖讘讜谉 砖诪讜驻讬注 讻讗谉:
https://github.com/meyerd/flex-bison-example
讗谞讬 诪转讞讬诇 注诐 讛拽讜讘抓 calc.l 砖讛讜讗 讛拽诇讟 诇 flex, 讻诇讜诪专 讝讛 讛拽讜讘抓 砖诪讙讚讬专 讗讬讝讛 讟讜拽谞讬诐 讗谞讬 讛讜诇讱 诇专讗讜转:
%option noyywrap
%{
#include <stdio.h>
#define YY_DECL int yylex()
#include "calc.tab.h"
%}
%%
[ \t] ; // ignore all whitespace
[0-9]+ {yylval.ival = atoi(yytext);
\n {return T_NEWLINE;}
"+" {return T_PLUS;}
"*" {return T_MULTIPLY;}
"(" {return T_LEFT;}
")" {return T_RIGHT;}
"exit" {return T_QUIT;}
"quit" {return T_QUIT;}
%%
讛讞诇拽 讛讞砖讜讘 讘拽讜讘抓 讛讜讗 讛住讜祝 砖诇讜: 讗谞讬 诪讙讚讬专 砖诪住驻专讬诐 讬注讚讻谞讜 诪砖转谞讛 (砖诪讜讙讚专 讘拽讜讘抓 讛砖谞讬) 诇讛讻讬诇 讗转 讛注专讱 讛诪住驻专讬 砖诇讛诐; 驻注讜诇讜转 讛驻诇讜住 讜讛讻驻讜诇 讬讬拽专讗讜 T_PLUS 讜 T_MULTIPLY 讜谞转转讬 讙诐 砖诪讜转 诇驻注讜诇讜转 讛住讜讙专讬讬诐, 讬专讬讚转 砖讜专讛 讜诇诪讬诇讬诐 exit 讜 quit.
讛拽讜讘抓 讛砖谞讬 讘讚讜讙诪讛 讜讙诐 讛讗专讜讱 讬讜转专 讛讜讗 calc.y. 专讜讘 讛拽讜讚 讛讜讗 Boilerplate 讜讛转讜讻谉 讛诪诇讗 谞专讗讛 讻讱:
%{
#include <stdio.h>
#include <stdlib.h>
extern int yylex();
extern int yyparse();
extern FILE* yyin;
void yyerror(const char* s);
%}
%union {
unsigned long ival;
}
%token<ival> T_INT
%token T_PLUS T_MULTIPLY T_LEFT T_RIGHT
%token T_NEWLINE T_QUIT
%left T_MULTIPLY
%left T_PLUS
%type<ival> expression
%start calculation
%%
calculation:
| calculation line
;
line: T_NEWLINE
| expression T_NEWLINE { printf("%ld\n", $1); }
| T_QUIT T_NEWLINE { exit(0); }
;
expression: T_INT { $$ = $1; }
| expression T_PLUS expression { $$ = $1 + $3; }
| expression T_MULTIPLY expression { $$ = $1 * $3; }
| T_LEFT expression T_RIGHT { $$ = $2; }
;
%%
int main() {
yyin = stdin;
do {
yyparse();
} while(!feof(yyin));
return 0;
}
void yyerror(const char* s) {
fprintf(stderr, "Parse error: %s\n", s);
exit(1);
}
讛讞诇拽 讛讞砖讜讘 讘拽讜讘抓 讝讛 讛讜讗 讛砖讜专讜转 砖诪转讞讬诇讜转 讘 %left. 砖讜专讜转 讗诇讛 拽讜讘注讜转 讗转 住讚专 讛驻注讜诇讜转 讻讗砖专 诪讛 砖诪讜驻讬注 谞诪讜讱 讬讜转专 讘拽讜讘抓 讛讜讗 讘注诇 拽讚讬诪讜转 讙讘讜讛讛 讬讜转专. 讘讚讜讙诪讛 砖诇谞讜 讛砖讜专讜转:
%left T_MULTIPLY
%left T_PLUS
讗讜诪专讜转 砖讗讜驻专讟讜专 驻诇讜住 拽讜讚诐 诇讗讜驻专讟讜专 讛讻驻诇. 讛讞诇拽 讛诪注谞讬讬谉 讛砖谞讬 讛讜讗 讛讘诇讜拽 讛讘讗 砖拽讜讘抓 诪讛 讻诇 讗讜驻专讟讜专 注讜砖讛:
expression: T_INT { $$ = $1; }
| expression T_PLUS expression { $$ = $1 + $3; }
| expression T_MULTIPLY expression { $$ = $1 * $3; }
| T_LEFT expression T_RIGHT { $$ = $2; }
;
讜讛讜讗 讚讬 诪住讘讬专 讗转 注爪诪讜.
讘砖讘讬诇 诇讛砖转诪砖 讘砖谞讬 讛拽讘爪讬诐 讬砖 诇讛驻注讬诇 诪砖讜专转 讛驻拽讜讚讛:1 419
# 诇诪讛 拽砖讛 讻诇 讻讱 诇住讬讬诐 驻专讜讬拽讟 转讜讻谞讛
诪讜诇 讛讞诇讜谉 砖诇讬 讛诐 讘讜谞讬诐 讘谞讬讬谉. 讘讛转讞诇讛 注砖讜 讛专讘讛 专注砖 讗讘诇 注讻砖讬讜 驻砖讜讟 诪转拽讚诪讬诐 诇讗讟, 拽讜诪讛 讗讞专讬 拽讜诪讛. 讜讗谞讬 诪住转讻诇 注诇讬讛诐 讜住讜驻专 讗转 讛拽讜诪讜转 注讚 砖讬住讬讬诪讜 讜讻讜诇讬 拽讬谞讗讛.
讻讬 讻诇 拽讜诪讛 砖讛诐 诪住讬讬诪讬诐 讘讘谞讬讬谉 讛讬讗 拽讜诪讛 砖讛诐 住讬讬诪讜. 驻讛 讝讛 谞讙诪专.
讗讘诇 讗爪诇讬 讘拽讜讚? 讻诇 驻讬爪'专 砖讗谞讬 讻讜转讘 讻讗讬诇讜 诪讝诪讬谉 驻谞讬诪讛 注讜讚 5 讞讘专讬诐, 讜讝讛 注讜讚 诇驻谞讬 砖讚讬讘专谞讜 注诇 讘讗讙讬诐. 讻讻诇 砖讗谞讬 诪转拽讚诐 讘讘谞讬讬谉 讻讻讛 讛转讜讻谞讬讜转 诪诪砖讬讻讜转 诇讛砖转谞讜转 讜讘诪拽讘讬诇 拽讜诪讜转 讬砖谞讜转 诪转讞讬诇讜转 诇讛转驻讜专专.
讘谞讬讬转 讘谞讬讬谉 诪住转讬讬诪转 讻砖讛讚讬讬专讬诐 谞讻谞住讬诐, 讗讘诇 驻专讜讬拽讟 转讜讻谞讛 谞讙诪专 讻砖讛诪砖转诪砖讬诐 讬讜爪讗讬诐. 讜讝讛 讗讜诇讬 讛讛讘讚诇 讛讙讚讜诇 讘讬谉 讛砖谞讬讬诐.
1 419
# 诪讜转专 诇讛转讞专讟
"讗讘诇 讻讘专 讻转讘转讬 讗转 讝讛", "讘诪讛 砖注讜讘讚 诇讗 谞讜讙注讬诐" 讜"讘砖讘讬诇 诪讛 诇注讘讜讚 讻驻讜诇?" 讛诐 讻讜诇诐 讟讬注讜谞讬诐 讟讜讘讬诐 谞讙讚 Refactoring. 讛诪讞砖讘讛 讗讜诪专转 砖讗诐 讗谞讬 讗砖谞讛 注讻砖讬讜 诪砖讛讜 诇讗 专拽 砖讗谞讬 讞讜讝专 诇谞拽讜讚转 讛讛转讞诇讛 讜讗谞讬 诇讗 讘讟讜讞 讗诐 讘讻诇诇 讛专注讬讜谉 讛讞讚砖 讟讜讘 讬讜转专, 讗诇讗 砖讙诐 讗讞专讬 讛讻转讬讘讛 讗谞讬 讗爪讟专讱 诇注讘讜讚 拽砖讛 讻讚讬 诇讛讘讬谉 讗诐 砖讘专转讬 诪砖讛讜, 讜讛讻讬 讙专讜注 - 讗诐 讛专注讬讜谉 讛讞讚砖 讬讬拽讞 讬讜转专 讝诪谉 诪诪讛 砖讞砖讘转讬 砖讬讬拽讞, 讗谞讬 讗转拽注 注诐 拽讜讚 讞爪讬 注讜讘讚 讜诇讗 讗讜讻诇 诇讛转拽讚诐 讘驻讬转讜讞.
诪讜转专 诇讛转讞专讟 讝讛 讘讚讬讜拽 讛住讬驻讜专 讛讛驻讜讱: 诪讜转专 诇讛转讞专讟 讗讜诪专 砖讙诐 讗诐 讛讬讛 诇讬 专注讬讜谉 讜注讻砖讬讜 讗谞讬 讻讘专 诇讗 讘讟讜讞 砖讛讜讗 讻讝讛 讟讜讘, 诪讜转专 诇讬 诇砖谞讜转 讗转 讚注转讬, 诪讜转专 诇讬 诇谞住讜转 诪砖讛讜 讗讞专 讜讗讜诇讬 诇讘讞讜专 讗转 讛讚讘专 讛讗讞专, 讜讗讜诇讬 诇讛讬砖讗专 注诐 讛专注讬讜谉 讛诪拽讜专讬. 诪讜转专 诇讛转讞专讟, 讻讬 专拽 讻砖诪讜转专 诇讛转讞专讟 讗驻砖专 讘讗诪转 诇砖讞拽 注诐 讛拽讜讚.
讘砖讘讬诇 砖讬讛讬讛 诪讜转专 诇讛转讞专讟 爪专讬讱 诪注专讻讜转 转讜诪讻讜转 讻诪讜讘谉: 爪专讬讱 诪谞讙谞讜谉 讘讚讬拽讜转 讗讜讟讜诪讟讬 砖诪专讗讛 诇讬 讘诇讞讬爪转 讻驻转讜专 讗诐 讛专注讬讜谉 讛讞讚砖 讙诐 注讜讘讚, 讜讗诐 诇讗 讗讝 讻诪讛 注讜讚 谞砖讗专 诇转拽谉 讻讚讬 砖讬注讘讜讚; 爪专讬讱 诇讚注转 诇注讘讜讚 注诐 讙讬讟 讻讚讬 砖讗驻砖专 讬讛讬讛 转诪讬讚 诇讘专讜讞 讞讝专讛 诇拽讜讚 讛讬砖谉 砖注讘讚, 诇讗 诪砖谞讛 讻诪讛 砖讘专转讬. 讜讛讻讬 讞砖讜讘 爪专讬讱 诇注讘讜讚 讘住讘讬讘讛 砖诪拽讘诇转 讗转 讝讛 砖讞诇拽 诪讛讝诪谉 讗谞讞谞讜 讛讜诇讻讬诐 诇讘诇讜转 讘 Refactoring 讜讘讞砖讬讘讛 诪讞讚砖 注诇 讚讘专讬诐 砖讻讘专 讻转讘谞讜. 专拽 讻讱 讛诪注专讻转 讻讜诇讛 讙讚诇讛 讜讗谞讞谞讜 诇讗 谞转拽注讬诐 注诐 Legacy Code 砖诇讗祝 讗讞讚 讗讬谉 讗讜诪抓 诇砖谞讜转.
诪讜转专 诇讛转讞专讟. 讗驻讬诇讜 砖讻讘专 讬砖 诇讬 拽讜讚 砖注讜讘讚.
1 419
# 讝讛 诇讗 注讜讝专 诇讞砖讜讘 讬讜转专 讞讝拽
讘转讜专 诪转讻谞转讬诐 讗谞讞谞讜 讗讜讛讘讬诐 诇讞砖讜讘 砖讗谞讞谞讜 讬讜讚注讬诐 讛讻诇, 讬讻讜诇讬诐 讛讻诇, 讙讙 讞讬驻讜砖 拽爪专 讘讙讜讙诇 讘砖讘讬诇 讛住讬谞讟拽住 讗讘诇 讘讙讚讜诇 - 拽讟谉 注诇讬谞讜. 讻砖讗转讛 注讜讘讚 讘转讜讱 注讜诇诐 转讜讻谉 砖讗转 专讜讘讜 讗转讛 诪讻讬专, 讜讛注讘讜讚讛 讛讬讗 讘住讱 讛讻诇 诇讻转讜讘 注讜讚 诪讗讜转诐 讛讚讘专讬诐, 拽诇 诇讛转专讙诇 讜诇讞砖讜讘 砖注诐 拽爪转 讬讜转专 讙讜讙诇 讗讜 注诐 拽爪转 讬讜转专 讝诪谉 诪讞砖讘讛 讗驻砖专 诇驻转讜专 讻诇 讘注讬讛.
讛讗诪转 讻诪讜讘谉 讬讜转专 诪讜专讻讘转.
讘讬诪讬诐 讛讟讜讘讬诐 砖诇 CSS 诇驻谞讬 讻诇 讛 border-radius 讛讬讛 驻讜驻讜诇专讬 讘专讗讬讜谞讜转 注讘讜讚讛 诇讘拽砖 诪讛诪讜注诪讚 诇爪讬讬专 div 讬诐 驻讬谞讜转 注讙讜诇讜转. 讛驻讬转专讜谉 讛讬讛 诇讘谞讜转 4 div-讬诐 讗讞讚 讘转讜讱 讛砖谞讬 讜诇讛讙讚讬专 诇讻诇 讗讞讚 转诪讜谞转 专拽注 讗讞专转, 讜讗谞讬 诇讗 诪讗诪讬谉 砖诪讬砖讛讜 讛讬讛 诪讙讬注 诇讝讛 讘诇讬 诇讛讻讬专 讗转 讛讟专讬拽 拽讜讚诐. 讝讛 驻砖讜讟 诇讗 注讜讝专 诇砖讘转 讜诇讞砖讜讘 讬讜转专 讞讝拽.
讗讜 谞住讜 诇讝讛讜转 诪转讬 砖谞讬 注讬讙讜诇讬诐 注诇 讛诪住讱 诪转谞讙砖讬诐 讗讞讚 讘砖谞讬 讘诇讬 诇讛讻讬专 讗转 诪砖驻讟 驻讬转讙讜专住. 讝讛 诇讗 讬注讝讜专 诇讞砖讜讘 讬讜转专 讞讝拽, 爪专讬讱 诇讚注转 诪讛 讛诪专讞拽 讘讬谞讬讛诐.
讛讘讞讬专讛 诇砖讘转 讜诇讞砖讜讘 注诇 讛讘注讬讛 讗讜诇讬 谞专讗讬转 专注讬讜谉 讟讜讘, 讗讘诇 讻诪注讟 转诪讬讚 讛讬讻专讜转 讟讜讘讛 注诐 注讜诇诐 讛转讜讻谉, 注诐 讛驻讬转专讜谞讜转 讛拽讬讬诪讬诐 讜注诐 讛讬转专讜谞讜转 讜讛讞住专讜谞讜转 砖诇 讻诇 讙讬砖讛 讛诐 讛讚讘专讬诐 砖谞讜转谞讬诐 诇谞讜 讗转 讛讻诇讬诐 诇讞砖讜讘 讜讙诐 诇讛讙讬注 诇转讜爪讗讜转. 讝讛 诇讗 注讜讝专 诇讞砖讜讘 讬讜转专 讞讝拽 讗诐 讗转诐 诇讗 诪讻讬专讬诐 诪住驻讬拽 讟讜讘 讗转 讛讻诇讬诐 讜讛讟讻谞讬拽讜转 讛拽讬讬诪讬诐.
1 419
# 转讗讬诪讜转 讗讞讜专讛
讻讱 谞专讗讛 讞诇拽 诪诇讜讙 讛拽讜诪讬讟讬诐 讛讗讞专讜谞讬诐 讘住驻专讬讬转 ini, 住驻专讬讛 诇注讘讜讚讛 注诐 拽讘爪讬 ini 讘 JavaScript:
* 20e950e Use Object.create(null) to avoid default object property hazards
* a2c5da8 (tag: v1.3.8) 1.3.8
* af5c6bb Do not use Object.create(null)
* 8b648a1 don't test where our devdeps don't even work
* c74c8af (tag: v1.3.7) 1.3.7
* 024b8b5 update deps, add linting
* 032fbaf Use Object.create(null) to avoid default object property hazards
砖讬诪讜 诇讘 诪诇诪讟讛 诇诪注诇讛 诇拽讜诪讬讟讬诐 砖拽砖讜专讬诐 诇 Object.create:
1. 拽讜诪讬讟 032fbaf 注讘专 诇讛砖转诪砖 讘 Object.create(null)
2. 拽讜诪讬讟 af5c6bb 讞讜讝专 诇 Object.create 专讙讬诇
3. 讜拽讜诪讬讟 20e950e 讞讜讝专 诇 Object.create(null)
讛驻讜谞拽爪讬讛 Object.create(null) 诪讞讝讬专讛 讗讜讘讬拽讟 讞讚砖 讜专讬拽, 砖诇讗 讻讜诇诇 讗转 讛诪讗驻讬讬谞讬诐 讛专讙讬诇讬诐 砖诇 讗讜讘讬拽讟讬诐 讘 JavaScript, 讘注讜讚 砖讛驻注诇讛 专讙讬诇讛 砖诇 讗讜转讛 驻讜谞拽爪讬讛 (讘诇讬 讛驻专诪讟专 null) 诪讞讝讬专讛 讗讜讘讬拽讟 砖讬讜专砖 诪 Object 讜诇讻谉 诪讻讬诇 诪住驻专 诪讗驻讬讬谞讬诐 诪讜讘谞讬诐 砖诇 JavaScript. 住驻专讬讬转 ini 诪讞讝讬专讛 讗讜讘讬拽讟 讗讬转讜 讗驻砖专 诇讙砖转 诇诪讬讚注 砖讘 ini.
注讻砖讬讜 诪讛 拽专讛? 讗谞砖讬诐 砖拽讬讘诇讜 讗转 讛住驻专讬讛 专爪讜 诇讘讚讜拽 讗诐 讘讗诪转 讬砖 砖讚讛 诪住讜讬诐 讘拽讜谞驻讬讙讜专爪讬讛, 讗讘诇 讘砖讘讬诇 诇讗 诇讛转讘诇讘诇 注诐 讛诪讗驻讬讬谞讬诐 讛诪讜讘谞讬诐 砖诇 JavaScript 讛砖转诪砖讜 讘拽讜讚 砖谞专讗讛 讻讱:
config.hasOwnProperty(blah)
讻讜转讘 讛住驻专讬讛 讛讞诇讬讟 诇讛注诇讜转 转讬拽讜谉 砖讬讙专讜诐 诇讝讛 砖讗讜讘讬拽讟讬 讛讛讙讚专讜转 砖讞讜讝专讬诐 讬讛讬讜 专讬拽讬诐, 讘诇讬 砖讬讚注 砖讗谞砖讬诐 砖讛砖转诪砖讜 讘住驻专讬讛 讻讘专 讛讙谞讜 注诇 注爪诪诐 注诐 讛转讘谞讬转 砖诇 hasOwnProperty. 讛转讜爪讗讛? 拽讜讚 讛讛讙谞讛 (注诐 hasOwnProperty) 讛驻住讬拽 诇注讘讜讚, 讻讬 讘讗讜讘讬拽讟 砖讞讝专 讙诐 讛驻讜谞拽爪讬讛 hasOwnProperty 讻讘专 诇讗 拽讬讬诪转.
讜讛拽讜诪讬讟 讛讗讞专讜谉 砖讞讜讝专 诇 Object.create(null) ? 谞讜, 讝讗转 讘讚讬讜拽 讛住讬讟讜讗爪讬讛 砖讘讙诇诇讛 驻讜转讞讬诐 讙讬专住讛 2 砖诇 讛住驻专讬讛 讜砖讜讘专讬诐 转讗讬诪讜转 讗讞讜专讛.
砖讬诪讜 诇讘 讘注讘讜讚讛 注诐 npm 诇砖讬讚专讜讙讬诐 诪讛住讜讙 讛讝讛. 诪爪讚 讗讞讚 讻诇 讛 toolchain 诪注讜讚讚 讗讜转谞讜 诇注讚讻谉 讻诇 讛讝诪谉 讗转 讛讞讘讬诇讜转 (砖讝讛 讗讞诇讛), 讗讘诇 诪爪讚 砖谞讬 讘讻诇 注讚讻讜谉 爪专讬讱 诇讘讚讜拽 讟讜讘 诪讛 讗谞讞谞讜 砖讜讘专讬诐 讜诪讛 讛住讬驻讜专 住讘讬讘 讻诇 诪谞讙谞讜谉 砖诪砖转谞讛. 讜讻谉 讝讜 注讜讚 转讝讻讜专转 诇讻诪讛 讞砖讜讘 诇讻转讜讘 讘讚讬拽讜转 讬讞讬讚讛 讜诇爪诪爪诐 讘 mock-讬诐.1 419
# 驻讬转专讜谉 诪讜住讘专 诇 Advent Of Code 2020 讬讜诐 5
讻诪讜 讘讻诇 讚爪诪讘专 讙诐 讛讞讜讚砖 讗专讬拽 讜讜住讟诇 诪驻专住诐 讗转 讞讬讚讜转 讛转讻谞讜转 砖诇讜 讻诇 讬讜诐. 讘讬谞转讬讬诐 注讘专谞讜 拽爪转 讬讜转专 诪砖讘讜注 讜讝讛 讝诪谉 讟讜讘 诇拽讞转 讗讜讜讬专 讜诇砖转祝 讞讬讚讛 诇讚讜讙诪讛 砖讗讜诇讬 转注砖讛 诇讻诐 讞砖拽 诇讛爪讟专祝 诇砖讘讜注讬讬诐 讜讞爪讬 砖谞砖讗专讜. 讗谞讞谞讜 诪住转讻诇讬诐 注诇 讛讞讬讚讛 讜讛驻讬转专讜谉 砖诇 讬讜诐 5 讜讘砖驻转 专讜讘讬 (诇诪专讜转 砖讛拽讜讚 拽爪专 讜拽诇 诇讚诪讬讬谉 讗转 讛转专讙讜诐 诇砖驻讜转 讗讞专讜转).
## 讛讞讬讚讛
诪讙讬驻转 讛拽讜专讜谞讛 讛住转讬讬诪讛 讜讞讘专转 讛转注讜驻讛 讛讬讞讬讚讛 砖砖专讚讛 讗转 讛转拽讜驻讛 诪砖转诪砖转 讘砖讬讟转 讛讜砖讘讛 讬讬讞讜讚讬转 砖诪讟专转讛 讛讬讞讬讚讛 诇砖讙注 讗转 讛谞讜住注讬诐: 注诇 讻诇 讻专讟讬住 讘诪拽讜诐 诇讻转讜讘 讗转 诪住驻专 讛砖讜专讛 讻转讜讘讜转 讛讜专讗讜转 讗讬讱 诇讛讙讬注 诇砖讜专讛 讛诪转讗讬诪讛.
讛讛讜专讗讜转 诪讜专讻讘讜转 诪砖转讬 讛讗讜转讬讜转 F 讜 B 讻讗砖专 F 讗讜诪专转 诇诇讻转 诇讞诇拽 讛拽讚诪讬 砖诇 讛诪讟讜住 讜 B 诇讞诇拽 讛讗讞讜专讬, 讗讘诇 讝讛 诇讗 谞讙诪专 砖诐. 讛讗讜转 F 讗讜 B 讛讘讗讛 讗讜诪专转 诇诇讻转 诇讞诇拽 讛拽讚诪讬 讗讜 讛讗讞讜专讬 砖诇 讞爪讬 讛诪讟讜住 讗诇讬讜 讛讙注转诐 诪讛讛讜专讗讛 讛拽讜讚诪转, 讜讻讱 讛诇讗讛 注讚 砖谞砖讗专讛 砖讜专讛 讗讞转 - 讛讬讗 讛砖讜专讛 砖诇讻诐.
诇讚讜讙诪讛 讗诐 讘诪讟讜住 讬砖 128 砖讜专讜转 讗讝 讛讛讜专讗讜转 FBFBBFF 讬讜讘讬诇讜 讗讜转谞讜 讻讱:
1. 讛 F 讛专讗砖讜谉 砖讜诇讞 讗讜转谞讜 诇拽讬讚诪转 讛诪讟讜住 讻诇讜诪专 讗谞讞谞讜 讬讜讚注讬诐 砖爪专讬讱 诇砖讘转 讘讬谉 砖讜专讛 0 诇 63.
2. 讛 B 砖讗讞专讬讜 诇讜拽讞 讗讜转谞讜 诇讞诇拽 讛讗讞讜专讬 讘讞爪讬 讛诪讟讜住 砖诇谞讜, 讻诇讜诪专 爪专讬讱 诇砖讘转 讘讬谉 砖讜专讛 32 诇 63.
3. 讛 F 讛讘讗 讘转讜专 讗讜诪专 砖爪专讬讱 诇诇讻转 诇讞诇拽 讛拽讚诪讬 砖诇 讞爪讬 讛诪讟讜住 砖诇谞讜, 讻诇讜诪专 讘讬谉 砖讜专讛 32 诇 47.
4. 讛 B 讛讘讗 砖讜诇讞 讗讜转谞讜 诇讞诇拽 讛讗讞讜专讬 砖诇 讞爪讬 讛诪讟讜住 砖诇谞讜, 讻诇讜诪专 讘讬谉 砖讜专讛 40 诇 47.
5. 讛 B 讛讘讗 诪爪诪爪诐 讗转 讛讟讜讜讞 诇砖讜专讜转 44 注讚 47.
6. 讛 F 讛讘讗 诪爪诪爪诐 讗转 讛讟讜讜讞 诇砖讜专讜转 44 注讚 45.
7. 讜讛 F 讛讗讞专讜谉 砖讜诇讞 讗讜转谞讜 诇诪拽讜诐 讘砖讜专讛 44.
讗驻砖专 专拽 诇讚诪讬讬谉 讗转 讛专讬讘讬诐 讜讛爪注拽讜转 讻砖讗谞砖讬诐 讬砖讘讜 讘诪拽讜诪讜转 讗讞讚 砖诇 讛砖谞讬 讜讬谞住讜 诇讛住讘讬专 砖讝讛 讘注爪诐 讛诪拽讜诐 砖诇讛诐. 讗讙讘 讘砖讘讬诇 诇讛讜住讬祝 诇讘诇讘讜诇 讙诐 诪住驻专 讛讻住讗 讘转讜讱 讛砖讜专讛 诪拽讜讚讚 讘讗讜转讜 讛讗讜驻谉 讛驻注诐 注诐 讛讗讜转讬讜转 L 讜 R 讻砖 L 讗讜诪专转 诇诇讻转 砖诪讗诇讛 诇讞诇拽 讛转讞转讜谉 砖诇 讛诪住驻专讬诐 讜 R 讬诪讬谞讛 诇讞诇拽 讛注诇讬讜谉 (讛诪讜砖讘讬诐 讘讻诇 砖讜专讛 诪诪讜住驻专讬诐 讘讬谉 0 诇 7).
注讻砖讬讜 诇转专讙讬诇 - 讘讛讬谞转谉 专砖讬诪讛 砖诇 讻专讟讬住讬 讟讬住讛 讻讗诇讛, 诪讬爪讗讜 讗转 讛讻专讟讬住 注讘讜专讜 诪住驻专 讛砖讜专讛 讻驻讜诇 砖诪讜谞讛 讜注讜讚 诪住驻专 讛注诪讜讚讛 讬讬转谉 讗转 讛注专讱 讛诪拽住讬诪诇讬.
## 讛讟专讬拽
诪讘讟 专讗砖讜谉 注诇 讛转专讙讬诇 注砖讜讬 诇讛讬讜转 诪讘讛讬诇 - 讗讬讱 谞转讞讬诇 诇讗专讙谉 砖讜专讜转 讜诇讞诇拽 讗讜转谉 讘砖讘讬诇 诇诪爪讜讗 讗转 讛诪住驻专 讛谞讻讜谉? 讗讬讱 讘讻诇诇 诪讜爪讗讬诐 讗转 讛讗讬谞讚拽住讬诐 讜讗转 讛讗诪爪注?
讗讘诇 讘诪讘讟 砖谞讬 讻讘专 讗驻砖专 诇专讗讜转 砖讻诇 讛住讬驻讜专 讛讝讛 砖诇 讻专讟讬住讬 讟讬住讛 讜讗讝讜专讬诐 讘诪讟讜住 讛讜讗 讘住讱 讛讻诇 讚专讱 诪转讜讞讻诪转 诇转讗专 诪住驻专 讘讬谞讗专讬 讜讗讞专讬 砖讗谞讞谞讜 诪讘讬谞讬诐 讗转 讝讛 驻讬转专讜谉 讛讞讬讚讛 讛讜讗 讻讘专 注谞讬讬谉 砖诇 讚拽讜转:
1. 砖讜专讛 讛讬讗 诪住驻专 讘讬讬爪讜讙 讘讬谞讗专讬 讘讬谉 0 诇 127
2. 讻诇 F 诪讬讬爪讙 讗转 讛住讬驻专讛 0
3. 讻诇 B 诪讬讬爪讙 讗转 讛住讬驻专讛 1
讛拽讜讚 诪讛讚讜讙诪讛 诪讬讬爪讙 讗转 讛诪住驻专 讛讘讬谞讗专讬 0101100 砖注专讻讜 44.
## 驻讬转专讜谉 讘专讜讘讬
谞讻转讜讘 讗转 讛驻讜谞拽爪讬讜转 讛讘讗讜转 诇驻讬转专讜谉 讛转专讙讬诇 讘砖驻转 专讜讘讬:
def row(seat)
seat.gsub("F", "0").gsub("B", "1").to_i(2)
end
def column(seat)
seat.gsub("L", "0").gsub("R", "1").to_i(2)
end
def seat_id(seat)
row(seat[0..6]) * 8 + column(seat[7..9])
end
讛驻讜谞拽爪讬讛 row 诪拽讘诇转 诪讞专讜讝转, 讛讜驻讻转 讗转 讛 F-讬诐 讜讛 B-讬诐 诇住驻专讜转 讘讬谞讗专讬讜转 讜讗讝 诪转专讙诪转 讗转 讛诪讞专讜讝转 砖讛转拽讘诇讛 诇诪住驻专 诇驻讬 讘住讬住 2. 讛驻讜谞拽爪讬讛 column 注讜砖讛 讗转 讗讜转讜 讚讘专 注诐 L 讜 R, 讜讛驻讜谞拽爪讬讛 seat_id 诪拽讘诇转 讻专讟讬住 讟讬住讛 诪诇讗, 诇讜拽讞转 讗转 讛讗讜转讬讜转 砖诇 讛砖讜专讛 诇 row, 讗转 讛讗讜转讬讜转 砖诇 讛注诪讜讚讛 诇 column 讜诪讞讘专转 讗转 讛注专讻讬诐 讻讚讬 诇拽讘诇 讗转 讛诪讝讛讛 砖讗谞讞谞讜 诪讞驻砖讬诐.
讘讛谞讞讛 砖讬砖 诇讻诐 专砖讬诪转 讻专讟讬住讬 讟讬住讛 讘转讬拽讬讬转 input 讘拽讜讘抓 day5.txt 讛拽讜讚 讛讘讗 讬拽专讗 讗转 讻讜诇诐 讜讬讚驻讬住 讗转 讛诪讝讛讛 讛讙讚讜诇 讘讬讜转专:
lines = File.read("input/day5.txt").each_line
max_id = lines.map {|line| seat_id(line) }.max
puts max_id
讛讞诇拽 讛砖谞讬 砖诇 讛转专讙讬诇 拽爪转 讬讜转专 诪住讜讘讱 讜讘讜 讬讛讬讛 注诇讬讻诐 诇诪爪讜讗 讗转 讻专讟讬住 讛讟讬住讛 讛讬讞讬讚 砖讞住专 讘注专讬诪讛, 讝讛 讛讻专讟讬住 砖诇讻诐. 诇转专讙讬诇 讛诪拽讜专讬 讜转讬讗讜专 诪诇讗 砖诇 讛讞诇拽 讛砖谞讬 讻讚讗讬 诇讘拽专 讘:
https://adventofcode.com/2020/day/5
讜讻诪讜讘谉 讗诐 讗转诐 讗讜讛讘讬诐 讞讬讚讜转 诪讛住讜讙 讛讝讛 讗专讬拽 讬诪砖讬讱 诇驻专住诐 讗讜转谉 讻诇 讛讞讜讚砖, 注诐 讞讬讚讛 讞讚砖讛 讘讗转专 讻诇 讬讜诐 讘砖讘注 讘讘讜拽专 砖注讜谉 讬砖专讗诇. 诇专砖讬诪转 讻诇 讛讞讬讚讜转 讘拽专讜 讘 Advent Of Code 2020.1 419
# 拽讬专讜转 讚讬诪讬讜谞讬讬诐
讗祝 讗讞讚 诇讗 诪讜讜转专 注诇 爪讞爪讜讞 砖讬谞讬讬诐 讻讬 "诇讗 讛讬讛 讝诪谉 讛讘讜拽专" 讗讜 讬住驻专 诇讻诐 砖讛讜讗 讻讘专 砖讘讜注 诇讗 讗讻诇 讻讬 讛讜讗 注住讜拽 诪讚讬 讘砖讘讬诇 讗专讜讞讜转. 讬砖 讚讘专讬诐 砖讗谞讞谞讜 驻砖讜讟 注讜砖讬诐.
讛诪砖讞拽 谞讛讬讛 诪注谞讬讬谉 讻砖讝讛 诪讙讬注 诇讚讘专讬诐 砖讗谞讞谞讜 专讜爪讬诐 讗讜 讬讜讚注讬诐 砖爪专讬讱 诇注砖讜转 讗讘诇 诇讗 诪讜爪讗讬诐 讗转 讛讝诪谉. 讚讘专讬诐 讻诪讜 住驻讜专讟, 诇讬诪讜讚讬诐 讗讜 讻转讬讘转 驻专讜讬拽讟 爪讚: 讻讜诇谉 诪砖讬诪讜转 砖诇 砖讬驻讜专 注爪诪讬 砖讗谞讞谞讜 诇讗 注讜砖讬诐 讜诪住驻专讬诐 诇注爪诪谞讜 砖讛讘注讬讛 讛讬讗 讝诪谉.
驻讬讚讘拽 砖讞讜讝专 讘拽讜专住讬 讛讘讜讟拽诪驻 砖讗谞讬 诪注讘讬专 驻讛 诪讚讬 驻注诐 讜转诪讬讚 诪砖诪讞 讗讜转讬 诪讞讚砖 (诇诪专讜转 砖诇驻注诪讬诐 谞讗诪专 讘讻注住): "讘讙诇诇讱 讗谞讬 讻讘专 砖讘讜注讬讬诐 拽诐 砖注讛 拽讜讚诐", 讗讜 "讞讝专转讬 诇砖讘转 注诇 讛诪讞砖讘 讘诇讬诇讜转 讻讚讬 诇诇诪讜讚". 讻砖讗谞讞谞讜 诪讜爪讗讬诐 讗转 讛诪讞住讜诐 讛讗诪讬转讬 讜诪爪诇讬讞讬诐 诇砖讘讜专 讗讜转讜, 讬砖 诇谞讜 讬讻讜诇转 诪讜驻诇讗讛 诇诪爪讜讗 讝诪谉 诇砖讬驻讜专 注爪诪讬. 讝诪谉 讗祝 驻注诐 诇讗 讛讬讛 讛讘注讬讛.
诇诪讛 讗转诐 诪转讻讜讜谞讬诐 讻砖讗转诐 讗讜诪专讬诐 砖诇讗 讛讬讛 诇讻诐 讝诪谉 诇诇诪讜讚 讛砖讘讜注? 讜注诇 诪讛 爪专讬讱 诇讛转讙讘专 讻讚讬 砖转诪爪讗讜 讗转 讛讝诪谉 讛讝讛 讘砖讘讜注 讛讘讗?
1 419
# 讘诪拽专讛 讛讙专讜注 讘讬讜转专
讘专讙注 砖讗谞讞谞讜 诪转讞讬诇讬诐 诇砖拽讜诇 诪讛 谞注砖讛 讘诪拽专讛 讛讙专讜注 讘讬讜转专 讻讘专 砖诪谞讜 注诇 讛砖讜诇讞谉 讗转 讚专讱 讛驻注讜诇讛 讛讝讗转 讜讛讙讚诇谞讜 诪砖诪注讜转讬转 讗转 讛住讘讬专讜转 砖讛讬讗 转拽专讛. 讚讜讙诪讗讜转? 讘讘拽砖讛-
"讬砖 诇讬 诪爪讙转 诇讛注讘讬专 注讜讚 砖讘讜注 注诇 谞讜砖讗 砖讗谞讬 诇讗 讘拽讬讗 讘讜. 讗谞住讛 诇诪爪讜讗 讝诪谉 诇讛转讗诪谉 讜讘诪拽专讛 讛讙专讜注 讘讬讜转专 驻砖讜讟 讗拽专讬讗 诪讛砖拽驻讬诐"
"讬砖 诇谞讜 讚诪讜 砖讘讜注 讛讘讗 讜讛诪讜爪专 注讚讬讬谉 诇讗 注讜讘讚 驻讬拽住. 谞谞住讛 诇转拽谉 讜讘诪拽专讛 讛讙专讜注 谞讬砖讗专 讘诪砖专讚 诇讬诇讛 讗讜 砖谞讬讬诐 讻讚讬 诇讛讙讬注 诪转讜拽转拽讬诐 诇讚诪讜"
"讗谞讬 爪专讬讱 诇讻转讜讘 讘讚讬拽讜转 讬讞讬讚讛 诇诪讜爪专 讛讝讛 砖讬砖 诇讜 讛诪讜谉 转诇讜讬讜转 讞讬爪讜谞讬讜转. 讗谞住讛 诇讞砖讜讘 注诇 专注讬讜谉 讜讘诪拽专讛 讛讙专讜注 讘讬讜转专 讗讻转讜讘 驻砖讜讟 Mock-讬诐 诇讻诇 讛拽讜讚 讛讞讬爪讜谞讬"
讘讻诇 讗讞讚 诪讛诪爪讘讬诐 专拽 讝讛 砖讗谞讬 诇讜拽讞 讘讞砖讘讜谉 讗讜 谞注专讱 诇诪拽专讛 讛讙专讜注 讘讬讜转专 讻讘专 砖诐 诇讬 讗讜转讜 诪讜诇 讛注讬谞讬讬诐 讜讗谞讬 诪转讞讬诇 诇讛讬注专讱 诇讗讜转讜 诪拽专讛 讜诇讛讻讬谉 讗转 注爪诪讬 诇讻诇 讗讞转 诪讛讛转诪讜讚讚讜讬讜转. 讟专讬拽 讟讜讘 砖注讜讝专 诇讛转诪讜讚讚 注诐 讛讞专讚讛 讜诇讗 诪讬讬爪专 住讬讻讜谞讬诐 诪讬讜转专讬诐 讛讜讗 诇讛诪爪讬讗 转专讞讬砖讬诐 砖讗转诐 讻谉 诪讜讻谞讬诐 诇讞讬讜转 讗讬转诐 讙诐 诇诪拽专讛 讛讙专讜注 讘讬讜转专:
"讬砖 诇讬 诪爪讙转 诇讛注讘讬专 注讜讚 砖讘讜注 注诇 谞讜砖讗 砖讗谞讬 诇讗 讘拽讬讗 讘讜. 讗谞住讛 诇诪爪讜讗 讝诪谉 诇讛转讗诪谉 讜讘诪拽专讛 讛讙专讜注 讘讬讜转专 讗讙讬讚 砖讗谞讬 讞讜诇讛 讜讗讚讞讛 讗转 讛诪爪讙转 讘讻诪讛 讬诪讬诐 讻讚讬 诇讛讙讬注 诪讜讻谉."
"讬砖 诇谞讜 讚诪讜 砖讘讜注 讛讘讗 讜讛诪讜爪专 注讚讬讬谉 诇讗 注讜讘讚 驻讬拽住. 谞诪砖讬讱 诇谞住讜转 诇转拽谉 讜讘诪拽专讛 讛讻讬 讙专讜注 谞讜讜转专 注诇 讞诇拽 诪讛驻讬爪'专讬诐 讻讚讬 诇讛讙讬注 诪转讜拽转拽讬诐 诇讚诪讜"
"讗谞讬 爪专讬讱 诇讻转讜讘 讘讚讬拽讜转 讬讞讬讚讛 诇诪讜爪专 讛讝讛 砖讬砖 诇讜 讛诪讜谉 转诇讜讬讜转 讞讬爪讜谞讬讜转. 讗谞讬 注讚讬讬谉 诇讗 讘讟讜讞 讗讬讱 诇注砖讜转 讗转 讝讛 讜讘诪拽专讛 讛讙专讜注 讘讬讜转专 讬讬拽讞 诇讬 注讜讚 讻诪讛 讬诪讬诐 注讚 砖讗讙讬注 诇驻讬转专讜谉 讟讻谞讜诇讜讙讬 砖讗谞讬 砖诇诐 讗讬转讜".
讘讞讬专转 讛住讬驻讜专 诇诪拽专讛 讛讙专讜注 讘讬讜转专 讛讬讗 诇讙诪专讬 讘讬讚讬讬诐 砖诇讻诐 讜讛讬讗 注砖讜讬讛 诇讛砖驻讬注 诇讟讜讘讛 注诇 讻诇 转讛诇讬讱 讛驻讬转讜讞.
1 419
# 谞讛讙讬 诪讜谞讬讜转 讜谞讙谞讬 讙'讗讝
讗诐 谞讛讙 诪讜谞讬转 诇讜拽讞 讗讜转讱 讘讚专讱 拽讬爪讜专 住讜讚讬转 讜讘住讜祝 讛讚专讱 诇拽讞讛 讻驻讜诇 讝诪谉 (讜讛诪讞讬专 讘讛转讗诐), 拽砖讛 诇讛讗诪讬谉 砖转专爪讛 诇转转 诇讜 讟讬驻.
讗讘诇 讻砖谞讙谉 讙'讗讝 诪讗诇转专 讘讛讜驻注讛 讗谞讞谞讜 谞爪讗 注诐 讛专讙砖讛 讟讜讘讛, 讙诐 讗诐 讛拽讟注 讘讗诇讘讜诐 谞砖诪注 讟讜讘 讬讜转专.
讘转讜专 驻专讬诇讗谞住专讬诐 讗讬谉 诇谞讜 讗转 讛讞讜驻砖 诇讛讬讜转 谞讛讙讬 诪讜谞讬讜转 诪讛讙讬讛谞讜诐. 讻谉 讬砖 诇谞讜 讗转 讛讞讜驻砖 诇讘讞讜专 讗讬讝讛 住讜讙 讗讬谞讟专拽爪讬讜转 讗谞讞谞讜 诪讜讻专讬诐 诇诇拽讜讞讜转 讜诇驻讬 讝讛 诇注讝讜专 诇讗谞砖讬诐 砖诪讞驻砖讬诐 讗转 讛讚讘专 讛讝讛 诇诪爪讜讗 讗讜转谞讜. 讗诐 讗转诐 诪住讜讙 讛讗谞砖讬诐 砖讗讜讛讘讬诐 诇谞住讜注 讘讚专讻讬诐 讞讚砖讜转, 讝讛 诇讗 讛讙讬讜谞讬 诇讛讬讻谞住 讻谞讛讙讬诐 讘 Gett. 注讚讬祝 诇讛转讗诪抓 诇诪爪讜讗 讗转 讛谞讜住注讬诐 砖讬砖 诇讛诐 住讟讬讛 讚讜诪讛.
1 419
# 讛砖讬讟讛 讛讘讟讜讞讛 诇讘谞讜转 讘讬讟讜讬 专讙讜诇讗专讬 诇讻诇 讟拽住讟
讘讞讬讚讛 砖诇 诇驻谞讬 讻诪讛 讬诪讬诐 讘 Advent Of Code 拽讬讘诇谞讜 诪砖讬诪转 注讬讘讜讚 讟拽住讟 砖讛讝讻讬专讛 诇讬 讻诪讛 讻讬祝 诇注讘讜讚 注诐 讘讬讟讜讬讬诐 专讙讜诇讗专讬讬诐, 讜讗转 讛砖讬讟讛 讛讘讟讜讞讛 诇讘谞讜转 讘讬讟讜讬 专讙讜诇讗专讬 诪讜爪诇讞 诇讻诇 诪讞专讜讝转 讟拽住讟. 讘讞讬讚讛 讛诪拽讜专讬转 拽讬讘诇谞讜 诪讞专讜讝转 讟拽住讟 砖谞专讗讬转 讻讱:
1-3 l:hello world
讛讞诇拽 砖诪砖诪讗诇 诇谞拽讜讚讜转讬讬诐 诪转讗专 讻诇诇 讜讛讞诇拽 砖诪讬诪讬谉 诇谞拽讜讚讜转讬讬诐 诪转讗专 砖讜专转 讟拽住讟. 讛讻诇诇 转诪讬讚 诪讜专讻讘 诪砖谞讬 诪住驻专讬诐 讜讗讜转. 讛诪住驻专讬诐 诪讙讚讬专讬诐 讻诪讛 驻注诪讬诐 讛讗讜转 爪专讬讻讛 诇讛讜驻讬注 讘诪讞专讜讝转 砖讘爪讚 讬诪讬谉 (诪讬谞讬诪讜诐 讜诪拽住讬诪讜诐). 讘诪讞专讜讝转 讛讚讜讙诪讛 讗谞讞谞讜 专讜爪讬诐 诇讜讜讚讗 砖 l 诪讜驻讬注讛 讘讬谉 驻注诐 讗讞转 诇-3 驻注诪讬诐 讘讟拽住讟 hello world.
拽诇 诪讗讜讚 诇讻转讜讘 驻讜谞拽爪讬讛 讘驻讬讬转讜谉 砖注讜谞讛 注诇 讛砖讗诇讛, 讗诐 讗谞讬 诪拽讘诇 讗转 讛诪讬讚注 诪讜驻专讚:
from collections import Counter
def valid(min_count, max_count, char, text):
min_count = int(min_count)
max_count = int(max_count)
return min_count <= Counter(text)[char] <= max_count
讗讘诇 - 讗讬讱 谞砖讘讜专 讗转 讛讟拽住讟 诇讗专讘注转 讛驻专诪讟专讬诐? 讻讗谉 谞讻谞住转 讛砖讬讟讛 讛讘讟讜讞讛 砖转诪讬讚 注讜讘讚转 诇讻转讬讘转 讘讬讟讜讬讬诐 专讙讜诇讗专讬讬诐:
1. 诪转讞讬诇讬诐 注诐 讛讟拽住讟 讛诪拽讜专讬
2. 诪讞诇讬驻讬诐 讻诇 讞诇拽 砖讬讻讜诇 诇讛砖转谞讜转 讘讘讬讟讜讬 砖诪讬讬爪讙 讗转 讛转讘谞讬转 讛讻诇诇讬转
3. 谞讜转谞讬诐 砖诐 诇讻诇 讞诇拽
讘诪拽专讛 砖诇谞讜 诪讛 砖讬讻讜诇 诇讛砖转谞讜转 讝讛 讛诪住驻专讬诐 (转讘谞讬转 砖诇 住讬驻专讛 讛讬讗 [0-9] 讜讗诐 专讜爪讬诐 讻诪讛 住驻专讜转 诪讜住讬驻讬诐 + 讗讞专讬), 讛讗讜转 (转讘谞讬转 砖诇 讗讜转 讛讬讗 [a-z]) 讜讛讟拽住讟 砖讗讞专讬 讛谞拽讜讚讜转讬讬诐 (砖诐 讬讻讜诇 诇讛讬讜转 讻诇 讚讘专 讻诇讜诪专 .+. 诇讻谉 讛讘讬讟讜讬 讛专讙讜诇讗专讬 讬讛讬讛:
[0-9]+-[0-9]+ [a-z]:.*
注讻砖讬讜 谞诪砖讬讱 诇转转 砖诐 诇讻诇 讗讞讚 诪讛讞诇拽讬诐:
(?P<min_count>[0-9]+)-(?P<max_count>[0-9]+) (?P<char>[a-z]):(?P<text>.*)
讜讗谞讞谞讜 诪讜讻谞讬诐 诇讛砖转诪砖 讘拽讜讚 诪转讜讱 Python:
pattern = re.compile(r'(?P<min_count>[0-9]+)-(?P<max_count>[0-9]+) (?P<char>[a-z]):(?P<text>.*)')
if m := pattern.search("1-3 l:hello world"):
print(valid(**m.groupdict()))
else:
print("String does not match format")