Guest User

Untitled

a guest
Oct 13th, 2023
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.32 KB | None | 0 0
  1. #!/usr/bin/env python
  2. import json, sys, matplotlib.pyplot as plt, statistics
  3.  
  4.  
  5. def count_words(card, no_remainder=False):
  6. if "card_faces" in card:
  7. oracle_text = " ".join([face["oracle_text"] for face in card["card_faces"]])
  8. else:
  9. oracle_text = card.get("oracle_text", "")
  10. if no_remainder:
  11. oracle_text = oracle_text
  12. length = len(oracle_text.split())
  13. length = min(100, 5 * (length // 5))
  14. return length
  15.  
  16. # path to default cards JSON from Scryfall
  17. with open(sys.argv[1]) as f:
  18. default_cards = json.load(f)
  19.  
  20. names_to_lengths = dict()
  21. sets_to_releasedates = dict()
  22. sets_to_names = dict()
  23.  
  24. for card in default_cards:
  25. if card["set_type"] not in ["expansion", "core"]:
  26. continue
  27. if card["layout"] in ["token"]:
  28. continue
  29.  
  30. if card["set_name"] not in sets_to_releasedates:
  31. sets_to_releasedates[card["set_name"]] = "9999-99-99"
  32. sets_to_names[card["set_name"]] = set()
  33. sets_to_releasedates[card["set_name"]] = min(
  34. sets_to_releasedates[card["set_name"]], card["released_at"]
  35. )
  36. sets_to_names[card["set_name"]].add(card["name"])
  37.  
  38. if card["name"] in names_to_lengths:
  39. continue
  40.  
  41. names_to_lengths[card["name"]] = count_words(card)
  42.  
  43. for k, v in sorted(sets_to_releasedates.items(), key=lambda item: item[1]):
  44. card_lengths = sorted([names_to_lengths[name] for name in sets_to_names[k]])
  45. xs = [f"{5 * x}-{5*x+4}" for x in range(19)] + ["95+"]
  46. ys = [len([n for n in card_lengths if 5 * x <= n <= 5 * x + 4]) for x in range(20)]
  47. nice_k = "".join(
  48. [
  49. x.title()
  50. for x in (
  51. "".join(
  52. [
  53. l
  54. for l in k
  55. if l
  56. in "0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ "
  57. ]
  58. )
  59. ).split()
  60. ]
  61. )
  62.  
  63. fig = plt.figure(figsize=(10, 5))
  64. plt.bar(xs, ys, color="black", width=0.4)
  65. plt.xticks(rotation="vertical")
  66. plt.ylim(0, 100)
  67. plt.title("\n".join([k, v]))
  68. plt.savefig(f"{v}_{nice_k}.png")
  69. plt.close(fig)
  70. print(v, k, statistics.mean(card_lengths), statistics.stdev(card_lengths), sep="\t")
  71.  
  72. # convert -delay 30 -loop 0 *.png animation.gif
Advertisement
Add Comment
Please, Sign In to add comment