質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

829閲覧

テキストファイルに絵文字で書かれた数字を読み込んで、その数字を出力したい

tyubo

総合スコア8

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

1クリップ

投稿2022/01/19 00:02

大学の課題でpythonでコードを提出しなければならないのですが、どのように処理すればいいのかわからず困っています。もし、知識がお有りの方がいらっしゃいましたら、ご教授いただきたいです。

<課題>
・テキストファイルに" * "と" | "で記載された数字の絵文字が記載されている。それを読み込んで、該当の数字を出力するプログラムを書け
<条件>
・数字は空白2行で区切られている

(例)

txt

1*   * * * 2| | | | 3**** * **** 4| | | | 5**** * *

というファイルを読み込んで、「614」と出力するプログラムをpythonで書きたいです。

<自分の考え>
・行ごとにリストに収納して、なんとか数字ごとに加工してまとめようとしましたが、難しく不可能でした。
・特に数字が空白2文字で分かれている部分で、数字を構成する要素にも空白があるため、うまく処理できませんでした。
・正規表現を使うと何かできそうな気がしたのですが、正規表現の知識が乏しく実現できませんでした。

もしpython以外の言語で実装の仕方をご存知の方がいらっしゃいましたら、考え方だけでもいいのでぜひご教授ください。
アドバイス頂けますと本当に助かります。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2022/01/19 00:39

> 特に数字が空白2文字で分かれている部分で、数字を構成する要素にも空白があるため、うまく処理できませんでした。 「ある列が空白のみで構成されているかどうか」を判定するコードが書ければ、とくに難しくはないと思います。どういうコードを書いてどううまくいかなかったかを書いてください。
guest

回答2

0

  1. 個々の数字の絵を縦読み(上から下、左から右の順)した場合のパタンと数字の関係を辞書で用意しておく
  2. 絵全体を縦読みして、1つの長い文字列にする
  3. 元々の絵での数字の間(空白2文字)は縦読みに変換すると10文字の空白のことなので、これを目印にして前ステップで作成した文字列を分割する(正規表現を使用して「空白が5文字以上連続」などで分割してもOK)
  4. 最初に準備しておいた辞書で、文字のパタンから数字に変換する

python

1data = ''' 2* * * * 3| | | | 4**** * **** 5| | | | 6**** * *''' 7 8s2n = {'*|*|* * * * * *|*': 6, # (1) 9 '*|*|*': 1, 10 '*|* * * *|*|*': 4} 11 12s = ''.join(''.join(z) for z in zip(*data.split('\n')[1:])) # (2) 13chunks = s.split(' ' * 10) # (3) 14ans = [s2n[c] for c in chunks] # (4) 15print(*ans, sep='') # 614

投稿2022/01/19 03:56

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

numbers.txt

text

1**** * * * **** **** **** **** **** **** **** 2| | | | | | | | | | | | | | | 3**** * **** **** **** **** * * * * **** **** 4| | | | | | | | | | | | | 5**** * * **** **** **** **** * **** ****

python

1# numbers list 2numbers = [ 3 ['*|*|*', '* *', '* *', '*|*|*'], # 0 4 ['*|*|*'], # 1 5 ['* *|*', '* * *', '* * *', '*|* *'], # 2 6 ['* * *', '* * *', '* * *', '*|*|*'], # 3 7 ['*|* ', ' * ', ' * ', '*|*|*'], # 4 8 ['*|* *', '* * *', '* * *', '* *|*'], # 5 9 ['*|*|*', '* * *', '* * *', '* *|*'], # 6 10 ['*|* ', '* ', '* ', '*|*|*'], # 7 11 ['*|*|*', '* * *', '* * *', '*|*|*'], # 8 12 ['*|* *', '* * *', '* * *', '*|*|*'], # 9 13] 14 15# 16with open('numbers.txt', 'r') as f: 17 n = f.read().splitlines() 18 19# transpose 20n = [''.join(l) for l in zip(*n)] 21 22# matching 23def pattern_matching(blk): 24 for i, num in enumerate(numbers): 25 if blk == num: 26 return i 27 return None 28 29# 30sep = ' ' 31blk, lst = [], [] 32for l in n: 33 if l == sep: 34 if not blk: continue 35 lst.append(pattern_matching(blk)) 36 blk = [] 37 else: 38 blk.append(l) 39 40# last number 41lst.append(pattern_matching(blk)) 42 43print(lst) 44 45# 46[6, 1, 4, 8, 3, 9, 0, 7, 2, 5]

投稿2022/01/19 01:22

編集2022/01/19 03:07
melian

総合スコア19803

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2022/01/19 02:24

6, 7, 9 の表記が異なるかもしれません。上記では 7 セグメントディスプレイに合わせたつもりなので、適宜変更して下さい。
tyubo

2022/01/26 22:04

迅速な対応、誠にありがとうございました。 おかげで課題を解決することができました。zip関数と(*)の使い方は全く知らなかったので、感嘆してしまいました(笑)。 課題に追われていてBAの返信が遅くなってしまい大変申し訳ございませんでした。 また、他にご回答頂いた方も、大変参考になりました。申し訳ございませんが、BAは最初にご回答頂いた方にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問