読者です 読者をやめる 読者になる 読者になる

牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

pyspa challenge01 に挑戦してみた

Python

問3解答あたり修正(途中経過のものをコピペしてた)

問いはこちらから引用

※まだ問題を解いていない人は上記リンクへ。下記に自己流の答えが書いてあるので注意!

最初に感想とか

  • id:Voluntas師匠に「是非チャレンジしてみてくださいw」と言われて安請け合い。
  • うーん。問一、二と問三の難易度にかなりの差があると思われ。(問一、二 <<<<<<<< 問三)
  • もしくは自分アホなのかと(ry
  • こういうのやり始めるとムキになって仕事に支障が(ry
  • これで問三の解答が間違っててももう知らんよ、もぉー(´・ω・`)

問一

print "".join(chr(ord(x) + 1) for x in *****)

*****の部分に適当なコードを入れてpyspaと表示されるようにせよ

問一の解答
print "".join(chr(ord(x) - 1) for x in 'pyspa')
#-> oxro`

なので

print "".join(chr(ord(x) + 1) for x in 'oxro`')
#-> pyspa

問二

import os
print "".join(os.__doc__[x] for x in[os.__doc__.*****(x) for x in "pyspa"])
問二の解答

4つあるとのことなので

import os
print "".join(os.__doc__[x] for x in[os.__doc__.find(x) for x in "pyspa"])
print "".join(os.__doc__[x] for x in[os.__doc__.index(x) for x in "pyspa"])
print "".join(os.__doc__[x] for x in[os.__doc__.rfind(x) for x in "pyspa"])
print "".join(os.__doc__[x] for x in[os.__doc__.rindex(x) for x in "pyspa"])
#-> pyspa
#-> pyspa
#-> pyspa
#-> pyspa

一番短いのだから

import os
print "".join(os.__doc__[x] for x in[os.__doc__.find(x) for x in "pyspa"])
#-> pyspa

問三

import os
os.system("python -m ***** | python -c 'import sys;(lambda x=sys.stdin.read():[sys.stdout.write(x[i]) for i in [67, 12, 31, 67, 36]])()'")
問三の解答までの道程(かなり省略)
  • python -m module」なのでモジュール名が入るはず。
  • 適当にモジュール名いれて実行したら、エラーでたり・止まったり・稀に文字でたり?
  • スマートな方法が思いつかなかったのでチカラ技で。
  • 実行して止まったら(error?)出力結果から"pyspa"を検索、なければindex_numで次を指定してまた実行。
  • MacportsでいれたPython使ってるので「path = '/opt/local/lib/python2.5'」
  • 関数all_filesはPython Cookbookからそのまま流用
  • 正直こんなのありえねーと思ったー。これ正解なのか?


とりあえずモジュール名からチカラ技で正解を導きだすはずのスクリプト

#!/usr/bin/env python
# *-# -*- coding: utf-8 -*-

import glob
import os
import os.path

#Macportsのpythonからモジュールのパスを取得してリストに
path = '/opt/local/lib/python2.5'
def all_files(pattern, search_path, pathsep=os.pathsep):
    for path in search_path.split(pathsep):
        for match in glob.glob(os.path.join(path, pattern)): 
            yield match
file_path_lst = list(all_files('*.py', path))

#file_path_lstのインデックスナンバー。指定したナンバー以降を実行。
index_num = 138

for  i,filepath in enumerate(file_path_lst[index_num:]):
    filename = os.path.basename(filepath)[:-3]
    print i + index_num ,filename
    try:
        os.system("python -m %s | python -c 'import sys;(lambda x=sys.stdin.read():[sys.stdout.write(x[i]) for i in [67, 12, 31, 67, 36]])()'" % filename)
    except:
        pass

こんなの出力(一部抜粋)

:
161 textwrap
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
IndexError: string index out of range
162 this
pyspa163 threading
o
co.164 timeit
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
IndexError: string index out of range
165 toaiff
:

あったぁぁぁ(・∀・)b

問三の解答
import os
os.system("python -m this | python -c 'import sys;(lambda x=sys.stdin.read():[sys.stdout.write(x[i]) for i in [67, 12, 31, 67, 36]])()'")
#-> pyspa


っていうかthisってなんだー?
なんかスッキリしないけど出来たー━━━━(゚∀゚)━━━━ッ!!

それから(追記

出題者から解答
挑戦者の解答