Προγραμματιστική πρόκληση Νο 4: Ταχυδακτυλουργικά με τράπουλα

Πάμε ανάποδα αυτή την φορά. Ιδού ο κώδικάς

int main() {
  vector<int> cards(24); 
  iota(cards.begin(),cards.end(),0);
  mt19937 r(random_device{}()); 
  shuffle(cards.begin(),cards.end(),r);
  int U; cin>>U; 
  cout<<"cards["<<U<<"]: "; 
  U = cards[U]; cout<<U<<"\n";
  shuffle(cards.begin(),cards.end(),r);
  
  for (int i: {0,1,2}) {
    vector<int> decks[4];
    accumulate(cards.begin(),cards.end(),0,[&](int d, int c) {
      decks[d%4].insert(decks[d%4].begin(),c); return (d+1)%4; });

    int d = distance(decks, find_if(decks,decks+4,
      [&](auto &x) { return count(x.begin(),x.end(),U) > 0; }));
    
    cards.clear(); 
    for (int i: {d,d+1,d+2,d+3}) {
      move(decks[i%4].begin(),decks[i%4].end(),back_inserter(cards)); }
  }

  cout<<cards[4]<<" == "<<U<<"\n"; assert(cards[4] == U);
} 

Ξέρω δύσκολα θα βγάλεις νόημα από τον κώδικα. Εδώ ή πρόκληση είναι να καταλαβαίνεις μια γλώσσα που δεν ξέρεις και να εξαγάγεις τον αλγόριθμο.

Είναι ένα γνωστό ταχυδακτυλουργικό κόλπο. Διαλέγεις ένα χαρτί ο μάγος χωρίζει τα χαρτιά σε ομάδες εσύ λες κάθε φορά σε ποια ομάδα είναι, διαβάζει το μυαλό σου και σου λέει ποιο διάλεξες.

Μπορείς με μια τράπουλα να κάνεις το ταχυδακτυλουργικό στους φίλους σου; Μπορείς να γράψεις τον κώδικα σε μια άλλη γλώσσα;

https://www.makeplayingcards.com/sell/marketplace/c-algorithm-magic.html