å ¥éã¿ã¹ã¯ãå®äºããŠããªãå Žåã¯ãã€ã³ã¹ããŒã«ã¬ã€ããåç §ããŠãã ããã
Racing Riverboats ã¯ãCairo ããŒã¿æ§é ãšã¢ã«ãŽãªãºã ã®ã¿ã¹ã¯ãThink Cairoãã® 3 çªç®ã®ã¿ã¹ã¯ã§ãããé åå ã®éè€å€ãæ€çŽ¢ããåé¡ã解決ããŸãããã®ã¿ã¹ã¯ã«ã¯ 2 ã€ã®å°åé¡ããããŸãã
ãªã¹ãå ã®éè€å€ã®ã€ã³ããã¯ã¹#
æåã®åé¡ãé±·ã®æ¢çŽ¢ãã¯ãæ¬è³ªçã«ã¯é åå ã§éè€ããé ç®ãèŠã€ãããã®ã€ã³ããã¯ã¹ãå¥ã®é åã«ããŒã¯ãããã®ã§ãã
æ¯èŒããå¿
èŠãããé
åã®ãµãèŠçŽ ã¯ãu32ãu32ãfelt252 ãããªãæ§é äœã§ãããåæããŒã¿ã¯Array<Obstacle>
ã§ãã
#[derive(Drop)]
struct Obstacle {
length: u32,
width: u32,
description: Array<felt252>
}
æåã®ã¢ã€ãã¢ã¯ãFelt252Dictã䜿çšããObstacle ãã«ãŒãã㊠Felt252Dict ã«è¿œå ããããšã§ããããã¯ãSolidity ã®mapping(index => struct)
ã«äŒŒãŠããŸããå€ãååšããå Žåã¯ã€ã³ããã¯ã¹ãèšé²ããååšããªãå Žåã¯æ¿å
¥ããŸãã
æåã®ããŒãžã§ã³ã®ã³ãŒããæžããåŸãObstacle ã®ãµãèŠçŽ ã§ããArray<felt252>
ã Copy ã§ããªããããfelt252Dict.get(index) -> Obstacle
ã¯ç¡å¹ã§ãããããã£ãŠãã¢ãããŒããå€ããå¿
èŠããããŸãã
èŸæžã䜿çšããªãå Žåã2 ã€ã®ãã¹ããããã«ãŒãã䜿çšã㊠Obstacle ãæ¯èŒããéè€ãããã®ãäžæãªã¹ãã«è¿œå ãããã®åŸã€ã³ããã¯ã¹ãèŠã€ããå¿ èŠããããŸãããããããã¹ãã®çµæãã¬ã¹äžè¶³ã«ãªããå®éã«ã¯ 320 äžã®ã¬ã¹ãå¿ èŠã§ãããç®æšã® 180 äžãè¶ ããŠããŸããŸããæé©åãå¿ èŠã§ãã
ãã¹ãã±ãŒã¹ã®ã¬ã¹ãªããããåæãããšã2 ã€ã® Obstacle ã 1 忝èŒããã¬ã¹ã³ã¹ã㯠26100 ã§ãããã¹ãã±ãŒã¹ã«ã¯ 13 åã® Obstacle ãå«ãŸããŠããããã1800000 ã¬ã¹ã§ 69 å以äžã®æ¯èŒããã§ããŸãããäžæ¹ãäžèšã®ã¢ã«ãŽãªãºã ã§ã¯ããã¹ãŠã®æ¯èŒã«ã¯ 78 åïŒ1+2+...+12ïŒã®æ¯èŒãå¿ èŠã§ãããããã£ãŠãæ¯èŒåæ°ãæžããå¿ èŠããããŸãã
ãã®ãããdict ã®ãã¹ãã±ãŒã¹ã®æ¹æ³ã䜿çšããFelt252Dict ã«ã€ã³ããã¯ã¹ãæ ŒçŽããŠååŸããããšã§ãäžèŠãªæ¯èŒãæžããããšãã§ããŸããããããæçµçã«ã¯ã¬ã¹ãäžè¶³ãããããæ¯èŒåæ°ãæžããããšã¯ã§ããŸããããã®ãããåäžã®æ¯èŒã³ã¹ããå ·äœçã«ã¯ Obstacle.description ã®æ¯èŒãæé©åããå¿ èŠããããŸãã
ãã°ããã¢ã€ãã¢ãæµ®ãã°ãã«è©°ãŸã£ãŠããŸã£ãã®ã§ãNG ã®ãã¥ãŒã¿ãŒã«çŽæ¥çžè«ããObstacle ãããã·ã¥åããããšã§ O (n) ã®æéèšç®éã§ç®æšãéæã§ãããšããã¢ã€ãã¢ãããããŸããã
ã§ã¯ãã©ã®ããã« struct ãããã·ã¥åããã®ã§ããããïŒæåã« Obstacle ã®#[derive(Drop)]
ã#[derive(Drop,Serde)]
ã«å€æŽããæ¬¡ã®ã³ãŒãã䜿çšããŠããã·ã¥ãååŸããŸããã
let mut raw_data = Default::default();
obs.serialize(ref raw_data);
let hash = poseidon_hash_span(raw_data.span());
ãããããªã³ã©ã€ã³ãã¹ãã«åæ Œã§ããªãããšãããããŸããããªããªããObstacle ã¯å€æŽã§ããªãããã§ãã
Obstacle ã倿Žããã« struct ã®ãã¹ãŠã®ããããã£ãæåã§ããã¯ããŠããã·ã¥åããããšãã§ããŸãã
ããã·ã¥åãæåããããdict ã«insert (index, hash)
ãšget(index)
ãè¡ãã ãã§ãéè€ããã€ã³ããã¯ã¹ãååŸã§ããŸãããã®åŸãã³ãŒãã¯ãã¹ããæ£åžžã«ãã¹ããŸãã
ãŸããu_size ãš felt252 ã®çžäºå€æã«é¢ããŠããinto
ãšunwarp
ã䜿çšããå¿
èŠããããŸããããã¥ã¡ã³ããåç
§ããŠè§£æ±ºããããšããå§ãããŸãã
ãã 1 ã€ã®èœãšã穎ã¯ãã€ã³ããã¯ã¹ã 0 ã§å€ã 0 ã®å Žåãdict.get(0)
ãšdict.get(ååšããªãã€ã³ããã¯ã¹)
ã®äž¡æ¹ã 0 ãè¿ããããå€å®ã誀ã£ãŠããŸãããšã§ããããã«ã¯ãuse nullable::{NullableTrait, match_nullable, FromNullableResult};
ã©ã€ãã©ãªã䜿çšããŠè§£æ±ºããå¿
èŠããããŸãããã®éšåã«ã€ããŠã¯ãnullable ã®ãœãŒã¹ã³ãŒããåç
§ããŠåŠç¿ããããšããå§ãããŸãã
ãŸãšãããšãæåã®åé¡ã®ãã€ã³ãã¯æ¬¡ã®ãšããã§ãïŒ
- struct ãããã·ã¥åããæ¹æ³
- u_size ãš felt ã®çžäºå€æ
- Felt252Dict ã® newãgetãinsert
- nullable ã®äœ¿çš
ã«ãŒãå ã®æ¡ä»¶æã§ Option ãè¿ã#
ãã®åé¡ã§ã¯ãé åïŒå·ïŒãè¶ ããããã«æå°éã®ãžã£ã³ãæ°ãè¿ãå¿ èŠããããŸãããžã£ã³ãã®é·ã㯠3 ãè¶ ããŠã¯ãããŸãããæåã®ã»ã«ãšæåŸã®ã»ã«ãé±·ã§ããå Žåã¯ãOption::None ãè¿ããŸãã
ã¢ãããŒãïŒãã¹ããããã«ãŒãã䜿çšãããžã£ã³ãããšã« 3ã2ã1 ã倿ãããžã£ã³ãã§ããå Žåã¯ãžã£ã³ãããã¹ãããæ°ã + 1 ããŸãããžã£ã³ãã§ããªãå Žåã¯ãçŽæ¥ Option::None ãè¿ããè€æ°åã®ãžã£ã³ãã§ç®æšãéæããŸãã
ãã®åé¡ã®å®è£ ã¯æ¯èŒçç°¡åã§ããæåã®åé¡ã§ååŸããã€ã³ããã¯ã¹é åã䜿çšããŠã2 ã€ã®ã«ãŒãã§è§£æ±ºããŸããäž»ãªåé¡ã¯ããã¹ãã§ã¬ã¹äžè¶³ã«ãªãããšã§ããã€ãŸãã空ã®å·ã倿ããããšãšãå§ç¹ãšçµç¹ãé±·ã§ããããšã倿ããããšãäºåã«è¡ããã¬ã¹ãç¯çŽããããã§ãã
ãã¹ãã±ãŒã¹ãæ¯èŒããprint ãæŽ»çšããŠãã©ãã«ãžã£ã³ããããã確èªããããšããå§ãããŸãã
æåã®åé¡ã§æ¢ã«è¿°ã¹ãããã€ãã®èœãšã穎ããããŸãã®ã§ãäºåã«ä¿®æ£ããŠãããšè¯ãã§ãããã
æåŸã« verify ãæåºããåŸããã¹ãã«åæ Œã§ããªãå°ããªãã°ããããŸããã«ãŒãã®äžææ¡ä»¶ã¯ river.len ãªã®ã river.len-1 ãªã®ããæ³šæããå¿ èŠããããŸãã
ãã®åé¡ã§ã¯ãå€ãã®ã«ãŒãå ã§ã®æ»ãå€ãæ±ãå¿ èŠããããŸãããcairo ã«ã¯ return æããªãããã誀ããçºçãããããå€ãã®ä¿®æ£ãå¿ èŠã§ãã
ãŸããOption ã«é¢é£ããæäœã«ãåãçµãããšã«ãªããŸãã
ãŸãšã#
Cairo ã®ã¡ã¢ãªã¯äžå€ã§ãããã¹ããããã«ããŒããããšã¯ã§ããªããããããã€ãã®ãã¯ããã¯ãå¿ èŠã§ããé¢é£ããæäœã«ç²Ÿéããããšã¯ãå°æ¥ã®éçºã«åœ¹ç«ã¡ãŸãã