LoginSignup
11
11

More than 1 year has passed since last update.

Pythonで九九表を一行で作る

Last updated at Posted at 2021-08-03

概要

プログラミングのテスト前日、Pythonのテキストにある演習問題にこうあった。

次のような九九表を作成してみよう

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

コードゴルファー(クソ弱い)としてはこれを一行で書いてみたい。
というか書けるの、これ?ググってもだれもやってない。

だったらやるしかないじゃない。
明日がテストなので足早に、テンション高めで書いていきます。

......ということで完全にネタです。
個人の趣向ですが、フォーマッタは使用します。
普通に書いたほうが短いとかいうツッコミはNGです。

実際に書いたコード

実際に考えたのは次のようなコードです。

print(*[f"{[i*j for i in range(1,10)]}"[1:-1].replace(",", "") for j in range(1,10)], sep="\n")

104byte、ぼちぼちの出来栄えである。これで、問題とおなじ出力を得られる。

中身のお話

発想としては

  • どうやってもfor文かmapを2つ使う。
  • 一度文字列に変換して、,[]を削除しよう。

の2つが柱です。まず、

[[i*j for i in range(1, 10)] for j in range(1,10)]

で、表のデータを作ってしまいます。これに一つ工夫をして、

[f"{[i*j for i in range(1, 10)]}" for j in range(1,10)]

とすると、二重のリストではなく、文字列のリストになります。
この文字列の一文字目と最終文字を消すために[1:-1]を、,を消すために.replace(",", "")を入れます。これを改行区切りで出力すれば、最初のコードになります。

試行錯誤のあと

実は最初はmapを使おうと思っていました。

print(*map(lambda x: f"{list(map(lambda y: x*y, range(1, 10)))}"[1:-1].replace(",", ""), range(1, 10)), sep="\n")

リスト内包表記にかえれば最初のコードと同じになります。122byteあるので、ボツになりました。

終わりに

ここまでお付き合いくださり本当にありがとうございます。
テスト前日ということもあり、マジで駄文ですが楽しんでいただければ幸いです。
みなさんもぜひ、一度考えて見てください。これより短いのが見つかると嬉しいです。


追記
コメント欄で、答えがでました。

11
11
10

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11