第66回シェル芸勉強会メモ

はじめに 2023年9月30日に開催された第66回シェル芸勉強会にオンラインで参加させていただきました。 そのときの記録をメモとして記事にしておこうと思います。 あと、解けそうな問題はChatGPT(GPT-4)にも解いていただこうと思います。 ## 問1 : 0123456789 問題内容 数字を使わずに0123456789を出力します。 私の回答 cat<<EOF>>a.cpp #include <bits/stdc++.h> int main() { int a[]={'a','b','c','d','e','f','g','h','i','j'}; for(char b: a) printf("%d",b-'a'); } EOF g++ a.cpp ./a.out 私の感想 bashのワンライナーではありませんが、とりあえず想定の出力は得られました。 他に何も思いつかなかったのでまだまだ力不足という感じです。勉強します。 配信で紹介されていたseq infの回答がスマートで勉強になりました。 ChatGPTの回答 echo abcdefghij | tr a-j $(echo a | tr a ':') 出力結果 :::::::::: 私の感想 10回くらいやり取りをして最終的にこの回答になりました。 数字を使用できないという制約が難しかったのかもしれません。 また、ChatGPTは実行できない状態のワンライナーも当たり前のように提供してくるので気をつけないといけませんね。 問2 : リダイレクト 問題内容 “ls 存在しないファイル 3>file 2>?“の?に文字列を入れてfileにlsのエラー出力を書き込みます。 私の回答 ls 存在しないファイル 3>file 2>&$(seq inf|head|sed '$d'|sed '$d'|sed '$d'|sed '$d'|sed '$d'|sed '$d'|sed '$d'|tac|sed '$d'|sed '$d') 私の感想 さっそく問1で学んだことを使ってみました。1-10を出力してからsed ‘$d’で最終行を削除していきます。 欲しい数字は3なので途中でtacを使いました。長いですがとりあえずはできたっぽいので良しとします。 ...

2023年10月3日 · Yusuke Kato

第64回シェル芸勉強会メモ

はじめに 2023年4月22日に開催された第64回シェル芸勉強会にオンラインで参加しました。 そのときの記録をメモとして記事にしておこうと思います。 あと、解けそうな問題はChatGPT(GPT-4)にも解いていただこうと思います。 公式配信 ## 問1 : メール解析 問題内容 メールの内容から必要な情報だけ抜き出します。 私の回答 cat S*/*64/*.txt|sed 's/-/ /g'|sed 's/:/ /g'|sed 's/:&gt;//g'|sed 's/Re //g'|sort -k9|awk '{c[NR]=$3;d[NR]=$4;g[NR]=$7;h[NR]=$8;i[NR]=$9}END{for(j=1;j&lt;length(i);j++){if(i[j]==i[j-1]){printf("%s %s %s %d\n",i[j],g[j-1]"-&gt;"h[j-1],g[j]"-&gt;"h[j],(c[j]-c[j-1])*24+d[j]-d[j-1])}}}' 私の感想 awkでごり押ししました。 まずsedでメール内容を整形して、時刻を比較したいメール同士が並ぶようにsortで並べ替えを行います。 それからawkでメール内容をすべて配列に入れて、時刻の差分を計算して必要な情報だけ出力しました。 ちなみに、私の回答は不完全なので分と秒を考慮できていません。 まだまだ勉強が足りていない気がしますね。 精進します。 問2 : 乱数生成 問題内容 正規分布に従う乱数を生成します。 私の回答 echo | awk 'BEGIN{srand();a=0}{for(i=0;i&lt;12;i++)a+=rand()}END{printf("%lf\n",a-6)}' 私の感想 私は正規分布が分からないので0~1の乱数を12個足して6を引いた値を出力しました。 解説で紹介されていた「cat /dev/urandom」から乱数を生成する方法が勉強になりました。 これから乱数を生成するときは使ってみようと思います。 数値だけではなくアルファベットの文字列もランダムに生成できるとのこと。 便利ですね。ありがとうございます。 ChatGPT(GPT-4)の回答 awk 'BEGIN {srand(); u1=rand(); u2=rand(); z0=sqrt(-2*log(u1))*cos(2*3.14159265359*u2); print z0}' Box-Muller変換を使っているらしいです。 問3 : 行列の転置 問題内容 与えられた行列が対称行列か判定します。 私の回答 cat S*/*64/mat | python3 -c 'import numpy as np;A=[input().split() for _ in range(5)];A=np.array(A);AT=A.T;r="YES" if np.array_equal(A,AT) else "NO";print(r)' 私の感想 awkで行列を扱うのは地獄になりそうだったのでPythonのNumpyを使って解きました。 解説ではdatamashコマンドが紹介されていて勉強になりました。 まだまだ知らないコマンドがたくさんありますね。 便利なコマンドは少しずつ覚えておきたい所存です。 また、二次元配列の入力に関しては以下の記事を参考にさせていただきました。 ...

2023年4月23日 · Yusuke Kato

ChatGPTでシェル芸勉強会の問題が解きたい

はじめに 月額20ドルを支払ってGPT-4が利用できるようになったので、 ChatGPTにシェル芸勉強会の問題を解いていただこうと思います。 シェル芸勉強会の問題をお借りします(すみません)。 今回は第63回シェル芸勉強会の問1と問2に挑戦してもらいます。 リンク 利用モデル:GPT-4 https://engineers.ntt.com/entry/2023/03/09/091735 第63回ビッグハンドタウンシェル芸勉強会の問題と解説 実行環境:websh 問1 : 九九の合計 私が入力した文章 ワンライナーのBashスクリプトで九九の掛け算(1×1~9×9まで)の答えの合計を求めてください。 ChatGPTが書いたBashスクリプト sum=0; for i in {1..9}; do for j in {1..9}; do sum=$((sum + i * j)); done; done; echo $sum 実行結果 2025 私の感想 ワンライナーと言えるかは怪しいですが、普通に解いていただけてとても嬉しいです。 デバッグをする必要もなく、一発で実行可能なスクリプトを出力してもらえました。 「GPT-4が凄い!」という噂は間違いではないのかもしれません。 この調子でもう一問、解いていただきましょう。 問2 : おつりの出し方 私が入力した文章 ワンライナーのBashスクリプトで9132円の支払いに10000円札で払ったときのおつりの出し方を求めてください。 ChatGPTが書いたBashスクリプト change=$((10000 - 9132)); echo "おつり: ${change}円"; echo "5000円札: $((change / 5000))"; change=$((change % 5000)); echo "1000円札: $((change / 1000))"; change=$((change % 1000)); echo "500円硬貨: $((change / 500))"; change=$((change % 500)); echo "100円硬貨: $((change / 100))"; change=$((change % 100)); echo "50円硬貨: $((change / 50))"; change=$((change % 50)); echo "10円硬貨: $((change / 10))"; change=$((change % 10)); echo "5円硬貨: $((change / 5))"; change=$((change % 5)); echo "1円硬貨: $((change))" 実行結果 おつり: 868円 5000円札: 0 1000円札: 0 500円硬貨: 1 100円硬貨: 3 50円硬貨: 1 10円硬貨: 1 5円硬貨: 1 1円硬貨: 3 私の感想 かなりの力技で問題を解いてもらいました。 ワンライナーと言えるかは分かりませんが、普通に解いていただけてとても嬉しい気持ちです。 今回もエラーが出ることはなく、すんなり実行できました。 もっといろんな問題で試してみたいですね。 ...

2023年4月12日 · Yusuke Kato

シェル芸botで遊びたい(Bash)

はじめに Twitterのシェル芸botで遊ばせていただく方法を紹介します。 遊び方 シェル芸botはハッシュタグ「シェル芸」をつけてシェル芸をツイートすると、 自動で実行して出力結果を教えてくれます。 たとえば、以下のようなツイートをすると出力結果「テスト」を引用リツイートで返してくれます (ただし、自分のアカウントがシェル芸botアカウントにフォローされている必要があります)。 echo テスト 画像生成 シェル芸botは画像生成もできます。 imagesディレクトリの中にpngやjpg、gifの画像を配置すると、 その画像を添付してツイートしてくれます。 たとえば、以下のようなツイートをすると「テスト」と書かれた画像を引用リツイートで返してくれます。 textimg "テスト" -o images/a.png Python シェル芸botではPythonスクリプトも実行できます。 たとえば、以下のようなツイートをすると出力結果「テスト」を引用リツイートで返してくれます。 Pythonの豊富なライブラリも利用できるので遊び方は無限大です。 python3 -c "print('テスト')" C/C++ シェル芸botではC言語やC++言語も実行できます。 たとえば、以下のようなツイートをすると出力結果「テスト」を引用リツイートで返してくれます。 高速に処理したいときなどに役立ちます。 cat<<EOF>a.cpp #include <bits/stdc++.h> int main() { printf("テスト\n"); } EOF g++ a.cpp ./a.out おわりに シェル芸botの遊び方を紹介しました。

2023年4月11日 · Yusuke Kato