Advertisement
Guest User

Untitled

a guest
Dec 23rd, 2020
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 1.49 KB | None | 0 0
  1. import 'dart:math';
  2. import 'eulib.dart';
  3.  
  4. void main() {
  5.   var cards = List.generate(1000000, (index) => index + 1);
  6.   var front = '418976235'.split('').map(int.parse).toList();
  7.   cards.replaceRange(0, 9, front);
  8.   var game = Game(cards);
  9.   for (var _ in range(0, 10000000)) {
  10.     game.playRound();
  11.   }
  12.   var c1 = game.succ[1];
  13.   var c2 = game.succ[c1];
  14.   assert(c1 * c2 == 563362809504);
  15. }
  16.  
  17. class Game {
  18.   List<int> succ;
  19.   int currentValue;
  20.   int lo, hi;
  21.  
  22.   Game(List<int> c) {
  23.     lo = c.reduce(min);
  24.     hi = c.reduce(max);
  25.     succ = List.filled(hi + 1, 0);
  26.     for (var i in range(0, c.length - 1)) {
  27.       succ[c[i]] = c[i + 1];
  28.     }
  29.     succ[c.last] = c.first;
  30.  
  31.     currentValue = c.first;
  32.   }
  33.  
  34.   void playRound() {
  35.     // Pick the three after current.
  36.     var rfirst = succ[currentValue];
  37.     var rmid = succ[rfirst];
  38.     var rlast = succ[rmid];
  39.     var rem = [rfirst, rmid, rlast];
  40.  
  41.     // Extract them by joining the pred and succ.
  42.     succ[currentValue] = succ[rlast];
  43.  
  44.     // Find destination value.
  45.     var d = currentValue - 1;
  46.     if (d < lo) d = hi;
  47.     while (rem.contains(d)) {
  48.       d -= 1;
  49.       if (d < lo) d = hi;
  50.     }
  51.     // Insert cards there.
  52.     succ[rlast] = succ[d];
  53.     succ[d] = rfirst;
  54.     // Update current.
  55.     currentValue = succ[currentValue];
  56.   }
  57.  
  58.   String endString() {
  59.     var pos = 1;
  60.     var ret = <int>[];
  61.     while (succ[pos] != 1) {
  62.       pos = succ[pos];
  63.       ret.add(pos);
  64.     }
  65.     return ret.join('');
  66.   }
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement