USING: assocs kernel math math.parser namespaces sequences ; IN: happy-number SYMBOL: repeating-numbers : reset-hash ( -- ) H{ } clone repeating-numbers set ; : add-repeat-number ( n -- ) t swap repeating-numbers get set-at ; : repeater? ( n -- ? ) repeating-numbers get key? ; : next-happy ( x -- y ) number>string string>digits [ sq ] map sum ; : do-happy ( number -- ? ) dup 1 = [ drop t ] [ dup repeater? [ drop f ] [ [ add-repeat-number ] [ next-happy do-happy ] bi ] if ] if ; inline recursive : happy? ( number -- ? ) reset-hash do-happy ;