POH7 安藤杏ちゃんに水着をPythonでプレゼントした話

## Paiza Online Hackathon

[恋愛SLG: プログラミングで彼女をつくる｜paizaオンラインハッカソン7](https://paiza.jp/poh/ando/)

今年のクリスマスはこれで1人じゃないです．
腕自信のあるお兄さん方も彼女を作りましょう！！

## Ruby版( @iguchi1124 作)

私が書いたコードの前に知り合いがRubyで水着をプレゼントした記事見つけたので貼っておきます

[paizaの女の子(安藤杏たん)にRubyを使って水着をプレゼントしよっ♡](http://qiita.com/iguchi1124/items/be4d8b1e770e3edf1ac3)


痛々しい記事です

とっても素晴らしい記事です！！妻に掛ける思いがひしひしと伝わってきます:yum:

## 前置き

まだ全部が全部Pythonで解いてないので全公開までは言ってないんですが，GitHubに上がってます．

[nnsnodnb/poh7_girlfriend](https://github.com/nnsnodnb/poh7_girlfriend)

## 私の妻の紹介です

https://paiza.jp/poh/ando/share/13b14a0a

## 水着をプレゼントした時の結果

![スクリーンショット 0027-12-12 午後8.11.56.png](https://qiita-image-store.s3.amazonaws.com/0/97280/f03b6339-552a-b79a-cc6c-70fe9840b5d7.png "スクリーンショット 0027-12-12 午後8.11.56.png")

こんな感じに出来ました！！！うっひょい:smile:

![戦況.png](https://qiita-image-store.s3.amazonaws.com/0/97280/7a6fb050-b0be-13c8-bfe1-351370978da6.png "戦況.png")

Swiftで脱線したところもありますが，水着問題に挑戦してこんな感じの戦況で，お風呂に入ってる時に「なんで無駄な桁数まで計算させてたんだ」って思い立って，やったらできました．ﾁｬﾝﾁｬﾝ

## はじめに書いたクソコード

[はじめてのコード](https://github.com/nnsnodnb/poh7_girlfriend/blob/39f974478b7f8fd62237258e57c3ea49fb48be61/水着.ipynb)

```python
# coding: utf-8
# 自分の得意な言語で
# Let's チャレンジ！！

# ====================
# 答え自体は出るが速度が遅い
# ====================

import math
import sys
from functools import reduce

def fact(x):
    numbers = range(1 , x + 1)
    return reduce(lambda x , y : x * y , numbers)

def del_zero(keta):
    while True:
        if keta[0] == 0:
            keta.pop(0)
        else:
            return keta

data = fact(int(input()))

keta = []
# 桁ごとに区切る
len_data = len(str(data))

for i in range(len_data):
    keta.append(int(data % 10))
    data = int(data // 10)
    
before_keta = del_zero(keta)

before_ans = before_keta[:9]
before_ans.reverse()

ans = del_zero(before_ans)

for i in range(len(ans)):
    print(ans[i] , end="")
```

動かないことはないです．でも遥かに非効率だしこれならPythonでやる必要ない

## 2つ目に書いたコード

[2つ目のコード](https://github.com/nnsnodnb/poh7_girlfriend/blob/82a36c27d8c536ce96195c9f325cc183af94bd06/水着.ipynb)

```python
# coding: utf-8
# 自分の得意な言語で
# Let's チャレンジ！！
import multiprocessing
import operator
from functools import reduce

def p_fac(n) :
    product = 1
    if n == 0 : return 1
    for num in range(n,0,-c):
        product *= num
    return product

def p_Factorial(n) :
    p = multiprocessing.Pool()
    return reduce(operator.mul , p.map(p_fac , range(n , n - c , -1)) , 1)

def del_zero(keta):
    while True:
        if keta[0] == 0:
            keta.pop(0)
        else:
            return keta

num = int(input())
c = multiprocessing.cpu_count()
data = p_Factorial(num)

keta = []
# 桁ごとに区切る
len_data = len(str(data))

for i in range(len_data):
    keta.append(int(data % 10))
    data = int(data // 10)
    
before_keta = del_zero(keta)

before_ans = before_keta[:9]
before_ans.reverse()

ans = del_zero(before_ans)

for i in range(len(ans)):
    print(ans[i] , end="")
```

[Paiza.io](http://paiza.io)でチェックしたところ8つコアがあったのでどうかなるかなぁって思ったのでやってみたやつです．

まぁ無駄な努力に終わりました．

## 最終的なコード

[最終的なコード](https://github.com/nnsnodnb/poh7_girlfriend/blob/e50eace0190867706c7d15a734e008ab322d9946/水着.ipynb)

```python
# coding: utf-8
# 自分の得意な言語で
# Let's チャレンジ！！
number = int(input())

s = 1
for i in range(1 , number + 1):
    s = int(str(int(str(s * i)[::-1]))[:9][::-1])

print(s)
```

### 流れ

1. `s * i`を文字列に変換し`[::-1]`によって逆さまにする
2. integerに再変換し，前にある`0`を取り払う
3. また文字列に変換し，初めから9番目までを取得
4. 取得したものを逆さまにしてintegerにまた戻す


これだけで十分だったんですね．