/** finger exercise: Lucas' "Towers of Hanoi".
* Based on code presented at https://c...content-available-to-author-only...e.com/a/116290/93149 */
class Ideone {
static class LucasTower< E> extends java.util .ArrayDeque < E> {
private static final long serialVersionUID = 3049952862056404246L; // YAGNI?
public LucasTower
( String name
) { this .
name = name
; } // YAGNI LucasTower(String n, int c) { super(c); name = n; }
void addEach( E ...n ) { for ( E e : n) { add( e) ; } }
/** Do as see fit with {@code count, mid, to} just before
* the bottom disk of some invocation of {@code move} is moved. Old school override */
public void before( int count, LucasTower< E> mid, LucasTower< E> to) {
System .
out .
println ( name
+ ": pushing " + peek
( ) + " to " + to.
name ) ; }
/** Do as see fit with {@code count, mid, to} just after
* the bottom disk of some invocation of {@code move} is moved. Old school override */
public void after( int count, LucasTower< E> mid, LucasTower< E> to) {
// System.out.println(name + ": pushed popped " + to.peek() + " to " + to.name);
}
/** move the top {@code count} discs to {@code to} */
public void move( int count, LucasTower< E> mid, LucasTower< E> to) {
if ( 0 < count) {
move( count - 1 , to, mid) ;
before( count, mid, to) ;
to.push ( pop( ) ) ;
after( count, mid, to) ;
mid.move ( count - 1 , this , to) ;
}
}
}
public static void main
( String [ ] args
) { LucasTower< Number>
from= new LucasTower<> ( "A" ) ,
mid = new LucasTower<> ( "B" ) ,
to = new LucasTower<> ( "C" ) ;
from.addEach ( 10 , 15 , 20 , 25 ) ;
from.move ( from.size ( ) , mid, to) ;
}
}
LyoqIGZpbmdlciBleGVyY2lzZTogTHVjYXMnICJUb3dlcnMgb2YgSGFub2kiLgogKiBCYXNlZCBvbiBjb2RlIHByZXNlbnRlZCBhdCBodHRwczovL2MuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuY29tL2EvMTE2MjkwLzkzMTQ5ICovCmNsYXNzIElkZW9uZSB7CgogICAgc3RhdGljIGNsYXNzIEx1Y2FzVG93ZXI8RT4gZXh0ZW5kcyBqYXZhLnV0aWwuQXJyYXlEZXF1ZTxFPiB7CgkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzA0OTk1Mjg2MjA1NjQwNDI0Nkw7IC8vIFlBR05JPwoJCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CgogICAgICAgIHB1YmxpYyBMdWNhc1Rvd2VyKFN0cmluZyBuYW1lKSB7IHRoaXMubmFtZSA9IG5hbWU7IH0KICAgIC8vIFlBR05JICAgTHVjYXNUb3dlcihTdHJpbmcgbiwgaW50IGMpIHsgc3VwZXIoYyk7IG5hbWUgPSBuOyB9CiAgICAgICAgdm9pZCBhZGRFYWNoKEUgLi4ubikgeyBmb3IgKEUgZSA6IG4pIHsgYWRkKGUpOyB9IH0KICAgIC8qKiBEbyBhcyBzZWUgZml0IHdpdGgge0Bjb2RlIGNvdW50LCBtaWQsIHRvfSBqdXN0IGJlZm9yZQogICAgICogICB0aGUgYm90dG9tIGRpc2sgb2Ygc29tZSBpbnZvY2F0aW9uIG9mIHtAY29kZSBtb3ZlfSBpcyBtb3ZlZC4gT2xkIHNjaG9vbCBvdmVycmlkZSAqLwogICAgICAgIHB1YmxpYyB2b2lkIGJlZm9yZShpbnQgY291bnQsIEx1Y2FzVG93ZXI8RT4gbWlkLCBMdWNhc1Rvd2VyPEU+IHRvKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lICsgIjogcHVzaGluZyAiICsgcGVlaygpICsgIiB0byAiICsgdG8ubmFtZSk7CiAgICAgICAgfQogICAgLyoqIERvIGFzIHNlZSBmaXQgd2l0aCB7QGNvZGUgY291bnQsIG1pZCwgdG99IGp1c3QgYWZ0ZXIKICAgICAqICAgdGhlIGJvdHRvbSBkaXNrIG9mIHNvbWUgaW52b2NhdGlvbiBvZiB7QGNvZGUgbW92ZX0gaXMgbW92ZWQuIE9sZCBzY2hvb2wgb3ZlcnJpZGUgKi8KICAgICAgICBwdWJsaWMgdm9pZCBhZnRlcihpbnQgY291bnQsIEx1Y2FzVG93ZXI8RT4gbWlkLCBMdWNhc1Rvd2VyPEU+IHRvKSB7CiAgICAvLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lICsgIjogcHVzaGVkIHBvcHBlZCAiICsgdG8ucGVlaygpICsgIiB0byAiICsgdG8ubmFtZSk7CiAgICAgICAgfQogICAgLyoqIG1vdmUgdGhlIHRvcCB7QGNvZGUgY291bnR9IGRpc2NzIHRvIHtAY29kZSB0b30gKi8KICAgICAgICBwdWJsaWMgdm9pZCBtb3ZlKGludCBjb3VudCwgTHVjYXNUb3dlcjxFPiBtaWQsIEx1Y2FzVG93ZXI8RT4gdG8pIHsKICAgICAgICAgICAgaWYgKDAgPCBjb3VudCkgewogICAgICAgICAgICAgICAgbW92ZShjb3VudCAtIDEsIHRvLCBtaWQpOwogICAgICAgICAgICAgICAgYmVmb3JlKGNvdW50LCBtaWQsIHRvKTsKICAgICAgICAgICAgICAgIHRvLnB1c2gocG9wKCkpOwogICAgICAgICAgICAgICAgYWZ0ZXIoY291bnQsIG1pZCwgdG8pOwogICAgICAgICAgICAgICAgbWlkLm1vdmUoY291bnQgLSAxLCB0aGlzLCB0byk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIEx1Y2FzVG93ZXI8TnVtYmVyPgogICAgICAgIAlmcm9tPSBuZXcgTHVjYXNUb3dlcjw+KCJBIiksCiAgICAgICAgCW1pZCA9IG5ldyBMdWNhc1Rvd2VyPD4oIkIiKSwKICAgICAgICAJdG8gID0gbmV3IEx1Y2FzVG93ZXI8PigiQyIpOwogICAgICAgIGZyb20uYWRkRWFjaCgxMCwgMTUsIDIwLCAyNSk7CiAgICAgICAgZnJvbS5tb3ZlKGZyb20uc2l6ZSgpLCBtaWQsIHRvKTsKICAgIH0KfQ==