jedesa: やぁ!
jedesa: キンコンカンコンamigojapan
amgigojapan: やぁjedesa!
amgigojapan: jedesa: ちょっと待って
amgigojapan: (笑)jedesa、笑えった
amgigojapan: jedesa: 始めようか?
jedesa: わかった amigojapan
jedesa: 今日は何を学ぶの?
amgigojapan: jedesa: ええと、ノートを見てみよう
amgigojapan: jedesa: プログラミングの授業、次は演算子の優先順位、文字列の処理、クラス、再帰
amgigojapan: jedesa: 簡単なものから難しいものの順で
amgigojapan: jedesa: 再帰だけで1つの授業を丸ごと使えると思う
amgigojapan: そして、Think Like a computer の授業からいくつか借りる必要があるかもしれない
jedesa: うーん
amgigojapan: jedesa: わかった、準備はいい?
jedesa: Think Like a computerって何?
jedesa: YouTubeチャンネルだ?
amgigojapan: jedesa: プログラミングを教えるために作っているボードゲームなんだけど、まだ話してなかったよね
amgigojapan: jedesa: まだ公開してないよ
amgigojapan: jedesa: 完成してないんだ
jedesa: ああ、そうなんだ
jedesa: ところで
amgigojapan: うん?
jedesa: 基本的なプログラミングの概念を少しだけざっと説明したんだ
jedesa: うまくいけば、あまり苦労せずに理解できると思うよ
amgigojapan: わかった、演算子って何?優先順位は?
jedesa: うーん、+、-、AND、ORみたいな記号のこと?
amgigojapan: うん
amgigojapan: 優先順位は?
amgigojapan: jedesa: 例えば、2*2+1 と 1+2*2 の違いは?
jedesa: 特定の言語に関してはそうではありません
amgigojapan: jedesa: これは一般的にどの言語でも同じです
jedesa: つまり、算術演算では * が優先されます
amgigojapan: はい、
amgigojapan: では、ご存知ですね
amgigojapan: jedesa: 演算を括弧で囲むことで優先順位を変更できることを知っていますか?
jedesa: はい
jedesa: つまり、
amgigojapan: ああ、わかりました。後でこのレッスンを見るかもしれない他の人のために言っておきます
。amgigojapan: 例えば、1+(2*2) は 2*2+1 と同じです。jedesa
jedesa: ええ、私もあなたが知っていることを知りたいです
。amgigojapan: では、演算子の優先順位については以上です。もし疑問があれば、括弧で囲むだけで、何が最初に来るかがわかります。jedesa
jedesa: わかりました
。amgigojapan: jedesa: わかりました。では、文字列の処理に進みましょう
。amgigojapan: jedesa: 文字列は str="abc" のようなものです。
amgigojapan : jedesa: Python では、文字列を「連結」(2 つの文字列を接続)したい場合、1 つの方法は + 記号を使用することです。例えば、str = "abc" + "def" のように。
jedesa: わかった
amgigojapan: jedesa: print文の中でもできるよ、例えば print("hello " + name) のように
amgigojapan: jedesa: nameは文字列変数だよ
amgigojapan: jedesa: 簡単な問題をしてみたらどう?ユーザーに名前を尋ねて入力してもらって、helloと名前を出力するやつ。
jedesa: うん、わかった
amgigojapan: :)
amgigojapan: じゃあ、そのコードへのリンクを教えて
jedesa:
print("あなたの名前は何ですか?")
name=str(input())
print("こんにちは " + name + "!")
amgigojapan: 見せて
amgigojapan: 完璧だよ、jedesa!
jedesa: やったー!
amgigojapan: jedesa: 僕はBBSでこうやって挨拶するんだ
amgigojapan: jedesa: じゃあ、次のコードを見てみて:
main_string = "こんにちは、世界!"
substring = "世界"
if substring in main_string:
print(f'"{substring}" が文字列内に見つかりました。') # 出力: "world" が文字列内に見つかりました。
else:
print(f'"{substring}" は見つかりませんでした。')
jedesa: わかった
amgigojapan: うん
amgigojapan: つまり、部分文字列、つまり文字列が別の文字列の中にあるかどうかを確認できる方法ですね
jedesa: つまり、文字列は文字の集まりでできているので、それを使って追加したり減算したりすることもできます
amgigojapan: jedesa: それから、Python では str.find() を使って文字列内の部分文字列の位置を見つけることができます。これはとても便利です。なぜなら、すぐにその位置の使い方を教えるからです
jedesa: わかりました
amgigojapan: jedesa: いいえ、これは演算子のレッスンとは別です。文字列は単なる文字の集まりです
amgigojapan: Python で文字列を別の文字列に追加することを「連結」と呼び、Python ではたまたま + で行いますが、これは数学ではありません
amgigojapan: PHP では連結は + ではなく . を使用して行います
jedesa: ふむ、わかった
amgigojapan: つまり、PHP では $str = "abc" . "def";
amgigojapan: うん
amgigojapan: でもPHPについては後で考えよう
amgigojapan: jedesa: PythonとJSでは+、LUAでは..、PHPでは.
amgigojapan: でもまだ似ている
jedesa: . .. + はそれぞれの言語の演算子です
amgigojapan: うん、jedesa
amgigojapan: jedesa: ではこのコードを試してみて:
text = "Hello, world!"
position = text.find("world")
print(position) # 出力: 7
jedesa: わかりました。
jedesa: 7 は「Hello, 」の長さから来ています。
amgigojapan: jedesa: これはとても便利です。文字列内の部分文字列の位置がわかれば、それに対して多くの操作を行うことができます
jedesa: 例はありますか?
jedesa: 今のところアイデアがありません。
amgigojapan: そうです! jedesa、では簡単な問題をしてみてください。誰かの名前に文字 a が含まれているかどうかを調べるプログラムを作成できるかどうか教えてください
amgigojapan: jedesa: 含まれている場合は、単語のどの位置にあるか教えてください
amgigojapan: jedesa: わかりました。その間に例を作成します
jedesa:
# https://www.programiz.com/online-compiler/3zEZ7Dtxl2FHy
substr="a"
print("あなたの名前は何ですか?")
name=str(input())
print(substr + " は位置 " + str(name.find(substr)) + "にあります")
#str関数が数字を文字変える
amgigojapan: jedesa: 例えば、次のような場合に便利です。
text = "I love Python"
new_text = text[:2] + text[7:]
print(new_text)
#出力は「I Python」
amgigojapan: 新しい変数から love という単語を削除します
amgigojapan: 見せてください
amgigojapan: わかりました、jedesa さん。ただし、名前に a が含まれていない場合は -1 が返されることに注意してください
amgigojapan: つまり「見つかりませんでした」という意味です
jedesa: はい
jedesa: 存在しない単語を処理するために追加できます
amgigojapan: jedesa: では、string1 のユーザーからの入力を受け取り、次に string2 のユーザーからの入力を受け取り、文字列から単語を削除して結果を出力するプログラムを作成してください
amgigojapan: はい
amgigojapan: 時間をかけてください
jedesa: うーん?
amgigojapan: 質問はありますか?
jedesa: string2 の入力に基づいて、string1 の部分文字列を削除しますか?
amgigojapan: はい
amgigojapan: jedesa: ああ、そのプログラムに必要なコンポーネントを教えるのを忘れていました
jedesa: 実際、試させてください
amgigojapan: jedesa: len(string) は文字列の長さを返します
amgigojapan: ヒントが必要ですか?
jedesa:
# https://www.programiz.com/online-compiler/2HhtjMY99LFzU
print("strign1入力:")
string1 = str(input())
print("strign1入力:")
string2 = str(input())
pos = string1.find(string2)
while pos > -1:
string1 = string1[:pos] + string1[pos+len(string2):]
pos = string1.find(string2)
print(string1)
amgigojapan: 見せてください
jedesa: これでできるはずです
amgigojapan: うん、うまくいった! jedesa: :) すごい!
amgigojapan: jedesa: 今度は、このプログラムに似た、3つの文字列を受け取るプログラムを作ってください。ただし、3番目の文字列は削除された単語の代わりになるようにしてください
jedesa: わかりました
# https://www.programiz.com/online-compiler/31ZQbvUMBRE3C
print("strign1入力:")
string1 = str(input())
print("strign2入力:")
string2 = str(input())
print("strign3入力:")
string3 = str(input())
pos = string1.find(string2)
while pos > -1:
string1 = string1[:pos] + string3 + string1[pos+len(string2):]
pos = string1.find(string2)
print(string1)
#example output
strign1入力:
HELLO WORLD BYE
strign2入力:
WORLD
strign3入力:
MARS
HELLO MARS BYE
jedesa: わあ、速かった
amgigojapan: 見せて
amgigojapan: いいね、jedesa!
amgigojapan: jedesa: 文字列処理の基本は理解できたと思うよ :)
jedesa: print("ehehe")
amgigojapan: :)
amgigojapan: jedesa: よろしければ、文字列処理の難しい宿題を出してもいいですよ。
jedesa: わかりました。 jedesa: ちょっと
待ってください。 jedesa:
まだ授業と再帰があります。
jedesa: うーん、わかりました。
amgigojapan: jedesa: わかりました。今はやらなくていいですよ。時間がかかりすぎますから。宿題は、文字列処理を使ってハングマンゲーム(首吊りゲーム)を作ることです。
jedesa: わかりました。
amgigojapan: jedesa: ええ、再帰は後でできますし、今日は授業の時間はないと思います。
amgigojapan: jedesa: この宿題に1週間かけてもいいですよ。
jedesa: 後でやってみます。
jedesa: わかりました。 amigojapan
— jedesa キンコンカンコン
jedesa: はい、今日は時間をありがとうございました。 :3
amgigojapan: あなたも時間をありがとうございました!
jedesaの宿題;
jedesa's homework
print("The Hangman Game: Guess a Distro Edition!")
import random, string
# pick a random distro
def genword():
words = ["CachyOS", "Mint", "MX Linux", "Debian", "EndeavourOS", "Pop!_OS", "Zorin", "Manjaro", "Fedora", "Ubuntu", "AnduinOS", "openSUSE", "Nobara", "elementary", "NixOS", "Bluestar", "KDE neon", "antiX", "BigLinux", "Bazzite", "Arch", "Garuda", "Q4OS", "TUXEDO", "FreeBSD", "PikaOS", "SparkyLinux", "Kali", "AlmaLinux", "Puppy", "Alpine", "MiniOS", "CentOS", "PCLinuxOS", "Tails", "Voyager", "EasyOS", "Linuxfx", "Kubuntu", "Solus", "Lite", "Devuan", "Artix", "Parrot", "AerynOS", "Void", "Exton", "DragonOS", "Omarchy", "ALT", "Rocky", "FunOS", "Lubuntu", "OpenMandriva", "Slackware", "Gentoo", "Commodore", "Peppermint", "deepin", "Ultimate", "Mageia", "PorteuX", "Red Hat", "Xubuntu", "AV Linux", "blendOS", "MODICIA", "Archcraft", "Kodachi", "MocaccinoOS", "ReactOS", "Tiny Core", "ArchBANG", "KaOS", "Bodhi", "GhostBSD", "KDE Linux", "Ultramarine", "Gnoppix", "Vanilla", "ZimaOS", "Calculate", "FydeOS", "Mabox", "Nitrux", "Qubes", "SmartOS", "AxOS", "MagOS", "Feren", "4MLinux", "OpenBSD", "GNOME OS", "Ubuntu Studio", "Chimera", "Proxmox", "Besgnulinux", "Regata", "TrueNAS", "HackerOS", "BunsenLabs", "MakuluLinux", "RebornOS", "Oracle", "Emmabuntüs", "SDesk", "Murena", "Expirion", "Rhino", "Aurora", "Haiku", "Porteus", "Wifislax", "GLF", "Ubuntu MATE", "Endless", "Dr.Parted", "TROMjaro", "VailuxOS", "ChromeOS", "iDeal", "Volumio", "Talos", "GXDE", "Br OS", "NebiOS", "Oreon", "SliTaz", "AUSTRUMI", "DragonFly", "openmamba", "RasPiOS", "Kicksecure", "LinuxHub", "openKylin", "DietPi", "Neptune", "postmarketOS", "Security Onion", "Whonix", "Damn Small", "Athena", "MidnightBSD", "Pardus", "extrox", "Ubuntu Cinnamon", "Ufficio Zero", "Liya", "OmegaLinux", "Genuen", "siduction", "Shanios", "Synex", "Kiro", "ROSA", "GParted", "Lingmo", "pearOS", "Clonezilla", "Mauna", "Nyarch", "Redox", "StormOS", "XIVA Studio", "SystemRescue", "Archman", "Guix System", "Ubuntu Budgie", "LFS", "HeliumOS", "Obarun", "SUSE", "ExTiX", "iodéOS", "Loc-OS", "RefreshOS", "Vendefoul", "Asmi", "Pearl", "CRUX", "T2 Linux", "Debian Edu", "OpenMediaVault", "LainOS", "RELIANOID", "Rescuezilla", "BlueOnyx", "GrapheneOS", "NetHydra", "NuTyX", "AgarimOS", "CuerdOS", "OpenIndiana", "Ubuntu Unity", "IPFire", "Soplos", "SysLinuxOS", "Armbian", "Batocera", "Bluefin", "Exe", "Finnix", "SteamOS", "FreedomBox", "Grml", "Trisquel", "ELEGANCE", "NetBSD", "Univention", "GoboLinux", "Lakka", "Slimbook OS", "Alien-OS", "OPNsense", "Slackel", "Tribblix", "Ubuntu Kylin", "Xray_OS", "BackBox", "HardenedBSD", "NomadBSD", "d77void", "DESERT", "Edubuntu", "KolibriOS", "LibreELEC", "Plop", "UBports", "umbrelOS", "Zephix", "Canaima", "Elive", "ObsidianOS", "openEuler", "Drauger", "Melawy", "MIRACLE", "PakOS", "Pisi", "VyOS", "WM Live", "Arkane", "Sculpt", "Berry", "Daphile", "Mobian", "NethServer", "spirit OS", "Calam", "Plamo", "Redcore", "Refracta", "Vinari", "arcOS", "Luberri", "Venom", "Vipnix", "Aeon", "DynFi", "GuideOS", "Unraid", "Zenwalk", "Adélie", "BSDRP", "FuguIta", "Kamarada", "RED OS", "Tsurugi", "ElysiaOS", "Peropesis", "Slint", "Bedrock", "Crunchbangplusplus", "MAX", "AOSC", "CAINE", "Netrunner", "Shebang", "SolydXK", "XigmaNAS", "46=", "Parch", "RebeccaBlackOS", "Recalbox", "Flatcar", "Kumander", "Lilidog", "PrismLinux", "Solaris", "StartOS", "Accessible-Coconut", "Live Raizo", "Parted Magic", "Pentoo", "Snal", "ATZ Linux", "Clear NDR", "NST", "Ubuntu Pack", "DebLight", "Kamuriki", "LinuxConsole", "TeaLinux", "Zentyal", "DEKUVE", "LliureX", "Predator-OS", "Skywave", "Vine", "XeroLinux", "KANOTIX", "LinuxCNC", "Macaroni", "Runtu", "NethSecurity", "pfSense", "AcreetionOS", "Rockstor", "Fatdog64", "PelicanHPC", "Porteus Kiosk", "UOS", "Zenned", "Exherbo", "gabeeOSLinux", "OsoLinux", "Planeta Tecno", "PLD", "Quarkos", "secureblue", "TileOS", "Ventoy", "AlterOS", "LazyLinux", "Secure-K", "StratOS", "Archriot", "Berserk Arch", "Ditana", "HamoniKR", "Noid", "Origami", "OSMC", "RISC", "Zenclora", "Astra", "Blade", "Flora", "Koozali", "paldo", "Super Grub2", "OmniOS", "Escuelas", "Helwan", "mAid", "rlxos", "AnuBitux", "Catbird", "Essora", "Salix", "TTOS", "Uncom", "Thinstation", "YunoHost", "AçorOS", "AfagOS", "DAT", "Lernstick", "Linux Schools", "Milis", "PelandukOS", "Vincent", "Ximper", "OSGeoLive", "PrimTux", "Smoothwall", "TurnKey", "UBOS", "Asahi", "BRGV-OS", "Green", "nakeDeb", "Xebian", "Bicom", "LangitKetujuh", "NexentaStor", "TobbeOS", "Vitalinux", "BOSS", "LxPup", "OviOS", "Quirinux", "UBLinux", "Ubuntu Sway", "Fluxuan", "FUSS", "Maple", "REMnux", "Skudonet", "AiO-SRT", "CloudLinux", "Nemesis", "RDS", "RSS", "Senpai", "Side", "XCP-ng", "< 1 or not g.isalpha():
print("Guess with case-sensitive alphabet:")
g = str(input())
return g
# run until quit or game over
retry = True
score = 0
while retry:
# generate word
word = genword()
print("Hint:", len(word), "characters long")
# print("ANSWER:", word)
# ハングマンの仕組み
# 単語リストのコピー値は非表示にする
# プレイヤーが推測する
# 間違っていたら、間違った推測数を増やし、絞首台へ進む
# 正解したら、文字表示を更新し、絞首台を停止する
# 体力がなくなったら、ゲームオーバー
# すべての文字を正しく推測したら、ゲームを続行する
# hangman start
# 10 health points
# 20 if long word
health = 20 if len(word) > 12 else 10
if health > 10: print("Good News! HP x20")
progress = [ "_" for i in range(0, len(word)) ]
wrong = []
while health > 0 and "_" in progress :
iscorrect = False
pguess = guess() # player guess
iscorrect = pguess in word # check guess
if pguess in wrong or pguess in progress:
print("Already Guessed!")
elif iscorrect:
print("Correct!")
progress = gallows(word, progress, pguess)
else:
print("Wrong!")
wrong.append(pguess)
health = health - 1
print("Health :", health)
print("Progress:", progress)
print("Miss :", wrong)
# check win
if "_" in progress:
print("Hanged!")
retry = False
else:
print("Good Work")
score = score + 1
# retry game
if retry:
print("Enter '0' to exit or any key to continue")
if str(input()) == "0":
retry = False
print("Game Over. Correct guesses:", str(score) + " word:" + word)