Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import 'dart:math';
- import 'eulib.dart';
- void main() {
- var cards = List.generate(1000000, (index) => index + 1);
- var front = '418976235'.split('').map(int.parse).toList();
- cards.replaceRange(0, 9, front);
- var game = Game(cards);
- for (var _ in range(0, 10000000)) {
- game.playRound();
- }
- var c1 = game.succ[1];
- var c2 = game.succ[c1];
- assert(c1 * c2 == 563362809504);
- }
- class Game {
- List<int> succ;
- int currentValue;
- int lo, hi;
- Game(List<int> c) {
- lo = c.reduce(min);
- hi = c.reduce(max);
- succ = List.filled(hi + 1, 0);
- for (var i in range(0, c.length - 1)) {
- succ[c[i]] = c[i + 1];
- }
- succ[c.last] = c.first;
- currentValue = c.first;
- }
- void playRound() {
- // Pick the three after current.
- var rfirst = succ[currentValue];
- var rmid = succ[rfirst];
- var rlast = succ[rmid];
- var rem = [rfirst, rmid, rlast];
- // Extract them by joining the pred and succ.
- succ[currentValue] = succ[rlast];
- // Find destination value.
- var d = currentValue - 1;
- if (d < lo) d = hi;
- while (rem.contains(d)) {
- d -= 1;
- if (d < lo) d = hi;
- }
- // Insert cards there.
- succ[rlast] = succ[d];
- succ[d] = rfirst;
- // Update current.
- currentValue = succ[currentValue];
- }
- String endString() {
- var pos = 1;
- var ret = <int>[];
- while (succ[pos] != 1) {
- pos = succ[pos];
- ret.add(pos);
- }
- return ret.join('');
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement