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

  • 0
    いいね
  • 1
    コメント

    Paiza Online Hackathon

    恋愛SLG: プログラミングで彼女をつくる|paizaオンラインハッカソン7

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

    Ruby版( @iguchi1124 作)

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

    paizaの女の子(安藤杏たん)にRubyを使って水着をプレゼントしよっ♡

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

    前置き

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

    nnsnodnb/poh7_girlfriend

    私の妻の紹介です

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

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

    スクリーンショット 0027-12-12 午後8.11.56.png

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

    戦況.png

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

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

    はじめてのコード

    # 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つ目のコード

    # 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でチェックしたところ8つコアがあったのでどうかなるかなぁって思ったのでやってみたやつです.

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

    最終的なコード

    最終的なコード

    # 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にまた戻す

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