プログラミングのお題スレ Part22 (854レス)
1-
抽出解除 レス栞

リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
9
(58): 9 [sage] 2023/08/07(月) 01:46:18.23 ID:PMO8D1QO(1/2) AAS
>>3
3(9): デフォルトの名無しさん [] 2023/08/06(日) 12:21:14.08 ID:/9zIb/V0(1) AAS
お題
1行につき一つの文章が入力されます
アルファベット26文字がすべて含まれている文章をフィルタリングしてください
大文字小文字は区別しません
そのうちもっとも短い文章を出力してください

入力
The quick brown fox jumps over a lazy dog.
The jay, pig, fox, zebra and my wolves quack!
Pack my box with seven dozen liquor jugs.
The horse, pig, fox, zebra and my wolves quack!
Jackdaws love my small sphinx of quartz.
Jackdaws love my big sphinx of quartz.
The quick brown fox jumps over a lazy cat.
Pack my box with five dozen liquor jugs.

出力
Jackdaws love my big sphinx of quartz.
Perl5

for (<DATA>) {
 my %h = map{$_ => 1} grep{/[a-z]/i} split '';
 push @a, $_ if 26 == keys %h;
}
@s = sort{length($a) <=> length($b)} @a;
print $s[0];
__DATA__
The quick brown fox jumps over a lazy dog.
The jay, pig, fox, zebra and my wolves quack!
Pack my box with seven dozen liquor jugs.
The horse, pig, fox, zebra and my wolves quack!
Jackdaws love my small sphinx of quartz.
Jackdaws love my big sphinx of quartz.
The quick brown fox jumps over a lazy cat.
Pack my box with five dozen liquor jugs.

※ 見易くするためインデントを全角スペースに置換してあります。

実行結果:

$ perl 22_3_az26.pl
Jackdaws love my big sphinx of quartz.
10
(1): デフォルトの名無しさん [sage] 2023/08/07(月) 01:57:03.56 ID:PMO8D1QO(2/2) AAS
>>9 ゴメン、2行目に間違いあり…orz

 my %h = map{$_ => 1} grep{/[a-z]/i} split '';
 ↓正しくは
 my %h = map{$_ => 1} map{lc} grep{/[a-z]/i} split '';

実行結果は今回のテストデータだとたまたま同じ結果になる。
26: 9 [sage] 2023/08/11(金) 02:38:50.64 ID:4P/NDj/+(1/2) AAS
スレが伸びているので何かと思えば、オレほか一部の回答者がsortを使ったのが
そんなに気に入らなかったか、気に障ったか、
ざまぁみろw としか言いようがないが

後出しでケチつけてるのは出題者じゃないようだが
そしたらsortも、そしてminもあえて使わないバージョン、
書き方はいろいろあると思うけど:

>>3 Perl5
use List::Util 'first';
for (<DATA>) {
 my %h = map{lc $_ => 1} /([A-Za-z])/g;
 $a[length $_] = $_ if 26 == keys %h;
}
print first{defined} @a;
__DATA__
The quick brown fox jumps over a lazy dog.
The jay, pig, fox, zebra and my wolves quack!
Pack my box with seven dozen liquor jugs.
The horse, pig, fox, zebra and my wolves quack!
Jackdaws love my small sphinx of quartz.
Jackdaws love my big sphinx of quartz.
The quick brown fox jumps over a lazy cat.
Pack my box with five dozen liquor jugs.

実行結果
~ $ perl 22_3_az26_a.pl
Jackdaws love my big sphinx of quartz.
29: 9 [sage] 2023/08/11(金) 08:37:47.88 ID:4P/NDj/+(2/2) AAS
O(nlog(n))がダメかどうかは、データの規模および実行時間による
43
(2): 9 [sage] 2023/08/16(水) 13:32:44.58 ID:vjpqg3x7(1/2) AAS
>>40
40(3): デフォルトの名無しさん [] 2023/08/15(火) 16:29:06.61 ID:eu+UdA0l(1) AAS
このサイトより
外部リンク:agora.ex.nii.ac.jp
2023/8/1/0/0 から 2023/8/16/23/0 まで
表示日時を変更しながら1時間毎の静止気象衛星画像(地球)を収集し
(衛星画像 は 可視光 2048x2048 程度 512x512 等も可 起動オプションで指定出来るとボーナス特典)
gif animation または png animation ファイルに変換せよ


8/14/0/0 画像リンク

8/15/0/0 画像リンク

8/15/15/0 画像リンク
bash、curl および GraphicsMagick の convert コマンドを使用。動作確認したOSはUbuntu 20.04LTS。数百枚のjpegからgifへのconvertには多少時間がかかります。
オプション -h または --highres を指定すると 2048x2048、オプション無しあるいは -l または --lowreso を指定すると 512x512、なおボーナスはスイス銀行の秘密口座に。
※見易くするためインデントは全角スペースに置換してあります。8月16日23時まで取得するようにしているがまだ無い将来の画像は含まない。

res='512x512' # default
OPT=`getopt -o hl -l highreso,lowreso -- "$@"`
eval set -- "$OPT"
while true; do
 case "$1" in
  -h | --highreso)
   res='2048x2048'
   shift ;;
  -l | --lowreso)
   res='512x512'
   shift ;;
  --)
   shift
   break ;;
 esac
done
dir=$(mktemp -d TmpDir.XXXXXX)
for d in $(seq -w 01 16); do
 for h in $(seq -w 0 23); do
  dh="$d$h"
  file="HMW92308${dh}.globe.1.jpg"
  url="外部リンク:agora.ex.nii.ac.jp
  echo $url; curl -f -s -R -o "$dir/$file" $url
 done
done
#set -x
time convert $(ls $dir/*.jpg) TyphoonAime${res}.gif
ls -o TyphoonAime${res}.gif
44: 9 [sage] 2023/08/16(水) 13:42:58.39 ID:vjpqg3x7(2/2) AAS
>>43 typo orz
-h または --highres

-h または --highreso
45: 9 [sage] 2023/08/16(水) 19:12:35.95 ID:y9YJABkH(1) AAS
>>43 これだと、scriptを実行するたびに全てのjpegファイルをtemporaryディレクトリにdownloadするためサーバの負荷の面で行儀がよくないので、
 ディレクリは TyphoonJpegDir512x512 または TyphoonJpegDir2048x2048 で固定とし、未取得のjpegがあればdownloadするように直すわ。

res='512x512' # default
OPT=`getopt -o hl -l highreso,lowreso -- "$@"`
eval set -- "$OPT"
while true; do
 case "$1" in
  -h | --highreso)
   res='2048x2048'
   shift ;;
  -l | --lowreso)
   res='512x512'
   shift ;;
  --)
   shift
   break ;;
 esac
done
dir=./TyphoonJpegDir${res}
for d in $(seq -w 01 16); do
 for h in $(seq -w 0 23); do
  file="HMW92308${d}${h}.globe.1.jpg"
  url="外部リンク:agora.ex.nii.ac.jp
  [ -f $dir/$file ] || { echo $url; curl -f -s -R -o "$dir/$file" $url; }
 done
done
#set -x
time convert $(ls $dir/*.jpg) TyphoonAime${res}.gif
ls -o TyphoonAime${res}.gif

※見やすくするためインデントは全角スペースに置換してあります。
89: 9 [sage] 2023/09/22(金) 16:53:16.55 ID:8M97O6g7(1) AAS
>>85
85(5): デフォルトの名無しさん [sage] 2023/09/20(水) 14:42:58.26 ID:I55f6i4N(1/2) AAS
お題
abc1.mp4 abc2.mp4 .. abc20.mp4があるとします
これを名前順でソートできるようにするため
abc001.mp4 abc002.mp4 ... abc020.mp4
とリネームしてください
Perl5

rename "abc$_.mp4", sprintf 'abc%03d.mp4',$_ for 1..20;

※abc1.mp4 abc2.mp4 .. abc20.mp4 があるとしています。
 また abc001.mp4 abc002.mp4 ... abc020.mp4 は既存かのチェックは省いています。
121
(1): 9 [sage] 2023/10/08(日) 20:24:03.46 ID:zYJ3wh+h(1) AAS
>>120
120(1): デフォルトの名無しさん [sage] 2023/10/08(日) 19:28:55.20 ID:faQf3SiN(1) AAS
お題:n階建てのビルに定員4人のエレベーターがある。エレベーターは各階でボタンが押されるとその階に向かう。住人達はエレベータを呼んで乗るとエレベーター内で次に向かう階へのボタンを押す。ボタンを押すのは乗員全員である。乗るのを待っている住人が定員より多かった場合、エレベーターは乗れなかった住人を優先的に回収する。住人は列の先頭から順番にエレベーターに乗り込む。エレベーターは乗員を降ろしている間に住人を追加で乗せることはなく、すべての乗員を降ろしてから次の住人の回収に向かうものとする。

もっとも効率がいいエレベーターの停止順序を求め、入力に対して停止階のリストを出力せよ。
エレベーターの初期位置は1階とする。

入力
階数
乗員数 住人たちがいる階 乗員iが向かう階 乗員iが向かう階 …
5
1 1 5
2 4 3 2
3 2 1 3 5

出力
停止階 停止階 …
1 5 4 3 2 1 3 5

入力
10
5 1 1 2 3 4 4
9 4 10 10 10 1 8 6 6 6 5

出力
1 2 3 4 1 4 1 10 4 6 8 4 5
「もっとも効率がいいエレベーターの停止順序」とは?
1.停止回数がもっとも少ない
2.移動した階数の和が最も小さい
3.ほか
など、どのような指標?
188
(1): 9 [sage] 2024/01/16(火) 02:37:52.68 ID:SfyAs2IF(1/2) AAS
>>187
187(17): デフォルトの名無しさん [] 2024/01/16(火) 00:33:05.98 ID:n8j0XaXx(1) AAS
お題:時刻の文字列が与えられる。その時刻から1秒後の時刻を出力せよ。


入力:00:00:00
出力:00:00:01
入力:23:59:59
出力:00:00:00
 Perl5

use Time::Piece;
use Time::Seconds;
for (qw{00:00:00 23:59:59}) {
 $t = Time::Piece->strptime($_, '%T') + 1;
 print "入力:$_\n出力:", $t->strftime('%T'), "\n";
}

※見易くするためインデントを全角スペースに置換してあります

実行結果
~ $ perl 22_187_1秒後.pl
入力:00:00:00
出力:00:00:01
入力:23:59:59
出力:00:00:00
189: 9 [sage] 2024/01/16(火) 02:38:47.78 ID:SfyAs2IF(2/2) AAS
>>188

use Time::Seconds;
これ要らなかった…orz
216: 9 [sage] 2024/02/04(日) 16:39:59.23 ID:jTY6zdRX(1/2) AAS
>>208
208(2): デフォルトの名無しさん [sage] 2024/02/02(金) 10:53:02.58 ID:fEMhv+T7(2/2) AAS
>>207の動作確認用追加分

use std::collections::HashMap;
use itertools::Itertools;

fn main() {
 let input = [
  "a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2",
  "a3=a4", "c3=c4", "e1=e3", "a2=a4", "c3=c1",
  "b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"
 ];
 let output = [
  vec!["a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4"],
  vec!["c1", "c2", "c3", "c4", "d1", "d2", "d3"],
  vec!["e1", "e2", "e3"]
 ];
 assert_eq!(foo(&input), output);
}
Perl5

use feature qw{:5.16 signatures};
no warnings qw(experimental::signatures);
@s = qw[a1=a2 b1=b2 b3=b2 c1=c2 e1=e2 a3=a4 c3=c4 e1=e3 a2=a4 c3=c1 b3=a4 c2=d1 a4=a5 d2=c1 b4=b3 d3=c3];
for (map{[sort /(\w+)=(\w+)/]} @s) {
 ($l, $r) = @$_;
 $g{$r} //= $g{$l} //= $g{$r} // $l;
 $h{$g{$r}} = $g{$l} if $g{$l} ne $g{$r};
}
$h{$k} = sub($e){$h{$e} ? __SUB__->($h{$e}) : $e}->($v) while ($k, $v) = each %h;
$g{$_} = $h{$g{$_}} // $g{$_} for keys %g;
push @{$r{$v}}, $k while ($k, $v) = each %g;
say "@$_" for values %r;

※見易くするためインデントを全角スペースに置換してあります

実行結果
$ perl 22_206_grouping.pl
b3 a3 a5 b4 a4 a1 b1 a2 b2
c1 d1 d3 c3 c2 d2 c4
e3 e1 e2
217: 9 [sage] 2024/02/04(日) 18:22:17.66 ID:jTY6zdRX(2/2) AAS
>>208 宛てじゃなかった
>>206
206(23): デフォルトの名無しさん [] 2024/02/02(金) 06:41:15.23 ID:CC6U77IS(1) AAS
お題
入力データをグループ分けして出力せよ

入力データの、= の左右は同じグループである。
出力する順番は、入力データの出現順とする

UnionFind を使えば良いかも

入力データ
["a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2",
"a3=a4", "c3=c4", "e1=e3", "a2=a4", "c3=c1",
"b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"]

出力
[["a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4"],
["c1", "c2", "c3", "c4", "d1", "d2", "d3"],
["e1", "e2", "e3"]]

Ruby で、UnionFind を自作してみた。
下はユニットテストです

外部リンク:paiza.io
外部リンク:paiza.io
の回答だったわ… orz
241
(1): 9 [sage] 2024/02/16(金) 02:56:10.41 ID:7jtCAGu+(1/2) AAS
>>234
234(27): デフォルトの名無しさん [sage] 2024/02/14(水) 09:32:06.19 ID:JjlrBdlD(1) AAS
お題:数値が入力されるのでその数値に最も近い回分数を出力せよ
回分数とは回分になっている数(負数含まず)のことである
最も近い回分数が2つある場合は2つとも出力せよ

入力 0
出力 0

入力 17
出力 22

入力 100
出力 99
出力 101
Perl5

for $n (0,17,100,123459321) {
 my %a;
 for (0..$n) {
  $i = $n - $_;
  $a{$i} = $i if 0 <= $i and $i =~ /^((\d)(?1)\2|\d?)$/;
  $j = $n + $_;
  $a{$j} = $j if $j =~ /^((\d)(?1)\2|\d?)$/;
  last if keys %a;
 }
 @a = keys %a;
 print "$n -> @a\n";
}

※見やすくするためインデントを全角スペースに置換してあります。

実行結果

$ perl 22_234_palindromic_number.pl
0 -> 0
17 -> 22
100 -> 99 101
123459321 -> 123464321 123454321
242: 9 [sage] 2024/02/16(金) 03:13:10.80 ID:7jtCAGu+(2/2) AAS
>>241

  last if keys %a;
 }
 @a = keys %a;



  last if @a = keys %a;
 }

とコンパクトに書けるんだった、まぁいいや
243
(1): 9 [sage] 2024/02/16(金) 14:47:55.29 ID:TIAwaOOw(1) AAS
>>234 Perl5、小さい方の検索は0で止まるので負の値を避ける必要はなかった、書き直し。

$r = qr/^((\d)(?1)\2|\d?)$/;
for $n (0,17,100,123459321) {
 my %a;
 for (0..$n) {
  $a{$n - $_} = 1 if ($n - $_) =~ $r;
  $a{$n + $_} = 1 if ($n + $_) =~ $r;
  last if @a = keys %a;
 }
 print "$n -> @a\n";
}
246
(1): 9 [sage] 2024/02/17(土) 02:10:36.54 ID:K8P5qDCx(1) AAS
>>234 Python3

def f(k):
  s = str(k)
  return s == s[::-1]
for n in [0, 17, 100, 123459321]:
  l = set()
  for i in range(n + 1):
    if f(n - i): l.add(n - i)
    if f(n + i): l.add(n + i)
    if l:
      print(n, l)
      break

※見易くするためインデントは全角空白に置換してあります

実行結果

$ python3 22_234_palindromic_number..py
0 {0}
17 {22}
100 {99, 101}
123459321 {123454321, 123464321}
263: 9 [sage] 2024/02/20(火) 17:18:07.59 ID:X5uoFLgg(1) AAS
「どんなテストしたの?」
って質問だよ
362: 9 [sage] 2024/06/11(火) 14:41:10.23 ID:NjINqn/m(1) AAS
>>348
348(5): デフォルトの名無しさん [sage] 2024/06/01(土) 10:16:34.91 ID:hzaQXY32(1/2) AAS
お題: コロン区切りの時分秒の時刻が与えられるので時分秒をそれぞれ掛け算した結果を表示せよ

例:
04:05:06
120
Perl5

($x = '04:05:06') =~ s/:/*/g;
print eval $x;
363
(3): 9 [sage] 2024/06/13(木) 14:34:57.00 ID:XgNTPGgf(1/3) AAS
>>349
349(4): デフォルトの名無しさん [sage] 2024/06/01(土) 11:08:12.83 ID:hzaQXY32(2/2) AAS
お題: バイト列が与えられる。先頭から解析した場合にバイトが1だったら次の4バイトを読み込んで整数として出力し、バイトが2だったら次のバイトを0が来るまで読み込んで文字列として出力せよ

入力
1 1 0 0 0 2 65 66 67 0 1 128 0 0 0

出力
1ABC128
> 「バイトが1だったら次の4バイトを読み込んで整数として出力し、」
正直、意味がわからんかった

例で見ると
1 1 0 0 0 → 1
1 128 0 0 0 → 128
ということだが

1に続く4バイトを加算して出力するって意味だったのかいな
368: 9 [sage] 2024/06/13(木) 17:03:39.85 ID:XgNTPGgf(2/3) AAS
>>365
365(2): デフォルトの名無しさん [sage] 2024/06/13(木) 14:54:19.57 ID:lNMgjwmg(1/2) AAS
>>363
出題者がエンディアンを知らなくて説明もなくリトル環境を前提にしてしまっている
エンディアンを知っている人たちは出題には書かれてないけど例よりリトル前提だと読み取ってこたえている
ああそういうことか「4バイトを読み込んで整数」と書いてあるのはそういう意味だったのか
ならわかるかも。
オレは4バイト一個一個が整数だと捉えて、それを「4バイトを読み込んで整数」とは何のこっちゃと?になってたわ
369: 9 [sage] 2024/06/13(木) 17:07:01.55 ID:XgNTPGgf(3/3) AAS
すまんね68系で育ったもんですぐ連想できなんだ
483
(1): 9 [sage] 2025/01/20(月) 01:11:38.35 ID:zWVP8H/r(1) AAS
>>474
474(4): デフォルトの名無しさん [] 2025/01/04(土) 21:19:41.74 ID:uiECOsgP(2/2) AAS
お題
貨幣・銀行券を次の文字列で表すとします
(1)
(5)
(10)
(50)
(100)
(500)
[1000]
[5000]
[10000]

貨幣・銀行券がランダムに次のような文字列で与えられます
(100)(10)(1)[10000](5)(500)[1000][5000][1000][1000](10)(100)(50)(100)[1000]

与えられた貨幣・銀行券を分類して貨幣・銀行券の価値が高い順に次のように出力するプログラムを作成してください
[10000]
[5000]
[1000][1000][1000][1000]
(500)
(100)(100)(100)
(50)
(10)(10)
(5)
(1)
Perl5

$s = '(100)(10)(1)[10000](5)(500)[1000][5000][1000][1000](10)(100)(50)(100)[1000]';
$h{$_} .= $_ for $s =~ /\(\d+\)|\[\d+\]/g;
use List::Util 'sum';
$v{$h{$_}} = sum($h{$_} =~ /\d+/g) for keys %h;
print "$_\n" for sort{$v{$b} <=> $v{$a}} keys %v;

実行結果
~ $ perl 22_474_value.pl
[10000]
[5000]
[1000][1000][1000][1000]
(500)
(100)(100)(100)
(50)
(10)(10)
(5)
(1)
484: 9 [sage] 2025/01/21(火) 02:09:25.80 ID:Kvjf8jsk(1) AAS
>>483 Perl5

$_ = 'abc def ghi';
print join(' ' x 4, split) . "\n";
491: 9 [sage] 2025/01/24(金) 01:44:22.46 ID:p08ruAfw(1) AAS
>>485
485(20): デフォルトの名無しさん [] 2025/01/22(水) 21:35:12.82 ID:JtEnwxKE(1) AAS
お題

文字列と長さを入力として受け取り
デカルト積のリストを出力してください

入力:ABC 1
出力:[A, B, C]

入力:ABC 2
出力:[AA, AB, AC, BA, BB, BC, CA, CB, CC]

入力:ABC 3
出力:[AAA, AAB, AAC, ABA, ABB, ABC, ACA, ACB, ACC, BAA, BAB, BAC, BBA, BBB, BBC, BCA, BCB, BCC, CAA, CAB, CAC, CBA, CBB, CBC, CCA, CCB, CCC]
 Perl5

for $n (1..3) {
 @cp = @s = qw(A B C);
 while(--$n) { @cp = map{ $p = $_; map{ "$p$_" } @s } @cp }
 print "@cp\n";
}

※見易くするためインデントは全角スペースに置換してあります

実行結果
~ $ perl 22_485_CartesianProd.pl
A B C
AA AB AC BA BB BC CA CB CC
AAA AAB AAC ABA ABB ABC ACA ACB ACC BAA BAB BAC BBA BBB BBC BCA BCB BCC CAA CAB CAC CBA CBB CBC CCA CCB CCC
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.047s