diff options
Diffstat (limited to 'krebs/5pkgs')
-rw-r--r-- | krebs/5pkgs/simple/krebsdance/default.nix | 157 | ||||
-rw-r--r-- | krebs/5pkgs/simple/reaktor2-plugins.nix | 6 |
2 files changed, 158 insertions, 5 deletions
diff --git a/krebs/5pkgs/simple/krebsdance/default.nix b/krebs/5pkgs/simple/krebsdance/default.nix new file mode 100644 index 000000000..cdfe23ef2 --- /dev/null +++ b/krebs/5pkgs/simple/krebsdance/default.nix @@ -0,0 +1,157 @@ +{ writers }: +writers.writePython3Bin "krebsdance" { flakeIgnore = [ "E501" ]; } '' + import argparse + import random + import itertools + + claws = [ + dict( + up="(\\/)", + down="(/\\)", + left="(\\\\)", + right="(//)", + ), + dict( + up="(V)", + down="(A)", + left=">)=", + right="=(<", + ), + dict( + up="(U)", + down="(n)", + left=")==", + right="==(", + ), + ] + + eyes = [ + "°", + "*", + "^", + "ö", + "o", + "O", + "X", + "x", + "U", + "u", + ] + + bodies = [ + dict( + left="(", + right=")", + ), + dict( + left="{", + right="}", + ), + dict( + left="[", + right="]", + ), + dict( + left="<", + right=">", + ), + dict( + left="|", + right="|", + ), + ] + + mouths = [ + ",,,,", + ",mm,", + "_mm_", + "-mm-", + ";;;;", + ";mm;", + ":mm:", + "::::", + ":ww:", + ":<>:", + ] + + + def all_krebses(): + for mouth, body, eye, claw in itertools.product(mouths, bodies, eyes, claws): + yield f'{claw["up"]} {body["left"]}{eye}{mouth}{eye}{body["right"]} {claw["up"]}' + + + def escape_graph(text): + return text.replace("\\", "\\\\") + + + def krebs_graph() -> str: + return "\n".join(itertools.chain( + ["digraph {"], + [escape_graph(f'"{krebs}"->"{generate(seed=krebs)}"') for krebs in all_krebses()], + "}", + )) + + + def generate(*, seed: str, dancing: bool = False) -> str: + if seed: + random.seed(seed) + clawstyle = random.choice(claws) + body = random.choice(bodies) + eye = random.choice(eyes) + mouth = random.choice(mouths) + if dancing: + return "\n".join( + [ + f'{clawstyle["down"]} {body["left"]}{eye}{mouth}{eye}{body["right"]}{clawstyle["up"]}', + f'{clawstyle["left"]}{body["left"]}{eye}{mouth}{eye}{body["right"]} {clawstyle["right"]}', + f'{clawstyle["right"]} {body["left"]}{eye}{mouth}{eye}{body["right"]} {clawstyle["left"]}', + f'{clawstyle["down"]}{body["left"]}{eye}{mouth}{eye}{body["right"]}{clawstyle["down"]}', + ] + ) + else: + return f'{clawstyle["up"]} {body["left"]}{eye}{mouth}{eye}{body["right"]} {clawstyle["up"]}' + + + def fixpoints(): + for krebs in all_krebses(): + if generate(seed=krebs) == krebs: + yield krebs + + + def main(): + parser = argparse.ArgumentParser() + + parser.add_argument( + "seed", + nargs="?", + help="random seed to use for generating the krebs variant", + ) + + parser.add_argument( + "--dance", + "-d", + dest="dance", + help="if the krebs should dance", + default=False, + action="store_true", + ) + + parser.add_argument( + "--mode", + "-m", + dest="mode", + choices=["graphviz", "plain"], + default="plain", + ) + + args = parser.parse_args() + + if args.mode == "plain": + print(generate(seed=args.seed, dancing=args.dance)) + elif args.mode == "graphviz": + print(krebs_graph()) + + + if __name__ == "__main__": + main() +'' diff --git a/krebs/5pkgs/simple/reaktor2-plugins.nix b/krebs/5pkgs/simple/reaktor2-plugins.nix index 54aaf246a..052e389a6 100644 --- a/krebs/5pkgs/simple/reaktor2-plugins.nix +++ b/krebs/5pkgs/simple/reaktor2-plugins.nix @@ -23,11 +23,7 @@ rec { dance = { filename = pkgs.writeDash "dance" '' - echo "<(^.^<)" - echo "<(^.^)>" - echo "(>^.^)>" - echo "(7^.^)7" - echo "(>^.^<)" + ${pkgs.krebsdance}/bin/krebsdance --dance "$@"; ''; }; |