Skip to content

Instantly share code, notes, and snippets.

@iamevn
Created July 23, 2020 09:57
Show Gist options
  • Save iamevn/b50b923292b30d41352439750b044cb7 to your computer and use it in GitHub Desktop.
Save iamevn/b50b923292b30d41352439750b044cb7 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"def read_word(f):\n",
" \"\"\"f is open and seeked to the length byte at the \n",
" start of a word, read that word and return it (decoded as SHIFT-JIS)\n",
" advances f to the next length\"\"\"\n",
" length = f.read(1)[0]\n",
" #print(length)\n",
" b = f.read(length)\n",
" w = b.decode('shift-jis')\n",
" #print(w)\n",
" assert(f.read(3) == b'\\x00\\x00\\x00')\n",
" assert(w)\n",
" assert(not '\\x00' in w)\n",
" return w\n",
"\n",
"def read_words(f):\n",
" \"\"\"f is open and seeked to the wordset length byte\n",
" returns a list of words in that set of words or [] if it's the end\"\"\"\n",
" length = f.peek(1)[0] * 2\n",
" if length == 0:\n",
" return False\n",
" else:\n",
" f.seek(4,1)\n",
" return [read_word(f=f) for _ in range(length)]"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def read_wordlist(f):\n",
" wordlist = []\n",
"\n",
" last = read_words(f=f)\n",
" while last:\n",
" wordlist.append(last)\n",
" try:\n",
" last = read_words(f=f)\n",
" except IndexError:\n",
" last = False\n",
"\n",
" return wordlist"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def find_next_section(f, sep=27):\n",
" # this could be cleaner but the files are short enough to just brute force this\n",
" count = 0\n",
" n = 0\n",
" while True:\n",
" s = f.peek(8)[:8]\n",
" n += 1\n",
" #if n % 100 == 0:\n",
" #if count > 1:\n",
" # print(f'{f.tell()}, {s}, ({count})')\n",
" if len(s) == 0: return False\n",
" elif s[0] == 0x00:\n",
" count += 1\n",
" elif count >= sep:\n",
" return True\n",
" else:\n",
" count = 0\n",
" f.seek(1, 1)\n",
"\n",
"def find_section(f, which='wordlists'):\n",
" # tries to parse blocks of data as wordlists until all are found in the file\n",
" # there is either one or two lists of keys and a list of lists of words\n",
" f.seek(0)\n",
" words = []\n",
" lists = []\n",
" while True:\n",
" if not find_next_section(f=f): break\n",
" try:\n",
" posn = f.tell()\n",
" words = read_wordlist(f=f)\n",
" except:\n",
" pass\n",
" else:\n",
" if words and isinstance(words[0], list):\n",
" lists.append((posn, words))\n",
" # last section is always the wordlists\n",
" return lists[-1]\n",
" \n",
"def find_info(f):\n",
" # returns (Genre, Title, Artist)\n",
" f.seek(0)\n",
" find_next_section(f, sep=8)\n",
" return read_word(f), read_word(f), read_word(f)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def pre_words_post(f):\n",
" # file f split into three sections\n",
" # middle section could be replaced by the result of buildWordlists\n",
" offset, _ = find_section(f, which='wordlists')\n",
" f.seek(0)\n",
" pre = f.read(offset)[:offset]\n",
" f.seek(offset)\n",
" read_wordlist(f)\n",
" size = f.tell() - offset\n",
" \n",
" post = f.read()\n",
" \n",
" f.seek(offset)\n",
" wordbytes = f.read(size)[:size]\n",
" \n",
" return pre, wordbytes, post"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def buildWordlists(wordlists):\n",
" # returns bytes for given wordlists\n",
" b = bytearray()\n",
" for n, wordlist in enumerate(wordlists):\n",
" if len(wordlist) % 2 == 1:\n",
" raise ValueError(f'{n}th wordlist invalid. must have even number of words. has {len(wordlist)}: {wordlist}')\n",
" b.append(len(wordlist) // 2)\n",
" b.extend([0, 0, 0])\n",
" for word in wordlist:\n",
" encoded = word.encode('shift-jis')\n",
" b.append(len(encoded))\n",
" b.extend(encoded)\n",
" b.extend([0, 0, 0])\n",
" return bytes(b)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"files = [\n",
" # pop'n easy first song\n",
" 'N01.BMD.bak',\n",
" # hard classic\n",
" 'E10.BMD',\n",
" # how about beatmania?\n",
" '~09_NahaGacho.bmd',\n",
" # and beatmania best\n",
" 'E10B.bmd',\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"with open(files[0], 'rb') as f:\n",
" contents = f.read()\n",
" pre, wbytes, post = pre_words_post(f)\n",
"\n",
"from io import BufferedReader, BytesIO\n",
"with BufferedReader(BytesIO(wbytes)) as f:\n",
" w = read_wordlist(f)\n",
"\n",
"pre+buildWordlists(w)+post == contents"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Note:\n",
"Be careful to keep the number of wordlists the same and give each wordlist an even number of words.\n",
"They don't need to have the same number of words and the game seems to randomly pick words from\n",
"each list in sequence for the typing sections.\n",
"\n",
"I would recommend testing words ingame as some kana (notably v's) don't work and romaji don't work either.\n",
"\n",
"\n",
"\n",
"Below are a few wordlists from the game:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"('DANCE', 'Hi-Tekno', 'Hi-Tekno')\n"
]
},
{
"data": {
"text/plain": [
"[['大人', 'おとな', '楽器', 'がっき', '涙', 'なみだ', '音', 'おと'],\n",
" ['検査', 'けんさ', 'テスト', 'てすと', '煙草', 'たばこ', '針', 'はり'],\n",
" ['襟', 'えり', '花', 'はな', '猫', 'ねこ', 'スリル', 'すりる'],\n",
" ['穴', 'あな', 'ケーキ', 'けーき', '空', 'そら', '闇', 'やみ'],\n",
" ['光', 'ひかり', '飛ぶ', 'とぶ', '鳥', 'とり', '曇り', 'くもり'],\n",
" ['晴れ', 'はれ', '風', 'かぜ', 'キッズ', 'きっず', 'カバー', 'かばー'],\n",
" ['彼', 'かれ', 'マル', 'まる', 'バツ', 'ばつ'],\n",
" ['ピンチ', 'ぴんち', '嘘', 'うそ', '靴', 'くつ'],\n",
" ['帽子', 'ぼうし', '脳', 'のう', '今', 'いま'],\n",
" ['夏季', 'かき', '冬期', 'とうき', 'グミ', 'ぐみ'],\n",
" ['リボン', 'りぼん', 'ベル', 'べる', '朝', 'あさ'],\n",
" ['昼', 'ひる', '夜', 'よる', '昨日', 'きのう'],\n",
" ['今日', 'きょう', '愛', 'あい', '雪', 'ゆき'],\n",
" ['雨', 'あめ', '赤', 'あか', '青', 'あお'],\n",
" ['黄色', 'きいろ', '黒', 'くろ', '白', 'しろ'],\n",
" ['緑', 'みどり', 'シャツ', 'しゃつ', '街', 'まち'],\n",
" ['オーラ', 'おーら', 'ソフト', 'そふと', 'ハード', 'はーど'],\n",
" ['メモ', 'めも', '留守', 'るす', '子機', 'こき']]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"with open(files[0], 'rb') as f:\n",
" print(find_info(f))\n",
" offset, wordlists = find_section(f=f)\n",
"wordlists"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"('CLASSIC 2', 'R.C.', 'Waldeus von dovjak')\n"
]
},
{
"data": {
"text/plain": [
"[['脈絡のない会話',\n",
" 'みゃくらくのないかいわ',\n",
" '大御所登場',\n",
" 'おおごしょとうじょう',\n",
" '将来を見据える',\n",
" 'しょうらいをみすえる',\n",
" '社会的影響',\n",
" 'しゃかいてきえいきょう'],\n",
" ['中央分離帯',\n",
" 'ちゅうおうぶんりたい',\n",
" '二十一世紀',\n",
" 'にじゅういっせいき',\n",
" '忘れ難い出来事',\n",
" 'わすれがたいできごと',\n",
" '理想郷を求める',\n",
" 'りそうきょうをもとめる',\n",
" 'カルチャーショック',\n",
" 'かるちゃーしょっく'],\n",
" ['映像編集',\n",
" 'えいぞうへんしゅう',\n",
" '異常現象',\n",
" 'いじょうげんしょう',\n",
" '構造的欠陥',\n",
" 'こうぞうてきけっかん',\n",
" '超能力者',\n",
" 'ちょうのうりょくしゃ',\n",
" '宇宙開発時代',\n",
" 'うちゅうかいはつじだい'],\n",
" ['蒸気機関車',\n",
" 'じょうききかんしゃ',\n",
" '会場設営',\n",
" 'かいじょうせつえい',\n",
" '軌道衛星上',\n",
" 'きどうえいせいじょう',\n",
" '太平洋高気圧',\n",
" 'たいへいようこうきあつ',\n",
" '公開討論会',\n",
" 'こうかいとうろんかい'],\n",
" ['小笠原諸島',\n",
" 'おがさわらしょとう',\n",
" 'ハイジャック発生',\n",
" 'はいじゃっくはっせい',\n",
" '見直しを求める',\n",
" 'みなおしをもとめる',\n",
" '地震予知連絡会',\n",
" 'じしんよちれんらくかい'],\n",
" ['シンガーソングライター',\n",
" 'しんがーそんぐらいたー',\n",
" 'イベント開催中',\n",
" 'いべんとかいさいちゅう',\n",
" 'バイオテクノロジー',\n",
" 'ばいおてくのろじー',\n",
" '鳴り物入りのスタート',\n",
" 'なりものいりのすたーと'],\n",
" ['米国西海岸',\n",
" 'べいこくにしかいがん',\n",
" '速乾性マニキュア',\n",
" 'そっかんせいまにきゅあ',\n",
" '新生活のスタート',\n",
" 'しんせいかつのすたーと',\n",
" '小説の挿し絵',\n",
" 'しょうせつのさしえ'],\n",
" ['誕生日プレゼント',\n",
" 'たんじょうびぷれぜんと',\n",
" 'オープンキャンパス',\n",
" 'おーぷんきゃんぱす',\n",
" 'モーニングサービス',\n",
" 'もーにんぐさーびす',\n",
" '社会的立場',\n",
" 'しゃかいてきたちば'],\n",
" ['ロンドン直輸入',\n",
" 'ろんどんちょくゆにゅう',\n",
" '商品価値が高い',\n",
" 'しょうひんかちがたかい',\n",
" '流行に流される',\n",
" 'りゅうこうにながされる',\n",
" 'ファンクラブ入会',\n",
" 'ふぁんくらぶにゅうかい'],\n",
" ['プライベートな空間',\n",
" 'ぷらいべーとなくうかん',\n",
" '自由気ままな生活',\n",
" 'じゆうきままなせいかつ',\n",
" '卓越したテクニック',\n",
" 'たくえつしたてくにっく',\n",
" 'ハイセンスでハイブロー',\n",
" 'はいせんすではいぶろー'],\n",
" ['ディスカウントショップ',\n",
" 'でぃすかうんとしょっぷ',\n",
" 'ビジュアルインパクト',\n",
" 'びじゅあるいんぱくと',\n",
" '衝撃的映像',\n",
" 'しょうげきてきえいぞう',\n",
" '宝くじ当選',\n",
" 'たからくじとうせん'],\n",
" ['愛着がわいてくる',\n",
" 'あいちゃくがわいてくる',\n",
" '対戦型ゲーム',\n",
" 'たいせんがたげーむ',\n",
" '巨匠の傑作',\n",
" 'きょしょうのけっさく',\n",
" '突然の席替え',\n",
" 'とつぜんのせきがえ'],\n",
" ['経済感覚がない',\n",
" 'けいざいかんかくがない',\n",
" '抗議ハガキ殺到',\n",
" 'こうぎはがきさっとう',\n",
" '英知の限りを尽くす',\n",
" 'えいちのかぎりをつくす',\n",
" '招かれざる客',\n",
" 'まねかれざるきゃく'],\n",
" ['僻地に飛ばされる',\n",
" 'へきちにとばされる',\n",
" '言葉の魔術師',\n",
" 'ことばのまじゅつし',\n",
" 'スタジアム決戦',\n",
" 'すたじあむけっせん',\n",
" '敏腕プロデューサー',\n",
" 'びんわんぷろでゅーさー']]"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"with open(files[1], 'rb') as f:\n",
" print(find_info(f))\n",
" offset, wordlists = find_section(f=f)\n",
"wordlists"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"('?????', 'NhahaGachooon', 'Hayachiya Shinpey')\n"
]
},
{
"data": {
"text/plain": [
"[['アーイェーオーイェー',\n",
" 'あーいぇーおーいぇー',\n",
" 'アイマイミーユーユアユー',\n",
" 'あいまいみーゆーゆあゆー',\n",
" '熱いビートを刻み込め',\n",
" 'あついびーとをきざみこめ',\n",
" 'ありおりはべりいまそかり',\n",
" 'ありおりはべりいまそかり',\n",
" '犬も歩けば棒に当たる',\n",
" 'いぬもあるけばぼうにあたる',\n",
" 'エブリバディーさいこー',\n",
" 'えぶりばでぃーさいこー',\n",
" 'がちょってがちょーん',\n",
" 'がちょってがちょーん',\n",
" '壁に耳あり障子に目あり',\n",
" 'かべにみみありしょうじにめあり',\n",
" '華麗に決めるスクラッチ',\n",
" 'かれいにきめるすくらっち',\n",
" 'ギャラリー達の視線くぎづけ',\n",
" 'ぎゃらりーたちのしせんくぎづけ',\n",
" 'キレがあるのにコクがある',\n",
" 'きれがあるのにこくがある',\n",
" 'クールなプレイで勝負',\n",
" 'くーるなぷれいでしょうぶ',\n",
" 'クラブシーンでナンバーワン',\n",
" 'くらぶしーんでなんばーわん',\n",
" '心も体もリフレッシュ',\n",
" 'こころもからだもりふれっしゅ',\n",
" '渋谷界隈のクラブで',\n",
" 'しぶやかいわいのくらぶで',\n",
" 'タイニーケーイカモーン',\n",
" 'たいにーけーいかもーん',\n",
" '旅は道連れ世は情け',\n",
" 'たびはみちづれよはなさけ',\n",
" 'ちりも積もれば山となる',\n",
" 'ちりもつもればやまとなる',\n",
" 'ディープなギャグセンス',\n",
" 'でぃーぷなぎゃぐせんす',\n",
" '飛んで火に入る夏の虫',\n",
" 'とんでひにいるなつのむし',\n",
" 'ナハナハナハナハナハ',\n",
" 'なはなはなはなはなは'],\n",
" ['人気ナンバーワンですわ',\n",
" 'にんきなんばーわんですわ',\n",
" '能ある鷹はつめを隠す',\n",
" 'のうあるたかはつめをかくす',\n",
" 'リーチイッパツツモ',\n",
" 'りーちいっぱつつも',\n",
" 'ああ言えばこう言う',\n",
" 'ああいえばこういう',\n",
" '当たり前田のクラッカー',\n",
" 'あたりまえだのくらっかー',\n",
" 'あっみだくじーあっみだくじー',\n",
" 'あっみだくじーあっみだくじー',\n",
" '奇妙奇天烈摩訶不思議',\n",
" 'きみょうきてれつまかふしぎ',\n",
" 'こりゃまた失礼しました',\n",
" 'こりゃまたしつれいしました',\n",
" 'じゃここでドロンさして',\n",
" 'じゃここでどろんさして',\n",
" 'だうーんチョキパク',\n",
" 'だうーんちょきぱく',\n",
" 'だっふんだーどんがらがっしゃーん',\n",
" 'だっふんだーどんがらがっしゃーん',\n",
" 'だめだこりゃ',\n",
" 'だめだこりゃ',\n",
" '卵の親じゃピヨコちゃん',\n",
" 'たまごのおやじゃぴよこちゃん',\n",
" '田園調布に家が建つ',\n",
" 'でんえんちょうふにいえがたつ',\n",
" 'どないやっちゅーねん',\n",
" 'どないやっちゅーねん',\n",
" 'あたしゃ神様だよ',\n",
" 'あたしゃかみさまだよ',\n",
" '赤パジャマ黄パジャマ',\n",
" 'あかぱじゃまきぱじゃま',\n",
" 'ババンババンバンバン',\n",
" 'ばばんばばんばんばん']]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"with open(files[2], 'rb') as f:\n",
" print(find_info(f))\n",
" offset, wordlists = find_section(f=f)\n",
"wordlists"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"('GABBAH', 'HELL SCAPER', 'L.E.D LIGHT-G')\n"
]
},
{
"data": {
"text/plain": [
"[['鐘が鳴るなり法隆寺',\n",
" 'かねがなるなりほうりゅうじ',\n",
" '就職活動熱風',\n",
" 'しゅうしょくかつどうねっぷう',\n",
" 'ドラマチック練習試合',\n",
" 'どらまちっくれんしゅうじあい',\n",
" 'ひと夏のアヴァンチュール',\n",
" 'ひとなつのあう゛ぁんちゅーる',\n",
" '東名高速渋滞',\n",
" 'とうめいこうそくじゅうたい'],\n",
" ['ホームメイドクッキング雑誌',\n",
" 'ほーむめいどくっきんぐざっし',\n",
" '大海原の小さな家',\n",
" 'おおうなばらのちいさないえ',\n",
" 'マスカルポーネクリームチーズ',\n",
" 'ますかるぽーねくりーむちーず',\n",
" '二人三脚徒競走',\n",
" 'ににんさんきゃくときょうそう',\n",
" '魅力ある登場人物',\n",
" 'みりょくあるとうじょうじんぶつ'],\n",
" ['人面魚発見レーダー',\n",
" 'じんめんぎょはっけんれーだー',\n",
" 'サーカスの曲乗りライオン',\n",
" 'さーかすのきょくのりらいおん',\n",
" '獣道を走るライダー',\n",
" 'けものみちをはしるらいだー',\n",
" 'ツベルクリン反応検査',\n",
" 'つべるくりんはんのうけんさ',\n",
" 'サンプルクレンジングクリーム',\n",
" 'さんぷるくれんじんぐくりーむ'],\n",
" ['目覚まし時計の長い針',\n",
" 'めざましどけいのながいはり',\n",
" 'サマーバーゲンセール開催',\n",
" 'さまーばーげんせーるかいさい',\n",
" '名刺の渡し方マニュアル',\n",
" 'めいしのわたしかたまにゅある',\n",
" '国際社会から孤立する',\n",
" 'こくさいしゃかいからこりつする'],\n",
" ['選手生命を脅かす',\n",
" 'せんしゅせいめいをおびやかす',\n",
" '四季折々の食卓',\n",
" 'しきおりおりのしょくたく',\n",
" '厳しい修行に耐える',\n",
" 'きびしいしゅぎょうにたえる',\n",
" 'シンクロナイズドスイミング',\n",
" 'しんくろないずどすいみんぐ'],\n",
" ['スキューバダイビングの基礎',\n",
" 'すきゅーばだいびんぐのきそ',\n",
" '応答メッセージ再生',\n",
" 'おうとうめっせーじさいせい',\n",
" '平均気温の上昇',\n",
" 'へいきんきおんのじょうしょう',\n",
" '事件は現場で起こっている',\n",
" 'じけんはげんばでおこっている'],\n",
" ['お肌のお手入れを欠かさない',\n",
" 'おはだのおていれをかかさない',\n",
" '新製品大量入荷',\n",
" 'しんせいひんたいりょうにゅうか',\n",
" '気分はサマーバケーション',\n",
" 'きぶんはさまーばけーしょん',\n",
" '意外な事実が待ち受ける',\n",
" 'いがいなじじつがまちうける'],\n",
" ['パッチワークのベッドカバー',\n",
" 'ぱっちわーくのべっどかばー',\n",
" '初心にかえるきっかけに',\n",
" 'しょしんにかえるきっかけに',\n",
" '一躍天下に名を知られる',\n",
" 'いちやくてんかになをしられる',\n",
" '週末の小旅行',\n",
" 'しゅうまつのしょうりょこう'],\n",
" ['心から幸せになる',\n",
" 'こころからしあわせになる',\n",
" '無理難題を突きつけられる',\n",
" 'むりなんだいをつきつけられる',\n",
" 'コンディションを整える',\n",
" 'こんでぃしょんをととのえる',\n",
" 'ジャンガリアンハムスター',\n",
" 'じゃんがりあんはむすたー'],\n",
" ['名探偵最大のピンチ',\n",
" 'めいたんていさいだいのぴんち',\n",
" '機密情報を盗みだす',\n",
" 'きみつじょうほうをぬすみだす',\n",
" '驚天動地な出来事',\n",
" 'きょうてんどうちなできごと',\n",
" '交通法規を遵守する',\n",
" 'こうつうほうきをじゅんしゅする'],\n",
" ['日本の住宅事情',\n",
" 'にほんのじゅうたくじじょう',\n",
" 'よくわかる株式講座',\n",
" 'よくわかるかぶしきこうざ',\n",
" 'デスクトップ型パソコン',\n",
" 'ですくとっぷがたぱそこん',\n",
" 'いい子で留守番してるのよ',\n",
" 'いいこでるすばんしてるのよ'],\n",
" ['中央演算装置',\n",
" 'ちゅうおうえんざんそうち',\n",
" '人種の坩堝',\n",
" 'じんしゅのるつぼ',\n",
" '杜撰な管理体制',\n",
" 'ずさんなかんりたいせい',\n",
" '頗る健康だ',\n",
" 'すこぶるけんこうだ'],\n",
" ['伝統を受け継ぐ宗匠',\n",
" 'でんとうをうけつぐそうしょう',\n",
" '天下統一まであと少し',\n",
" 'てんかとういつまであとすこし',\n",
" '挫折と成功の物語',\n",
" 'ざせつとせいこうのものがたり',\n",
" '夢の競演が実現する',\n",
" 'ゆめのきょうえんがじつげんする'],\n",
" ['全国制覇を成し遂げる',\n",
" 'ぜんこくせいはをなしとげる',\n",
" '剃刀のような技のキレ',\n",
" 'かみそりのようなわざのきれ',\n",
" '懇ろに答える',\n",
" 'ねんごろにこたえる',\n",
" '煩悩に捕らわれる',\n",
" 'ぼんのうにとらわれる']]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"with open(files[3], 'rb') as f:\n",
" print(find_info(f))\n",
" offset, wordlists = find_section(f=f)\n",
"wordlists"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment