プログラミングのお題スレ Part22

2023/08/09(水) 12:27:32.68ID:ZMLVZrF/
無駄に比較回数が増えるsortを使っている>>13>>14は不正解
単純にminが正解
17デフォルトの名無しさん
垢版 |
2023/08/10(木) 13:37:16.01ID:YYBOmFjO
>>3
Perl
https://paiza.io/projects/05DzwASHT6-4bVjpenNDBQ
2023/08/10(木) 19:00:30.10ID:kqXaMgBC
お題: ちょっとした画像処理。

赤い丸がいくつか描画された不透明な画像ファイル「input.png」を読み込んで、赤い丸を緑の丸に描き変えたものを画像ファイル「output.png」に保存するプログラム。

ここに「赤い」とは、HSV色空間において、色相が0度~60度か300度~360度の範囲にあり、彩度が30%以上で、明度が50%以上の色であると定義する。
「丸」とは、円形度が0.7~1.3の範囲の単一色の図形であると定義する。
「緑」とはRGBで#008000の色であると定義する。
2023/08/10(木) 19:03:42.87ID:0ymjHRaX
絶対自分でやる気ないお題出すな
2023/08/10(木) 19:07:41.57ID:yqkCXlxz
>>6
>>15
同じ言語とは思えないほど違うな
2023/08/10(木) 21:44:28.63ID:4K08AJqU
>>16
このスレで正解とか不正解とか言ってる時点で不正解
2023/08/11(金) 00:03:07.62ID:6txSsch+
>>16
head , sort で無駄ソートは起こらない
minimumByと最大2倍程度の差しか発生しない

https://hackage.haskell.org/package/base-4.18.0.0/docs/src/Data.OldList.html#sort
2023/08/11(金) 00:37:49.70ID:NzWkf1P2
今回のようなsortを一切必要としない問題で何度もsortを用いるプログラマーは劣等生
2023/08/11(金) 00:43:13.53ID:0bfZQT9B
>>23
Haskellのhead . sortはソートしないってのに
sortって書いてあるからソートすると思ってるんやろ?
2023/08/11(金) 01:09:02.59ID:NzWkf1P2
sortを使うことを問題にしているのであって
sortしていないなら問題ないだろう
個別の話などしていない

そこまで言うならとHaskellのプログラム
>>13を見にいってみたが
入力文字列を各文字でソートして重複を取り除いてabcdefghijklmnopqrstuvwxyzと比較しているのか

hasAllAlph = ( == [ 'a' .. 'z' ] ) . tail . nub . sort . map toLowOrSp . ( ' ' : )
269
垢版 |
2023/08/11(金) 02:38:50.64ID:4P/NDj/+
スレが伸びているので何かと思えば、オレほか一部の回答者が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.
2023/08/11(金) 02:52:08.14ID:45O+1i6X
そう、haskellの評価戦略はcall by need (の一種) で必要に応じて展開される、head . sort では 「sortした後の最初の項」を求めているのでそれを出すための必要最小限の事しかしない

件のData.Listにおけるsortでは
①与えられた列を1回目のバスで広義単調増大列いくつかに分割する、コストはO(n)
②できた列を2つずつマージして広義単調増大列の個数を半分にする、全部やればコストはO(n)
③②を列の数が1になるまで繰り返す、コストはO(log(n))
で全部の処理を要求してもO(nlog(n))でいわゆるクイックソートと同じコスト
しかしheadがこのsortの処理を呼ぶ時にはmergeする2列の中の最小値だけ残されてあとは捨てられる、なので最初の①の結果が最悪のケース、長さ1の列がn個できた場合でもmerge処理は最大n-1回だけ行われて終了する、すなわち事実上minimumと一緒
じゃあminimumBy ( on length )でいいじゃんという話なのだけど「遅延評価を利用すればほとんどコストレスでminimumByと同様の事ができる」というのがHaskellの面白いところ
なのでそっちを採用
これは遅延評価の文化に慣れてないと中々わからない
2023/08/11(金) 07:58:17.97ID:vOTsx3Ge
>>25
そちらのsortはO(nlog(n))なのでダメですね
299
垢版 |
2023/08/11(金) 08:37:47.88ID:4P/NDj/+
O(nlog(n))がダメかどうかは、データの規模および実行時間による
2023/08/11(金) 09:12:59.75ID:BG0MJIEb
あかん、通じてないね
時間の無駄やった
2023/08/11(金) 09:22:47.99ID:HI+ykM5H
Perlな人の短く書ければよいだけで計算量とか知らないだろうから仕方ないと思うよ
しかしHaskellな人がsortを何箇所も使っているのは驚いた
head . sort以外のsortはあかんね
32デフォルトの名無しさん
垢版 |
2023/08/11(金) 09:27:54.00ID:vdwKG93K
お前ら賢いんだから自分も疑え
33デフォルトの名無しさん
垢版 |
2023/08/11(金) 14:03:26.02ID:v1edpQDw
doubt
3417
垢版 |
2023/08/11(金) 16:34:17.24ID:j3k4ZyED
俺は Perl で書いたやつも sort 使わず >>4,5 と同じやり方にした。
一番短い文を最後に出すだけで良いなら sort やる必要ないよね。
何らかの制約があってそうしなければ出来ないとか、使っても思い切り最適化されて最終的に同じ動きになるというなら使うかも知れないが。
35デフォルトの名無しさん
垢版 |
2023/08/11(金) 17:25:08.27ID:I5t9Gg6x
遅延評価は馴染みない人にはわからんからしょうがない
2023/08/11(金) 17:41:01.68ID:Nevl7mZs
Haskell版で問題にされてるのは
遅延評価でO(n)となるhead $ sort部分ではなく
O(nlog(n))のsortが別途あること
2023/08/11(金) 22:35:55.39ID:H5Y2+fuz
>>35
遅延評価は色んな言語にあるよ
その対象や動作は各言語や各機能によって様々で
PromiseやFutureのような非同期に遅延評価されるものもあるけど
今回のお題だとC#のLINQメソッドチェーンによる遅延評価やRubyのlazy指定などが有効だね
>>15のRustのイテレータメソッドチェーンも遅延評価されるから何万行の入力が来てもメモリを消費せずに済むね
38デフォルトの名無しさん
垢版 |
2023/08/14(月) 19:55:41.01ID:KSpEuPpD
マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ
マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ
マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ
マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ

ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ
ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ
ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ
ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ

マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ
マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ
マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ
マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ

ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ
ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ
ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ
ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ
39デフォルトの名無しさん
垢版 |
2023/08/14(月) 20:16:21.84ID:29MXQOm3
>>38
Java

public class Main {
 public static void main(String[] args) {
  System.out.println(
    "マサナヲ".repeat(8).concat("\n").repeat(4).concat("\n")
      .concat("ヲナサマ".repeat(8).concat("\n").repeat(4).concat("\n"))
      .repeat(2));
 }
}
40デフォルトの名無しさん
垢版 |
2023/08/15(火) 16:29:06.61ID:eu+UdA0l
このサイトより
http://agora.ex.nii.ac.jp/digital-typhoon/
2023/8/1/0/0 から 2023/8/16/23/0 まで
表示日時を変更しながら1時間毎の静止気象衛星画像(地球)を収集し
(衛星画像 は 可視光 2048x2048 程度 512x512 等も可 起動オプションで指定出来るとボーナス特典)
gif animation または png animation ファイルに変換せよ


8/14/0/0 http://agora.ex.nii.ac.jp/digital-typhoon/globe/color/2023/512x512/HMW923081315.globe.1.jpg
8/15/0/0 http://agora.ex.nii.ac.jp/digital-typhoon/globe/color/2023/512x512/HMW923081415.globe.1.jpg
8/15/15/0 http://agora.ex.nii.ac.jp/digital-typhoon/globe/color/2023/512x512/HMW923081505.globe.1.jpg
2023/08/15(火) 23:36:55.46ID:GhE5EH0z
蟻人間がコテハン外したのかな
2023/08/16(水) 10:34:21.25ID:tgyEZLGb
可視光より赤外線の方が雲はきれいだけど
可視光は影が毎日くるくる回るからこっちはこっちで面白いね
439
垢版 |
2023/08/16(水) 13:32:44.58ID:vjpqg3x7
>>40 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="http://agora.ex.nii.ac.jp/digital-typhoon/globe/color/2023/${res}/${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
449
垢版 |
2023/08/16(水) 13:42:58.39ID:vjpqg3x7
>>43 typo orz
-h または --highres

-h または --highreso
459
垢版 |
2023/08/16(水) 19:12:35.95ID:y9YJABkH
>>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="http://agora.ex.nii.ac.jp/digital-typhoon/globe/color/2023/${res}/${file}"
  [ -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

※見やすくするためインデントは全角スペースに置換してあります。
4617
垢版 |
2023/08/17(木) 00:52:29.22ID:YACPkQ1f
>>40
Kotlin

ただし paiza.io のサイトの都合で大きい画像の出力がうまく行かないのと時間が掛かるとタイムアウトしてしまうので、
それらを避けるために 2023/08/15~2023/08/16 の8時間間隔(0, 8, 16 時)の画像を収集して 120x120 の大きさに
変更してアニメーションGIFにして出力するようにした。その時に HTML で <img src="data:image/gif;base64,...">
で埋め込んでいるのでHTMLモードで表示させるとブラウザに画像が表示される。スマホでも見てみたがちゃんと
動いている画像で表示された。

https://paiza.io/projects/w-fOIVbPGuSPh1_DJTSatA
2023/08/18(金) 10:27:20.40ID:Rd3M1fjh
可視光は globe.0 だな
しかも夜のデータ無いやん
2023/08/18(金) 11:07:33.13ID:wx26N4AH
>>40
UTC で答えてる人が多いみたいだけど
>例
>8/14/0/0 http://agora.ex.nii.ac.jp/digital-typhoon/globe/color/2023/512x512/HMW923081315.globe.1.jpg
JST ですよね
49デフォルトの名無しさん
垢版 |
2023/08/18(金) 17:11:49.56ID:TT1gR8pP
過去未来100年(幅201年)の範囲で
2023年とカレンダーの曜日が一致する年を全て出力せよ
また任意の指定年の前後100年で同じ動作をする(閏年も考慮)ように改変せよ
50デフォルトの名無しさん
垢版 |
2023/08/18(金) 20:03:41.92ID:Bxqhk529
>>49
R
https://ideone.com/keSaYi
51デフォルトの名無しさん
垢版 |
2023/08/19(土) 00:14:13.53ID:Za4r2XUP
>>50
曜日をわざわざ求める必要はなかったな。
R 
https://ideone.com/1Zh5wd
2023/08/19(土) 02:12:13.34ID:7swIlm9f
6,11,11,6,11,11,・・・なんでこうなうの?
2023/08/19(土) 10:40:53.03ID:7swIlm9f
>>48
JSTだとしたら
>8/15/15/0 http://agora.ex.nii.ac.jp/digital-typhoon/globe/color/2023/512x512/HMW923081505.globe.1.jpg

8/15/14/0
じゃないかな
夏時間?
54デフォルトの名無しさん
垢版 |
2023/08/20(日) 20:19:24.17ID:T0IVLETo
>>52
365と366を7で割った余りは1と2なので、平年には翌年の元日の曜日が1つ進み、閏年には2つ進む。
100の倍数の年の例外を除けば、曜日の進みは1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, ...のように
1, 1, 1, 2というパターンの繰り返しになる。

パターン1, 1, 1, 2のうちの最初の1の年から始めて、何年後に曜日の進みの累積が7の倍数かつ
その年が閏年でなくなるかを順々に求めれば6, 11, 11年後となり、ここでパターン1, 1, 1, 2の
うちの最初の1の年に戻るので、以降は6, 11, 11年後というパターンの繰り返しになる。

      ┌──────────┐
      │          ↓
@@@❷@@@❷@@@❷@@@❷@@@❷@@@❷@@@❷@@@❷
│     ↑          │          ↑
└─────┘          └──────────┘
2023/08/20(日) 21:28:53.42ID:KEiNPJgB
お題: お風呂の準備。

容積225Lの浴槽に適温39度のお湯200Lを用意したい。
次の2つのスイッチのON/OFFを切り替えてお湯を用意するプログラムを作れ。

スイッチ1: これをONにすると浴槽に水温20度の水を分速10Lで投入する。
スイッチ2: これをONにすると浴槽の水を800ワットの電熱線で加熱する。

ただし、浴槽に容積の1/2以上の水またはお湯が入っていないときは、空焚き防止のため、加熱しないものとする。
放熱は考慮しなくてもよい。

出力例)
時刻??: スイッチ1をONにしました。
時刻??: スイッチ2をONにしました。
時刻??: お風呂ができました。
時刻??: スイッチ1をOFFにしました。
時刻??: スイッチ2をOFFにしました。
5617
垢版 |
2023/08/20(日) 22:57:39.22ID:pbHEs6OP
>>49
Kotlin

折角なので Iterator で作った。(でも AbstractIterator クラス使ったので特に苦労はしていない)

https://paiza.io/projects/v1X96MyvBFn0N4z9X-9gkw
5717
垢版 |
2023/08/20(日) 23:07:16.25ID:pbHEs6OP
>>55
800Wの電熱線で加熱するとどれだけの量の水がどのぐらいの時間で1度上がるか、など、基本的な事が分からない。
2023/08/21(月) 05:17:48.42ID:9NybdpKD
>>56
200年分のデータを配列を貯め込む>>51の方法よりも
そのようなメモリ消費を必要としないイテレータを作る案は好ましい方法ですね

しかし-100や+100は今回たまたまのマジックナンバーに過ぎないですし
例えばお題が「指定した年とその後(またはそれ以前に)同じカレンダーになる年を100個求めよ」もありえます

したがって作成しておくべき汎用イテレータは指定した年から順方向に返すイテレータと逆方向に返すイテレータでしょう
それがあれば今回のお題を含めた様々なバリエーションのお題に対応できると思います
59デフォルトの名無しさん
垢版 |
2023/08/21(月) 10:53:53.65ID:qNeGin4f
>>58へのお題
指定した年とその後(またはそれ以前に)同じカレンダーになる年を100個求めよ
2023/08/21(月) 12:55:28.09ID:tqXtwiP4
// Rust 双方向イテレータ版
struct SameCalendarYear(u32);
impl Iterator for SameCalendarYear {
 type Item = u32;
 fn next(&mut self) -> Option<u32> {
  common_next(self.0, false).map(|year| { self.0 = year; year })
 }
}
impl DoubleEndedIterator for SameCalendarYear {
 fn next_back(&mut self) -> Option<u32> {
  common_next(self.0, true).map(|year| { self.0 = year; year })
 }
}

fn common_next(start_year: u32, is_before: bool) -> Option<u32> {
 let mut day = 0;
 let mut year = start_year;
 while year > 0 {
  if is_before { year -= 1; }
  day += 1 + leap(year);
  if day >= 7 { day -= 7; }
  if !is_before { year += 1; }
  if day == 0 && leap(year) == leap(start_year) {
   return Some(year);
  }
 }
 None
}

fn leap(year: u32) -> u32 {
 (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) as u32
}
2023/08/21(月) 12:57:26.59ID:tqXtwiP4
>>59
指定した年と同じカレンダーの年を前後 n 個表示
(長くなるので今回は10個だけ表示)

fn main() {
 let n = 10;
 for year in [2000, 2023, 2024, 2025, 2100] {
  println!("{year}年より前: {:?}", SameCalendarYear(year).rev().take(n).collect::<Vec<_>>());
  println!("{year}年より後: {:?}", SameCalendarYear(year).take(n).collect::<Vec<_>>());
 }
}

このRust公式の実行環境で実行やコード編集ができます
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=5e5a518120f75351ca5ff5fdd0bf4d8c

// 実行結果
2000年より前: [1972, 1944, 1916, 1876, 1848, 1820, 1780, 1752, 1724, 1684]
2000年より後: [2028, 2056, 2084, 2124, 2152, 2180, 2220, 2248, 2276, 2316]
2023年より前: [2017, 2006, 1995, 1989, 1978, 1967, 1961, 1950, 1939, 1933]
2023年より後: [2034, 2045, 2051, 2062, 2073, 2079, 2090, 2102, 2113, 2119]
2024年より前: [1996, 1968, 1940, 1912, 1872, 1844, 1816, 1776, 1748, 1720]
2024年より後: [2052, 2080, 2120, 2148, 2176, 2216, 2244, 2272, 2312, 2340]
2025年より前: [2014, 2003, 1997, 1986, 1975, 1969, 1958, 1947, 1941, 1930]
2025年より後: [2031, 2042, 2053, 2059, 2070, 2081, 2087, 2098, 2110, 2121]
2100年より前: [2094, 2083, 2077, 2066, 2055, 2049, 2038, 2027, 2021, 2010]
2100年より後: [2106, 2117, 2123, 2134, 2145, 2151, 2162, 2173, 2179, 2190]
2023/08/21(月) 15:10:32.39ID:GU1DZq8L
>>57
中学校の物理で習うはずなんだけどなあ。忘れたか。
https://chuugakurika.com/2017/10/24/post-155/
63デフォルトの名無しさん
垢版 |
2023/08/21(月) 22:02:18.08ID:s7o0Gu1A
>>59
R
https://ideone.com/1o1wp6
2023/08/24(木) 05:04:40.60ID:UkV1PQmo
お題:2Dゲームのスクロール処理
整数の二次元配列(高さ50, 横幅100)上にランダムに整数1〜9が200個配置される。
この配列を高さ20, 横幅40の矩形領域に切り取って表示したい。キーボードの入力(l, r, t, b)で矩形領域を移動させ切り取る領域を変化させよ。
65デフォルトの名無しさん
垢版 |
2023/08/24(木) 08:57:28.75ID:a6n854uv
>>64
試しに自分で書いてどんなプログラムになるのか見せてくれ
66デフォルトの名無しさん
垢版 |
2023/08/24(木) 22:51:17.82ID:hcnR5QOK
>>64
PowerShell (等幅フォント限定。最初は一番左上の領域が表示される。qキーで終了。Ubuntu版ではカーソルが消えない)

$a = random (1..9999) -count 200 |% {$_ % 9 + 1}
$b = random (0..4999) -count 200
$c = [char[][]](,(," " * 100) * 50)
0..199 |% {$c[[Math]::Floor($b[$_] / 100)][$b[$_] % 100] = [string]$a[$_]}
$L = 0..49 |% {-join $c[$_]}

$UI = $Host.UI.RawUI
$p, $s = $UI.CursorPosition, $UI.CursorSize
$p.y = [Math]::Min($p.y, $UI.BufferSize.Height - 23)
$x = $y = 0
$border = "+" + "-" * 40 + "+"
while ($true) {
   try {$UI.CursorSize = 0} catch {}
   $UI.CursorPosition = $p
   $border
   0..19 |% {"|" + $L[$y + $_].SubString($x, 40) + "|"}
   $border
   switch ($UI.ReadKey(6).Character) {
     "l" {if ($x -gt +0) {$x--}}
     "r" {if ($x -lt 60) {$x++}}
     "t" {if ($y -gt +0) {$y--}}
     "b" {if ($y -lt 30) {$y++}}
     "q" {try {$UI.CursorSize = $s} catch {} return}
   }
}
67デフォルトの名無しさん
垢版 |
2023/08/25(金) 00:19:01.99ID:P3glK3pZ
お題:ウィンドウのアラインメント処理
マウスの座標の変化からウインドウを描画すべき座標を計算したい。
ただし変形する形は縦横4方向、斜め4方向の8パターンとし、寄せた方向に幅が1/2となること。
68デフォルトの名無しさん
垢版 |
2023/08/25(金) 14:02:15.09ID:5+gJach+
>>64-65
OpenCVのROI便利だよな
2023/08/26(土) 14:14:02.40ID:EQIr/PqP
世界で最初の月曜日ってどうやって決まったの?
7017
垢版 |
2023/08/26(土) 14:42:38.00ID:Wr5tcJsi
曜日はシュメール人が使い始めたらしいので、お近くのシュメール人に聞きください。
2023/08/26(土) 20:03:48.42ID:LJcWLtrE
文字列Sの中に含まれる回文をすべて列挙ってどうやったらいいですかね(*_*)
aとかbみたいな一文字でも回文とみなしますです
文字列Sは1文字以上100文字以下で、半角英字であることがわかってます

とんでもない計算量になる気がするのですが、鮮やかなやりかたってないものかと…トホ(ヽ´ω`)
7217
垢版 |
2023/08/26(土) 22:26:37.90ID:Wr5tcJsi
>>71
それって例えば "ABCBAXYZZYX" だったら "ABCBA" と "XYZZYX" が抜き出せれば良いの?
途中の "BCB", "C", "YZZY", "ZZ" も抜き出すの?
2023/08/26(土) 23:04:31.69ID:JYg5slq9
回文の長さに制限があるから、回文の長さで場合分けすれば、全部列挙可能。
2023/08/26(土) 23:09:39.72ID:jGmIYD91
>>72
途中のもぜんぶっす…
含まれる回文、ひとつのこらず出力です(;´∀`)
たとえAとかBみたいな一文字でも回文と定義します

なのでAとかXも抜き出します٩(′д‵)۶
で、一文字目にAがあって、5文字目にもAがあるじゃないですか?こういった場合は、どっちも出力しちゃって大丈夫です!
重複された出力が行われるのは問題ないんです!
ただ、「過去にすでにその分の出力が行われていた場合、重複した出力を再度行わない」というやりかたでもし計算量が飛躍的に下がるということであれば、そのやりかたが知りたいというのもまああります(*_*;
重複する出力をするかしないか、それはどちらでもオケーです

全パターンチェックするようにループ回すならとりあえず理屈ではできると思うんですが、計算量がとんでもないことになりそうな感じで、ちょっとお手上げでした/(^o^)\
2023/08/26(土) 23:20:42.48ID:jGmIYD91
たとえば文字列Sがabbbaだとすると、すくなくともa,b,bb,bbb.abbbaが最低一回は出力される必要があります

できればaやbが複数回出力されず一回しか出力されないほうがいいですが、必須ではないです
2023/08/26(土) 23:29:51.32ID:JYg5slq9
>>71 C++
#include <stdio.h>
bool is_kaibun(const char *str, size_t len)
{
for (size_t i = 0; i < len/2; i++)
if (str[i] != str[len - i - 1]) return false;
return true;
}
void detect_kaibun(const char *str, size_t len)
{
for (size_t klen = 1; klen <= len; klen++)
{
for (size_t i = 0; i < len - klen + 1; i++)
if (is_kaibun(str + i, klen))
printf("%*s\n", (int)klen, str + i);
}
}
int main(void)
{
detect_kaibun("ABCBCXC", 7);
return 0;
}
2023/08/26(土) 23:37:32.47ID:JYg5slq9
>>76 間違えた。
printf("%*s\n", (int)klen, str + i);

printf("%.*s\n", (int)klen, str + i);
に訂正。
2023/08/26(土) 23:40:14.43ID:jGmIYD91
>>77
ありがとうございます、ちょっとためしてみますm(_ _)m
2023/08/26(土) 23:44:49.05ID:M8vKemPr
連続部分列 https://en.m.wikipedia.org/wiki/Longest_palindromic_substring
部分列 https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2895
2023/08/27(日) 00:17:21.22ID:3rRjeZjU
>>77
動いている様子を確認させていただきました!!ありがとうございました!

当チケットはこれにてクローズとさせていただきたいと思いますヽ(=´▽`=)ノ
2023/08/27(日) 01:14:16.06ID:xDzSjAxc
>>76
こうすると計算量を減少できる

fn len_of_eq(s: &str, index: usize, even: usize) -> usize {
 let mut len = 0;
 for (p, q) in std::iter::zip(s[(index + even)..].chars(), s[0..=index].chars().rev()) {
  if p != q {
   break;
  }
  len += 1;
 }
 return len;
}

fn print_kaibun(s: &str) {
 for index in 0..s.len() {
  for even in 0..=1 {
   for len in 1..=len_of_eq(s, index, even) {
    let first = index + 1 - len;
    let last = index + len - 1 + even;
    println!("{first}~{last}: {}", &s[first..=last]);
   }
  }
 }
}

fn main() {
 print_kaibun("ABCBAXYZZYX");
}
2023/08/27(日) 01:16:42.56ID:xDzSjAxc
まずこの部分が最初のヒントで

>>それって例えば "ABCBAXYZZYX" だったら "ABCBA" と "XYZZYX" が抜き出せれば良いの?
>>途中の "BCB", "C", "YZZY", "ZZ" も抜き出すの?
>途中のもぜんぶっす…

最も長いものを抜き出せばその一部分はその中に含まれている
だから短いのが判明した時点で引き続き長いのも探索しないと多重に無駄に比較が行なわれてしまう

もう一つのポイントは回文は対称系で長さ奇数と偶数の二種類があること
長さ奇数「DCBABCD」と長さ偶数「DCBAABCD」どちらの場合も
比較は対称点となるAからのみ出発して比較していけばよくて
順方向&逆方向へ最長分を比較していけば上述の無駄な比較を減らせる

このような順番で見つかっていくことになる
>>81の実行結果
0~0: A
1~1: B
2~2: C
1~3: BCB
0~4: ABCBA
3~3: B
4~4: A
5~5: X
6~6: Y
7~7: Z
7~8: ZZ
6~9: YZZY
5~10: XYZZYX
8~8: Z
9~9: Y
10~10: X
8317
垢版 |
2023/08/27(日) 05:51:19.72ID:A+RJ0qtc
>>80
ここはお題スレなのでクローズはない。
8417
垢版 |
2023/09/07(木) 20:20:41.05ID:HlrfnodH
>>71
Kotlin
https://paiza.io/projects/qh3bysWxeqAkDEImg1ZyPw
2023/09/20(水) 14:42:58.26ID:I55f6i4N
お題
abc1.mp4 abc2.mp4 .. abc20.mp4があるとします
これを名前順でソートできるようにするため
abc001.mp4 abc002.mp4 ... abc020.mp4
とリネームしてください
2023/09/20(水) 18:43:20.77ID:DIo9fsPi
コレでどーかぬ

#!/bin/bash

# ファイル名のプレフィックス
prefix="abc"

# ソート対象のファイルリストを取得
file_list=$(ls ${prefix}*.mp4 | sort)

# ファイルを001、002、...の形式にリネーム
counter=1
for file in $file_list; do
new_name=$(printf "${prefix}%03d.mp4" $counter)
mv "$file" "$new_name"
counter=$((counter + 1))
done
2023/09/20(水) 18:50:38.69ID:I55f6i4N
いいだしっぺということで作ってきたら既に投稿が
printfするところは一緒ですね
bash,勉強になります

haskell
import Text.Printf
import System.IO
import System.Directory
import System.FilePath.Glob
import Data.List
import Control.Monad

kaku = ".mp4"
fn = "abc"
main = do
files <- glob (fn <> "*" <> kaku)
zipWithM_ (\a b -> renameFile a b) files (map f files)
where
f l =
let r1 = reverse $ takeWhile ((/=) '/') $ reverse l in
let r2 = (r1 \\ fn) \\ kaku in
fn <> printf "%03d" (read r2 :: Int) <> kaku
2023/09/22(金) 11:23:46.58ID:R2SvRL0Z
お題:celeronで快適に動作するwebブラウザを作れ
899
垢版 |
2023/09/22(金) 16:53:16.55ID:8M97O6g7
>>85 Perl5

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

※abc1.mp4 abc2.mp4 .. abc20.mp4 があるとしています。
 また abc001.mp4 abc002.mp4 ... abc020.mp4 は既存かのチェックは省いています。
2023/09/22(金) 17:31:41.64ID:fCKJ4NGF
すごい簡潔ですね!perlすごい
これはワンライナーではないのでしょうか
#!/usr/bin/perl
..
としてperl rename.plを動かすと動きました
ファイルはこれ(bash)で用意できます
for i in {1..20}; do touch abc$i.mp4; done
2023/09/22(金) 20:45:10.11ID:CSDqgjJn
tcsh のバヤイわこうかぬ
foreach i (`seq 1 20`) # 1から20までの数値を生成
# ファイル名を生成し、touchコマンドでファイルを作成
set filename = "abc$i.mp4"
touch $filename
end
9217
垢版 |
2023/09/24(日) 00:36:54.25ID:FZ40Ia2p
>>85
Kotlin
https://paiza.io/projects/GEok1uy5LzC9VB9ARGu4yg
9317
垢版 |
2023/09/24(日) 00:44:46.90ID:FZ40Ia2p
1~20を決め打ちして良いならもっと簡単にできたな。まあいいや。
2023/09/24(日) 01:16:14.31ID:nC1Pu7Ba
>>92
なかなかおもろいサイトやぬ
2023/09/24(日) 01:37:34.83ID:XDqOvN5B
>>85 haskellで再投稿
https://ideone.com/HHMuMT
96デフォルトの名無しさん
垢版 |
2023/09/26(火) 17:04:35.08ID:lhHS5sJh
お題:32ビット浮動小数点数のnextafter()
32ビット精度(IEEE754のbinary32)の変数aを
64ビット精度(IEEE754のbinary64)の変数bに代入する。
ここで、nextafterf(a, 0)やnextafterf(a, 正の無限)などに相当する操作を
bに対して行え(bを32ビット浮動小数点数に戻すのは無しで)。
操作結果のoverflowやunderflowは考慮しなくてもよい。
2023/09/27(水) 11:02:54.03ID:Jpj1XONB
お題:日本語の文章が入力されるので「、」をカンマに、「。」を改行に変換せよ
98デフォルトの名無しさん
垢版 |
2023/09/27(水) 11:36:52.67ID:uGji0T93
Python

s = input()
s = s.replace("、", ",")
s = s.replace("。", "\n")
print(s)
2023/09/27(水) 13:01:54.91ID:9Ywamwi5
Haskell

import Data.List.Utils

main = do
s <- getContents
putStrLn $ replace "。" "\n" $ replace "、" "," s
コンパイルはしてないので動かないかも
100デフォルトの名無しさん
垢版 |
2023/09/27(水) 20:48:13.39ID:hJUMqAFS
>>97
R
https://ideone.com/syZ9JI
2023/09/28(木) 08:18:15.29ID:q8VwFY1b
お題
文字列S=abcdefghij(10文字)が与えられて
配列[0,4,7]が与えられる
このときSの0番目を4番目、4番目を7番目、7番目を0番目に移動した文字列を出力するプログラムを書いてください
102デフォルトの名無しさん
垢版 |
2023/09/28(木) 09:17:20.57ID:iiudb0JA
>>101 lisp
https://www.ideone.com/pOwDJd
2023/09/28(木) 13:09:43.08ID:tckV2TlV
>>101 Ruby
文字列S='abcdefghij'
配列=[0,4,7]

文字列 = 文字列S.dup
配列.zip( 配列.rotate ).each{|i,j| 文字列[i] = 文字列S[j] }
puts 文字列
2023/09/28(木) 13:15:33.53ID:eLIN3EHU
お題: コンソールに指定したUTF-8文字列のQRコードを表示するプログラム。
105デフォルトの名無しさん
垢版 |
2023/09/28(木) 14:55:17.75ID:7+/lnWbq
use std::io::{stdin, Read};
use std::error::Error;
use qrcode::QrCode;

fn read() -> Result<String, Box<dyn Error>> {
Ok(stdin().lock().bytes().map(|c| c.expect("char") as char).collect())
}

fn main() -> Result<(), Box<dyn Error>> {
let qr = QrCode::new(read()?.as_bytes())?;
let s = qr.render().light_color(' ').dark_color('#').build();
println!("{}", s);
Ok(())
}
2023/09/28(木) 21:17:30.48ID:yc7Vl2N1
お題: 指定されたフォントのひらがなの各文字について
ひらがなの線に囲まれて閉じた領域の個数を調べ、最もその個数の多い文字ベスト3を出力せよ。
2023/09/28(木) 22:53:24.99ID:8VuS2PIw
自分でやれ
いやできないかすまん
108デフォルトの名無しさん
垢版 |
2023/09/28(木) 22:59:15.05ID:isk1iJ0r
pythonならcv2使ってやるかな
10917
垢版 |
2023/09/29(金) 10:58:18.12ID:eBy6R6wt
>>97
bash のコマンドラインで以下のように入力すると標準入力から入力して「、」が「,」に、「。」が改行に変換されて標準出力に出力される。
(起動する環境は bash でなければならないということはないと思うが、他のシェルは確認していない)。

sed 's/、/,/g;s/。/\n/g'

もちろん日本語入出力可能な端末を使用して、尚且つ sed がその入力をまともに受け付けてくれなければちゃんと動かない。
2023/09/29(金) 11:02:02.85ID:F8aJXNq9
お題: 指定されたフォントのひらがなの各文字について
ひらがなの線に囲まれて閉じた領域の面積を調べ、各文字毎にそれぞれの面積の順序を最も大きい物から順に出力せよ。
またその情報を元に輪郭のhierarchy情報をcv2で利用出来る形で出力せよ
111デフォルトの名無しさん
垢版 |
2023/09/30(土) 17:32:44.04ID:xxjzuZuq
お題
文字列が入力されます
赤と緑を入れ替えて
黒と白を入れ替えて
黄と青を入れ替えてください


入力: 緑のカバンに500万入れて白の紙で黄色のカバン言うて書きながら赤のカバン言いながら置いてくれたら俺黒のカバン言いながら取りに行くわ
出力: 赤のカバンに500万入れて黒の紙で青色のカバン言うて書きながら緑のカバン言いながら置いてくれたら俺白のカバン言いながら取りに行くわ
2023/09/30(土) 18:00:29.42ID:oqu6hf3+
>>111 node

const swap = (text, [w1, w2]) => text.split(w1).map(v => v.replaceAll(w2, w1)).join(w2)

const swapAll = (text, rules) => rules.reduce(swap, text)

const text = '緑のカバンに500万入れて白の紙で黄色のカバン言うて書きながら赤のカバン言いながら置いてくれたら俺黒のカバン言いながら取りに行くわ'

const rules = [['赤', '緑'], ['黒', '白'], ['黄', '青']]

const replaced = swapAll(text, rules)
// console.log(replaced)
console.log(replaced === '赤のカバンに500万入れて黒の紙で青色のカバン言うて書きながら緑のカバン言いながら置いてくれたら俺白のカバン言いながら取りに行くわ')
// true
113デフォルトの名無しさん
垢版 |
2023/09/30(土) 19:24:03.19ID:t2v1jL5l
>>111
R
https://www.ideone.com/FCPqvY
114デフォルトの名無しさん
垢版 |
2023/09/30(土) 20:00:09.54ID:iuoy3pEW
>>111 ウェブブラウザのJavaScript
https://pastebin.com/YvymwTeN

ユーザースクリプトの体裁で書いたけどブラウザーのConsoleでも動かせる
Firefox: Ctrl+Shift+K
Chrome: Ctrl+Shift+J
https://mevius.5ch.net/test/read.cgi/tech/1691038333/111 を開いてそこで実行
結果はレスに直接追記

重複がないからXPathのtranslate()でいけるな思った、それだけ
11517
垢版 |
2023/10/02(月) 01:36:39.53ID:hWT/DRlk
>>101
Kotlin
https://paiza.io/projects/95GuXcUyZr8AkmVsRESj5Q
11617
垢版 |
2023/10/02(月) 01:52:26.35ID:hWT/DRlk
>>104
1. qrencode というプログラムをインストールする。(例: RedHat系Linuxなら yum install qrencode)

2. qrencode で出力に ansi 等を指定して文字列で出力する。

例: qrencode -t ansi やっほー

3. 画面に出て来たQRコードをスマホで撮影する等して確認する。

4. 終わり。
2023/10/02(月) 11:46:19.28ID:0odvDMYE
>>116
よくできました
蟻ポイント30
118デフォルトの名無しさん
垢版 |
2023/10/06(金) 16:54:06.65ID:jg1c5xSH
[クライシスアクター」「豊島保養所」←画像検索&拡散!

他スレに丸ごとコピペよろしっく!!
ネットでできる反レプティリアン・反イルミ活動です!!!!!
動画サイトのコメ欄もねらい目だぞーーーー!!!!!!!
119デフォルトの名無しさん
垢版 |
2023/10/06(金) 16:54:28.09ID:jg1c5xSH
[クライシスアクター」「豊島保養所」←画像検索&拡散!

他スレに丸ごとコピペよろしく!!
ネットでできる反レプティリアン・反イルミ活動です!!!!!
動画サイトのコメ欄もねらい目だぞ!!!!!!!
2023/10/08(日) 19:28:55.20ID:faQf3SiN
お題: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
1219
垢版 |
2023/10/08(日) 20:24:03.46ID:zYJ3wh+h
>>120
「もっとも効率がいいエレベーターの停止順序」とは?
1.停止回数がもっとも少ない
2.移動した階数の和が最も小さい
3.ほか
など、どのような指標?
2023/10/09(月) 13:56:36.62ID:V7NN5mnX
>>121
2.移動した階数の和が最も小さい
123デフォルトの名無しさん
垢版 |
2023/10/09(月) 19:10:41.03ID:5dE8x2G+
>>85
C#
https://paiza.io/projects/q-lUy-6voRo_XdJfyAdw6A
124デフォルトの名無しさん
垢版 |
2023/10/09(月) 22:18:18.11ID:5dE8x2G+
>>111
C#
https://paiza.io/projects/WbaYdgONPOZUKqB_TVkNbw?language=csharp
2023/10/12(木) 11:02:46.67ID:u59ybXeV
スイカゲームを自動操縦するプログラムを造れ
2023/10/12(木) 12:31:12.32ID:hnj5q8Ch
while (true) push(BUTTON_A)
2023/10/14(土) 00:00:08.85ID:sMwx6jpS
お題:角カッコの列が入力されるのでカッコの対応が取れていたら1,取れていなかったら0と表示せよ

< [[]]
> 1

< [[]
> 0
12817
垢版 |
2023/10/14(土) 02:22:24.53ID:BgrcFKKf
>>127
Perl

bash 等のシェルのコマンドラインで以下のように入力すると標準入力から入力して結果を標準出力に出力する。

perl -ne '$n=0;while(/(.)/g){if($1eq"["){$n++}elsif($1eq"]"){$n--}}$f=$n==0?1:0;print"$f\n"'

実行例
[[]]
1
[[]
0
[[[[]][[]]]
0
[[[[]][[]]]]
1
12917
垢版 |
2023/10/14(土) 04:16:14.71ID:BgrcFKKf
>>111
Kotlin
https://paiza.io/projects/ll5rbpwAp7dzQ_lOoj7RPw
2023/10/14(土) 10:19:17.10ID:BRbCCPQd
>>127 Ruby
%W( [[]] [[] [[[[]][[]]] [[[[]][[]]]] ][ #{} ).each{|s|
w = s.dup
{} while w.sub!( /\[\]/, '' )
puts "#{(s != '' && w == '')? 1 : 0} #{s.inspect}"
}

# 1 "[[]]"
# 0 "[[]"
# 0 "[[[[]][[]]]"
# 1 "[[[[]][[]]]]"
# 0 "]["
# 0 ""
131デフォルトの名無しさん
垢版 |
2023/10/14(土) 22:38:53.08ID:5dUK8HoW
>>127
C#
https://paiza.io/projects/biEUVjCtGCYB8s0ny8vsAQ
132デフォルトの名無しさん
垢版 |
2023/10/16(月) 08:51:26.93ID:kgcCjrnK
1)
BY
RG

2)
RG
BY

3)
GR
YB

1-3を回転対称で同じとみなせるグループと線対称で同じとみなせるグループに分類せよ

4色を2x2の升にランダムに一つづつ配置して4x3x2通りのパターンを作成し
それぞれを上の基準でグループ分けせよ
2023/10/17(火) 07:02:57.86ID:InaHR8fg
>>132 Ruby
https://ideone.com/J7Ec40
2023/10/18(水) 20:40:59.79ID:4ifgnZXl
お題:Pythonのmath.ulp()と同機能の関数
引数が正規化数限定のサブセットでも可(その旨を明記)。
Pythonで実装する場合は(もちろん)math.ulp()を使ってはならない。
135134
垢版 |
2023/10/18(水) 20:46:23.24ID:4ifgnZXl
簡単なお題:
>>133のサブセット(求めたulpも正規化数限定)
2023/10/18(水) 20:56:02.06ID:L3TY2GGf
import struct

def my_ulp(x):
# 浮動小数点数xをバイト列に変換
b = struct.pack("d", x)
# バイト列を整数に変換
i = int.from_bytes(b, "little")
# 符号部(1ビット)を取り出す
s = i >> 63
# 指数部(11ビット)を取り出す
e = (i >> 52) & 0x7ff
# 仮数部(52ビット)を取り出す
m = i & 0xfffffffffffff
# 指数部が0や最大値ならエラー
if e == 0 or e == 0x7ff:
raise ValueError("x is not a normalized number")
# 仮数部の最下位ビット(1ビット)を求める
lsb = m & 1
# 符号部と指数部を元に戻す
i = (s << 63) | ((e - lsb) << 52)
# 整数をバイト列に変換
b = i.to_bytes(8, "little")
# バイト列を浮動小数点数に変換
return struct.unpack("d", b)[0]
137134
垢版 |
2023/10/18(水) 21:44:13.43ID:4ifgnZXl
>>135
間違えましたorz
138134
垢版 |
2023/10/18(水) 21:52:04.82ID:4ifgnZXl
>>136
math.ulp()は符号を戻さないらしいです:
ulp(1) == ulp(-1)
2023/10/21(土) 04:08:56.28ID:TaroWUwV
お題:文字列「せんだ」「みつを」「ナハナハ」がランダムに100行入力される。せんだ、みつを、ナハナハが順番に入力されたときに1と一行出力せよ
140デフォルトの名無しさん
垢版 |
2023/10/21(土) 23:03:24.39ID:x0YGunAE
>>139
C#
https://paiza.io/projects/2AXALD9gCHkTYmJ7WYKEOQ
2023/10/25(水) 07:23:48.08ID:gFkqcLnH
お題:
(1)Python3.12以降の、math.nextafter()のサブセット
(実装はPythonでなくても構いません)
64ビット長程度の整数iを引数として、
a)iがゼロ:foo(i) = 0.0
b)i > 0:foo(i) = nextafter(0, inf, steps=i)
c)i < 0:foo(i) = nextafter(0, -inf, steps=-i)
を満たすfoo()を書く。
Python3.12を使う場合は、nextafter()を使ってはならない。

(2)(1)の逆関数。
142141
垢版 |
2023/10/25(水) 07:27:56.03ID:gFkqcLnH
補足:(1)(2)いずれも実用的な時間内で求める事(steps=1相当のnextafter()をループで回すのは不可)。
143デフォルトの名無しさん
垢版 |
2023/10/25(水) 12:47:47.78ID:Bgy3SEXp
なんだnextafterって
144141
垢版 |
2023/10/25(水) 23:22:03.23ID:gFkqcLnH
>>143
nextafter()は、浮動小数点数の、(数直線上での)「隣」を求めるやつですね(C99以降?)。
Python3.12のやつは、隣の隣の隣の…を求める事が出来る様に拡張されました。
14521-923
垢版 |
2023/10/26(木) 00:31:46.93ID:7aLp+Ojb
前スレの補足:
V8やLLVMは、自前でstrtod()的なものを実装してました。
tps://arxiv.org/abs/2101.11408
2023/10/28(土) 20:54:22.44ID:U0JINWpQ
>>101 octave
https://ideone.com/87WGBO
function s = f(s, i)
s(circshift(i, -1, 2)) = s(i);
end

>>127 ocaml
https://ideone.com/IY1dWU
let chars s =
let rec aux acc i =
if i < 0 then acc else aux (s.[i] :: acc) (i - 1)
in aux [] ((String.length s) - 1)
let f s =
let rec aux = function
([], []) -> 1
| (_, []) -> 0
| ('['::bs, ']'::cs) -> aux (bs, cs)
| (bs, c::cs) -> aux (c::bs, cs)
in aux ([], (chars s))
2023/10/31(火) 00:00:13.24ID:mywig6Xf
>>3 c
https://ideone.com/BnNzUC
int has26(const char *p) {
int c, count[26] = {0};
for (; c = tolower(*p); p++) if (isalpha(c)) count[c - 'a']++;
for (c = 'a'; c <= 'z'; c++) if (count[c - 'a'] < 1) return 0;
return 1;
}
const char *f(const char **lines, int n) {
const char *found = 0;
int i, len, minlen;
for (i = 0; i < n; i++)
if (has26(lines[i]))
if (!found)
found = lines[i], minlen = strlen(lines[i]);
else if (len = strlen(lines[i]) < minlen)
found = lines[i], minlen = len;
return found;
}
148デフォルトの名無しさん
垢版 |
2023/11/02(木) 14:01:24.52ID:4TnUpiLT
お題
https://i.imgur.com/XZDqbeJ.png
14917
垢版 |
2023/11/05(日) 02:55:01.08ID:w6RhJs5K
>>148
ChatGPT にそのままテキストを読ませたらこう答えた。
-------------------------------------------------------------------------------------------------
通学に自転車を使わない学生は34人、自転車を使うがバスを使わない学生は39人、バスを使うが自転車を使わない学生は18人です。

100人の学生全体からこれらの人数を引いた残りの学生がバスと自転車の両方を使っている学生の数です。

100人 - 34人 (自転車を使わない学生) - 39人 (バスを使わない学生) - 18人 (自転車を使わない学生) = 9人

したがって、通学にバスと自転車の両方を使う学生は9人です。
-------------------------------------------------------------------------------------------------

ここで徒歩については考慮しないのかとツッコミを入れたらこう答えた。

-------------------------------------------------------------------------------------------------
申し訳ありません、徒歩の学生についての情報が提供されていなかったため、上記の計算では徒歩を選択した学生については考慮されていませんでした。徒歩を選択した学生の数についての情報がなければ、バスと自転車の両方を使う学生の正確な数を計算することはできません。
-------------------------------------------------------------------------------------------------
15017
垢版 |
2023/11/05(日) 02:58:00.24ID:w6RhJs5K
そして更にこういうツッコミを入れる。

最初の34人は自転車を使っていないだけで密かにバスを使っているかも知れないのだが、そのことは考慮しないのか?

ChatGPT
申し訳ありません、私の以前の回答は不完全でした。確かに、最初の34人のうち自転車を使っていないという情報だけでは、彼らがバスを使っているかどうかを確定することはできません。そのため、正確な答えを得るためには追加の情報が必要です。

もし最初の34人のうち何人かが実際にはバスを利用している場合、それを考慮する必要があります。与えられた情報だけからは、バスと自転車の両方を使う学生の正確な数を特定することはできません。必要な情報が揃わない限り、正確な答えを提供することはできません。
2023/11/06(月) 00:02:49.99ID:fuk9k4cf
お題:単方向リストを逆順にせよ
152デフォルトの名無しさん
垢版 |
2023/11/06(月) 00:48:06.04ID:uPzAm2Gi
>>151
Java
https://paiza.io/projects/3z8V5XGGFjxqLac8ZYo_kg
2023/11/11(土) 20:39:33.71ID:iU/7lT3J
>>85
Ruby で作った。
FileUtils::DryRun を使っているので、実際には変更されません

require 'fileutils'

HEAD = 'abc' # 先頭文字
EXT = '.mp4' # 末尾の拡張子
HEAD_LEN = HEAD.length # 3文字
EXT_LEN = EXT.length # 4文字

# 絶対パスのディレクトリ名の後ろに、* を付けること!
# . で始まる、隠し directory, file を除く
glob_pattern = "C:/Users/Owner/Documents/test/*#{ EXT }"
target_dir = File.dirname( glob_pattern ) # ディレクトリパスだけを取り出す

# 元のファイル名の配列
fname_src_ary = Dir.glob( glob_pattern )
.select { |full_path| File.file?( full_path ) } # ファイルのみ
.select do |full_path|
file_name = File.basename( full_path )
# 先頭文字が abc かつ、末尾が .mp4 だけに絞り込む
file_name.start_with?( HEAD ) && file_name.end_with?( EXT )
end
.map { |full_path| File.basename( full_path ) }

次へ続く
154153
垢版 |
2023/11/11(土) 20:41:20.19ID:iU/7lT3J
# 変更後のファイル名の配列
fname_dest_ary = fname_src_ary.map do |file_name|
str = String.new( file_name )
# 先頭文字の abc と、末尾の .mp4 を取り除いて、数字だけにする
str.slice!(-EXT_LEN, EXT_LEN)
str.slice!(0, HEAD_LEN)
# 10進数の数値型に変換してから、3桁0埋め文字にする
HEAD + "%03d" % Integer( str, 10 ) + EXT
end

require 'set'
# 変更後のファイル名が既に存在しているか、チェックする。
# abc100.mp4 など、3桁以上の数値もエラー!
fname_src_set = Set.new( fname_src_ary ) # 集合
fname_dest_ary.each { |file_name|
raise "ファイル名: #{ file_name } が重複しています" if
fname_src_set.include?( file_name )
}

# ファイル名を変更する
fname_src_ary.zip( fname_dest_ary ) do |src_filename, dest_filename|
src_path = target_dir + "/" + src_filename
dest_path = target_dir + "/" + dest_filename
FileUtils::DryRun.move( src_path, dest_path )
end

出力
mv C:/Users/Owner/Documents/test/abc0.mp4
C:/Users/Owner/Documents/test/abc000.mp4
mv C:/Users/Owner/Documents/test/abc99.mp4
C:/Users/Owner/Documents/test/abc099.mp4
15517
垢版 |
2023/11/21(火) 04:31:35.72ID:aOoah041
>>151
Kotlin
https://paiza.io/projects/TDUcagXrng4H9zD9AenxjQ
2023/11/25(土) 20:07:06.40ID:zpqT0hBE
お題:ランダムに1から9999までの整数を得た時、何回で全種類出揃うか確認せよ
擬似乱数列生成法については指定しないものとする

ruby
https://ideone.com/rucuHk
require 'set'
r = 1..9999
c = r.to_a.fill(0)
s = r.to_set
while !s.empty?
n = rand(r)
c[n - r.first] += 1
s.delete n
end
p c.sum

84736
157デフォルトの名無しさん
垢版 |
2023/11/25(土) 22:17:37.68ID:Al0Rw+0l
>>156
R
https://ideone.com/nTywN4
158デフォルトの名無しさん
垢版 |
2023/11/26(日) 10:44:04.74ID:dd78ITN+
プログラミングの依頼はここでいいでしょうか。
ココナラで依頼したのですが見送りになってしまいました。
お金は出すので製品版を作って欲しいです。
できないなら何が定義できていないのか教えて下さい。

AIによる詩作成

まずAIが詩を作成するための学習ツールを作ります
AIがリンゴの形相を分解するには辞書が必要となる
リンゴを検索し辞書を比較し関連性の高いワード
リンゴ⊇(赤い、丸い、果物…)を拾うのだ
これが学習ツールであり
一致したワードからさらに形相に分解する
リンゴ⊇(赤い、丸い、果物、酸っぱい…)
その中の果物を形相分解するには
果物⊇(リンゴ、サクランボ、なし…)
その中のなしを様相分解すると
なし⊇(果物、丸い、黄緑…)
ここから詩を作るには『黄緑のリンゴ』などになる
形相分解すると客観的な『深さ』(今回は三段階)を持った詩になる
159デフォルトの名無しさん
垢版 |
2023/11/26(日) 10:50:43.54ID:d/KzVdDP
>>156
設定があいまいなんだが
shuffleとかselectとかchoice系なら
高々9999回で必ず全部出る
160デフォルトの名無しさん
垢版 |
2023/11/26(日) 11:41:26.07ID:1iIVw+fD
>>156
Java
https://paiza.io/projects/NEIRYxOjS1MiyOOhmbhaHA
161158
垢版 |
2023/11/26(日) 12:29:54.58ID:dd78ITN+
製品版なら10万円出します
AIでなくても詩作成ツールでいいです
162デフォルトの名無しさん
垢版 |
2023/11/26(日) 13:43:11.68ID:4uIV+oN2
>>156 lisp
https://ideone.com/pYi0rj
163デフォルトの名無しさん
垢版 |
2023/11/26(日) 21:12:35.28ID:SfQeb61a
>>157
これだと150001回以上となる場合が本来よりも起こりにくくなってしまい駄目だった。
活かしながら書き換えると https://ideone.com/qv7bL9
16417
垢版 |
2023/11/27(月) 10:19:46.26ID:VB+FhCy9
>>158
ここは誰かがお題を出して答えたい人が答えるスレなので、どんなお題を書いても構わないが、誰も答えないことはよくある。
また、バグがあっても気づかずにそのままになる事もある。多分大半のプログラムは作った本人以外は検証しないので。
ごく稀に他人がバグを発見することはあるが、発見されてもわざわざ指摘するとは限らないし修正もされないかも知れない。
16517
垢版 |
2023/11/27(月) 10:35:37.58ID:VB+FhCy9
>>156
Kotlin
https://paiza.io/projects/B7Eq1O1iPp-ynUyb5QGL9g

こんなので良いのか?やっぱ Set とか使わずにやった方が良いかな?
2023/11/27(月) 12:57:15.00ID:lzpjbGZv
>>156 Ruby
>>156 の例が個別の出現回数をカウントしていたのでそれに合わせた

c = [0] * 9999
9999.times {
redo unless ( c[ rand(9999) ] += 1 ) == 1
}
p c.sum
16717
垢版 |
2023/11/27(月) 13:09:30.74ID:VB+FhCy9
>>156
また Kotlin
https://paiza.io/projects/yYQ9bdMb0_d91607skNw4Q

今度は add ではなく remove でやるようにした。
これでその Ruby の例に近くはなるがカウントする方法は前と同じで個別にはやってない。
168デフォルトの名無しさん
垢版 |
2023/11/27(月) 18:30:50.07ID:O6HTjvgJ
>>156
Perl
perl -E 'for ($r = 9999; $n < $r; $_++) { $h{int(rand($r)) + 1} ||= ++$n }; say'
79596
169156
垢版 |
2023/11/27(月) 20:35:49.92ID:VuTnBSK2
>>156 c
https://ideone.com/K1fD78
・lispのひとの(>>162)をパク…参考にしました
・乱数生成部分は https://c-faq.com/lib/randrange.html からコピペしました
int main() {
int a[9999] = {0}, size = sizeof a / sizeof *a, sum, min, max, r, i, j, k;
srand(time(0));
#define randi(size) ((int)((double)rand() / ((double)RAND_MAX + 1) * (size)))
for (r = size; 0 < r; ) if (!a[randi(size)]++) r--;
for (sum = min = max = a[0], i = 1; i < size; i++) {
sum += a[i];
min = min < a[i] ? min : a[i];
max = a[i] < max ? max : a[i];
}
printf("%d\n%f\n[%d, %d]\n", sum, (double)sum / size, min, max);
for (i = min; i <= max; i++) {
for (k = j = 0; j < size; j++) if (i == a[j]) k++;
printf("%d\t%d\n", i, k);
}
return 0;
}
17017
垢版 |
2023/11/28(火) 15:35:44.30ID:cIauX08C
>>156
今度はC言語
https://paiza.io/projects/c6ALnYb4rksMFGZT03mcCw

1~9999ではなく実際には0~9998でやっているが、表示する必要もないし一々1足したり後で引いたりも馬鹿らしいのでそのままにした。
2023/11/30(木) 06:46:26.20ID:/rzYr39l
お題:英字の羅列された文字列が与えられる。この文字列を分析して数字列を出力せよ。数字の表記ルールは、その文字の両隣の文字がASCIIコードにおける奇数だったら1、そうでなければ0.
2023/11/30(木) 09:19:30.52ID:AZ5oWFgm
前提としてエラー入力はなくて
出力は両隣がある時のみでいいのかな

use itertools::{Itertools, assert_equal};

fn convert(input: &[u8]) -> Vec<u8> {
 input
 .iter()
 .tuple_windows()
 .map(|(prev, _curr, next)| (prev & next & 1) + b'0')
 .collect()
}

fn main() {
 assert_equal(&convert(b"ABC"), b"1");
 assert_equal(&convert(b"abcIJKpqrXYZ"), b"1001010000");
}
2023/11/30(木) 20:13:06.94ID:tzHzM+FM
>>171 octave
https://ideone.com/mx954D
function a = f(s)
o = rem([0 uint8(s) 0], 2) == 1;
a = o(1:end-2) & o(3:end);
end

>>171 c
https://ideone.com/VsnqKu
void f(const char *s, int *out, int *len) {
int i;
for (*len = strlen(s), i = 0; i < *len; i++)
out[i] = (i == 0 || i == *len - 1) ? 0 : s[i - 1] & s[i + 1] & 1;
}
174デフォルトの名無しさん
垢版 |
2023/11/30(木) 20:40:22.09ID:2Igm/ys/
>>R
https://ideone.com/NqXKMs
17517
垢版 |
2023/12/02(土) 14:30:47.66ID:FLL1Kaqa
>>171
Kotlin
https://paiza.io/projects/xZXVc46Ys3qUlGX4DAIxzw

両隣が存在する文字のみを対象に処理をするようにした。なので3文字未満はエラーになる。3文字の場合は2文字目だけを対象にして一つ結果を出す。
2023/12/04(月) 20:26:07.07ID:LtCaDuZa
>>171 Ruby
def solution1( str )
a = 0
str.chars.inject(''){|s,c|
s << ( (5 & (a = 7 & a << 1 | c.ord & 1) == 5)? '1' : '0' )
}[2..-1] || ''
end

solution( '' ) #=> ""
solution( 'AB' ) #=> ""
177デフォルトの名無しさん
垢版 |
2023/12/08(金) 09:07:44.84ID:Fcz3Modv
>>171 lisp
https://ideone.com/ftjccy
178デフォルトの名無しさん
垢版 |
2023/12/10(日) 17:41:17.00ID:Dj8Ho2Ik
>>171
C#
https://paiza.io/projects/ymS6iGUKe08auaZZ-2Q6XA
179デフォルトの名無しさん
垢版 |
2023/12/13(水) 09:27:48.18ID:NbIWTS6w
お題
ビールの空きビンをN本集めると新品のビール1本と交換してもらえる

あなたが新品のビールをP本持っている

そのとき、あなたが飲めるビールはR本である

N, Pを引数としてRを返す関数を定義してください
18017
垢版 |
2023/12/13(水) 15:17:15.28ID:WwinWAeQ
>>179
Kotlin または Kotlin script

fun beer(n: Int, p: Int) = p + p / n
18117
垢版 |
2023/12/13(水) 15:19:45.81ID:WwinWAeQ
ごめん。これだと1回分しか計算してないね。ということで >>180 はボツ。
18217
垢版 |
2023/12/13(水) 15:47:32.26ID:WwinWAeQ
>>179
Kotlin
https://paiza.io/projects/1gGtpt6dxb6-vzoATj_Qkg

作り直した。
もっと簡略化できそうな感じもしたがやってない。何か画期的な計算方法やアルゴリズムに気付いたらまた作る。
2023/12/13(水) 18:37:32.11ID:8Qa5an+7
>>179 Ruby
def solution( n, m )
b = r = n
while (k = b.div( m )) != 0
b += k - k * m
r += k
end
r
end

solution( 5, 3 ) #=> 7
2023/12/14(木) 00:01:58.90ID:WyfgSj4g
>>179
https://ideone.com/tvmy6F
let f n p =
let rec aux r p q =
if p = 0 then r else aux (r + p) ((p + q) / n) ((p + q) mod n)
in aux 0 p 0
let () = print_int @@ f 3 5

7
185デフォルトの名無しさん
垢版 |
2023/12/14(木) 00:03:09.36ID:uNhVrYF2
>>179
R

R <- function(N, P) ((P - 1) * N) %/% (N - 1) + 1
18617
垢版 |
2023/12/19(火) 15:39:00.18ID:S/sB6wJe
>>179
Kotin
https://paiza.io/projects/yPf1W7SClD8GIOV1WD_5LQ

再帰にすればとても簡単だったことに、さっき気付いた。
187デフォルトの名無しさん
垢版 |
2024/01/16(火) 00:33:05.98ID:n8j0XaXx
お題:時刻の文字列が与えられる。その時刻から1秒後の時刻を出力せよ。


入力:00:00:00
出力:00:00:01
入力:23:59:59
出力:00:00:00
1889
垢版 |
2024/01/16(火) 02:37:52.68ID:SfyAs2IF
>>187 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
1899
垢版 |
2024/01/16(火) 02:38:47.78ID:SfyAs2IF
>>188

use Time::Seconds;
これ要らなかった…orz
2024/01/16(火) 20:31:44.73ID:76+p6SY+
>>187 octave
https://ideone.com/CEGEj8
f = @(s) datestr(addtodate(datenum(s), 1, 'second'), 'HH:MM:SS');
in = ['00:00:00';'23:59:59'], out = f(in)
191デフォルトの名無しさん
垢版 |
2024/01/16(火) 20:54:27.73ID:OiJoE8pV
>>187 PowerShell
"00:00:00", "23:59:59" |% {[String]([DateTime]$_).AddSeconds(1).TimeOfDay}
2024/01/16(火) 21:26:50.38ID:76+p6SY+
>>187 ruby
https://ideone.com/y2wgxo
require 'time'
f = -> s {(Time.parse(s) + 1).strftime('%T')}
p ['00:00:00', '23:59:59'].map {|s| [s, f.(s)]}
2024/01/16(火) 23:32:13.09ID:+Emu7d1R
>>187 js

const decode = (s) => s.split(":").map(Number);
const encode = (nums) => nums.map((v) => String(v).padStart(2, "0")).join(":");
const inct = (s, sec = 1) => {
const a = decode(s);
const ss = [
{ n: a[0], max: 24 },
{ n: a[1], max: 60 },
{ n: a[2], max: 60 },
];
let up = sec;
const b = ss
.reverse()
.map(({ n, max }) => {
n += up;
up = Math.floor(n / max);
return n % max;
})
.reverse();
return encode(b);
};
console.log(inct("00:00:00"));// 00:00:01
console.log(inct("23:59:59"));// 00:00:00
console.log(inct("00:00:00", 100));// 00:01:40
2024/01/17(水) 00:04:27.61ID:g7dwo5vO
>>187 ocaml
https://ideone.com/aEsvl6
let sec_of_hms hms =
let at i = int_of_string (String.sub hms i 2) in at 0 * 60 * 60 + at 3 * 60 + at 6
let hms_of_sec sec =
Printf.sprintf "%02d:%02d:%02d" (sec mod 86400 / 3600) (sec mod 3600 / 60) (sec mod 60)
let (<<) f g x = f (g x)
let f = hms_of_sec << (+) 1 << sec_of_hms
2024/01/17(水) 01:45:50.10ID:xvgJymQe
>>187
Rust (date/timeライブラリ不使用版)

fn next_time(cur: &str) -> String {
 let [sec, min, hour] = cur
 .rsplitn(3, ':')
 .map(|s| s.parse().unwrap())
 .zip([60, 60, 24])
 .scan(1, |carry, (mut value, limit)| {
  value += *carry;
  (*carry, value) = if value == limit { (1, 0) } else { (0, value) };
  Some(value)
 })
 .collect::<ArrayVec<_, 3>>()[..] else { unreachable!() };
 format!("{hour:02}:{min:02}:{sec:02}")
}

fn main() {
 assert_eq!(next_time("00:00:00"), "00:00:01");
 assert_eq!(next_time("23:59:59"), "00:00:00");
}
19617
垢版 |
2024/01/18(木) 03:01:51.54ID:opxINJAy
>>187
Kotlin

Java のライブラリそのまま使ってるだけの怠惰なプログラム

https://paiza.io/projects/76gN3OCL93cAj7qXnNlyIA
19717
垢版 |
2024/01/19(金) 19:43:44.34ID:hxZRcaHh
>>187
Kotlin

今度は Java のライブラリは使わずに時分秒を保持するクラスを自分で作ってそこで秒に足すとか文字列にするとかやるようにした。

https://paiza.io/projects/7YcPDBTxVFt9EVczvBJ8gQ
2024/01/20(土) 23:08:19.98ID:PCaU0wMN
>>187 dart 2.3.0
https://ideone.com/khq9gr
void main() {
var sec_of_hms = (hms) => hms.split(':').fold(0, (acc, s) => acc * 60 + int.parse(s));
var hms_of_sec = (sec) => [sec % 86400 ~/ 3600, sec % 3600 ~/ 60, sec % 60].map((x) => x.toString().padLeft(2, '0')).join(':');
var f = (hms) => hms_of_sec(sec_of_hms(hms) + 1);
print(f('00:00:00'));
print(f('23:59:59'));
}
199デフォルトの名無しさん
垢版 |
2024/01/21(日) 17:06:46.39ID:BpmEGVkv
>>187
c++
https://mevius.5ch.net/test/read.cgi/tech/1434079972/124
200デフォルトの名無しさん
垢版 |
2024/01/21(日) 21:15:52.66ID:BWkvMixc
>>187 c
https://ideone.com/wRIYl2
int hmstosec(const char *hms) {
int h, m, s;
return sscanf(hms, "%d:%d:%d", &h, &m, &s) == 3 ? h * 3600 + m * 60 + s : 0;
}
char *sectohms(char *buff, int sec) {
sprintf(buff, "%02d:%02d:%02d", sec % 86400 / 3600, sec % 3600 / 60, sec % 60);
return buff;
}
char *f(char *buff, const char *hms) {
return sectohms(buff, hmstosec(hms) + 1);
}

>>187 c
https://ideone.com/3gj90n
int hmstosec(const char *hms) {
#define _(i) ((hms[i] - '0') * 10 + (hms[i + 1] - '0'))
return _(0) * 3600 + _(3) * 60 + _(6);
#undef _
}
char *sectohms(char *buff, int sec) {
#define _(i, value) buff[i] = '0' + (value) / 10, buff[i + 1] = '0' + (value) % 10
return _(0, sec % 86400 / 3600), buff[2] = ':', _(3, sec % 3600 / 60), buff[5] = ':', _(6, sec % 60), buff[8] = '\0', buff;
#undef _
}
char *f(char *buff, const char *hms) {
return sectohms(buff, hmstosec(hms) + 1);
}
201デフォルトの名無しさん
垢版 |
2024/01/22(月) 15:47:46.18ID:PT6/fzaV
>>187 lisp
https://ideone.com/J8xIVN
2024/01/23(火) 20:39:51.43ID:8rvcqFQo
>>187 gawk
https://ideone.com/zBy22y
BEGIN {FS=":"}
{print strftime("%T", mktime(sprintf("2024 01 23 %s %s %s", $1, $2, $3)) + 1);}

>>187 sqlite
https://ideone.com/fjEdMz
select time('00:00:00', '+1 second');
select time('23:59:59', '+1 second');

>>187 bash
https://ideone.com/pYf8vL
while read hms; do
date '+%T' --date="+1 seconds $hms"
done
2024/01/23(火) 22:56:23.02ID:8rvcqFQo
>>187 pascal
https://ideone.com/sprmCC
program ideone;
Uses sysutils, dateutils;
function f(hms : string) : string;
begin
f := TimeToStr(IncSecond(StrToTime(hms), 1))
end;
begin
writeln(f('00:00:00'));
writeln(f('23:59:59'));
end.
2024/01/23(火) 23:54:34.15ID:39Fs96AV
>>187を時間ライブラリ無しで作成できている言語は現時点で
193のJavaScript
194のOCaml
195のRust
197のKotlin
198のDart
199のC++
200のC
201のLisp
以上
20517
垢版 |
2024/01/24(水) 00:08:17.22ID:n4ooUyFj
>>187
Perl

bashのコマンドラインから長い長いワンライナーで。

$ perl -ne 'if(/(\d+):(\d+):(\d+)/){$h=$1;$m=$2;$s=$3;printf"入力:%02d:%02d:%02d\n",$h,$m,$s;$s++;if($s>=60){$m++;$s=0;if($m>=60){$h++;$m=0;if($h>=24){$h=0}}}printf"出力:%02d:%02d:%02d\n",$h,$m,$s}'
1:2:3
入力:01:02:03
出力:01:02:04
0:0:0
入力:00:00:00
出力:00:00:01
23:59:59
入力:23:59:59
出力:00:00:00
$
206デフォルトの名無しさん
垢版 |
2024/02/02(金) 06:41:15.23ID:CC6U77IS
お題
入力データをグループ分けして出力せよ

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

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 を自作してみた。
下はユニットテストです

https://paiza.io/projects/e6nk1EOu3utyWpV3iuWAFQ?language=ruby
https://paiza.io/projects/kjeVtTKeDwEnWVrBU5_nbg?language=ruby
2024/02/02(金) 10:50:23.49ID:fEMhv+T7
>>206
Rust

fn foo<'a, 'b>(input: &'b [&'a str]) -> Vec<Vec<&'a str>> {
 struct Data<'a> { name: &'a str, rep: usize, coll: Option<Vec<usize>>, }
 let mut data = Vec::<Data>::new();
 let mut map = HashMap::<&str, usize>::new();
 for s in input {
  let (index0, index1) = s.splitn(2, '=')
   .map(|s| match map.get(s) {
    Some(&index) => data[index].rep,
    None => {
     let index = data.len();
     map.insert(s, index);
     data.push(Data { name: s, rep: index, coll: Some(vec![index]), });
     index
    },
   })
   .sorted().tuple_windows().next().unwrap();
  if index0 != index1 {
   let coll0 = data[index0].coll.take().unwrap();
   let coll1 = data[index1].coll.take().unwrap();
   coll1.iter().for_each(|&index| data[index].rep = index0);
   data[index0].coll = Some(itertools::merge(coll0, coll1).collect());
  }
 }
 data.iter().map(|data| &data.coll).flatten()
  .map(|coll| coll.iter().map(|&index| data[index].name).collect()).collect()
}
2024/02/02(金) 10:53:02.58ID:fEMhv+T7
>>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);
}
2024/02/02(金) 22:48:33.27ID:UezRkqGy
>>206 ruby
https://ideone.com/eF5lww
f = -> a {
w = a.map {|s| s.split('=')}.flatten.uniq.map.with_index.to_h
a.each_with_object([]) {|s, acc|
x, xa, y, ya = s.split('=').map {|k| [k, acc.find {|b| b.include? k}]}.flatten(1)
if xa && ya then xa.concat (acc.delete ya) << x << y
elsif xa then xa << x << y
elsif ya then ya << x << y
else acc << [x, y]
end
}.map {|a| a.uniq.sort_by {|s| w[s]}}.sort_by {|a| w[a[0]]}
}
2024/02/02(金) 22:51:42.74ID:UezRkqGy
>>206 rust
https://ideone.com/MEZMPO
fn f<'a>(a: &[&'a str]) -> Vec<Vec<&'a str>> { // '
let h = a.iter().map(|&s| s.split('=')).flatten().rev().enumerate().map(|(p, s)| (s, p)).collect::<HashMap<_, _>>();
let mut acc = Vec::<Vec<&str>>::new();
for xy in a.iter().map(|s| s.split('=').collect::<Vec<_>>()) {
match (acc.iter().position(|b| b.contains(&xy[0])), acc.iter().position(|b| b.contains(&xy[1]))) {
(Some(xi), Some(yi)) => {
let ys = acc[yi].clone();
acc[xi].extend(ys);
acc[xi].extend(xy);
acc.remove(yi);
},
(Some(xi), None) => acc[xi].extend(xy),
(None, Some(yi)) => acc[yi].extend(xy),
_ => acc.push(xy),
}
}
for b in acc.iter_mut() {
b.sort_by(|c, d| h.get(d).cmp(&h.get(c)));
b.dedup();
}
acc.sort_by(|c, d| h.get(d[0]).cmp(&h.get(c[0])));
acc
}
2024/02/02(金) 23:24:19.60ID:UezRkqGy
>>206 ruby
https://ideone.com/daI0QL
・若干の修正
f = -> a {
w = a.map {|s| s.split('=')}.flatten.uniq.map.with_index.to_h
a.each_with_object([]) {|s, acc|
x, xa, y, ya = s.split('=').map {|k| [k, acc.find {|b| b.include? k}]}.flatten(1)
if xa && ya then xa.concat (acc.delete ya)
elsif xa then xa << y
elsif ya then ya << x
else acc << [x, y]
end
}.map {|a| a.sort_by {|s| w[s]}}.sort_by {|a| w[a[0]]}
}
2024/02/02(金) 23:24:45.86ID:UezRkqGy
>>206 rust
https://ideone.com/dO4xea
・若干の修正
fn f<'a>(a: &[&'a str]) -> Vec<Vec<&'a str>> { // '
let h = a.iter().map(|&s| s.split('=')).flatten().rev().enumerate().map(|(p, s)| (s, p)).collect::<HashMap<_, _>>();
let mut acc = Vec::<Vec<&str>>::new();
for xy in a.iter().map(|s| s.split('=').collect::<Vec<_>>()) {
match (acc.iter().position(|b| b.contains(&xy[0])), acc.iter().position(|b| b.contains(&xy[1]))) {
(Some(xi), Some(yi)) => {
let ys = acc[yi].clone();
acc[xi].extend(ys);
acc.remove(yi);
},
(Some(xi), None) => acc[xi].push(xy[1]),
(None, Some(yi)) => acc[yi].push(xy[0]),
_ => acc.push(xy),
}
}
acc.iter_mut().for_each(|b| b.sort_by(|c, d| h.get(d).cmp(&h.get(c))));
acc.sort_by(|c, d| h.get(d[0]).cmp(&h.get(c[0])));
acc
}
213デフォルトの名無しさん
垢版 |
2024/02/02(金) 23:58:11.98ID:Uk0I9chw
>>206
R
https://ideone.com/FOwwk2
214デフォルトの名無しさん
垢版 |
2024/02/03(土) 02:58:35.44ID:bEsWZIv5
>>206
Java
https://paiza.io/projects/TzHsf-cnqzdxSASpwlgg_w
215デフォルトの名無しさん
垢版 |
2024/02/03(土) 10:26:51.46ID:kmOXhk/V
>>206 >>213
Rでもっと短く書けた。
https://ideone.com/vmtYAJ
2169
垢版 |
2024/02/04(日) 16:39:59.23ID:jTY6zdRX
>>208 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
2179
垢版 |
2024/02/04(日) 18:22:17.66ID:jTY6zdRX
>>208 宛てじゃなかった
>>206 の回答だったわ… orz
218デフォルトの名無しさん
垢版 |
2024/02/04(日) 18:32:39.04ID:fS5H2fbQ
>>206
>>215をPowerShellに移植

$in =
  "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"

$in -split "=" |% {$h = @{}; $n = 0} {if (!$h[$_]) {$h[$_] = $n++}}
$eq = $in |% {, $h[$_ -split "="]}

$g = 1..$n
do {
  $changed = $false
  $eq |% {
    $i, $j = $_
    switch ($g[$i] - $g[$j]) {
      {$_ -gt 0} {$g[$i] = $g[$j]; $changed = $true}
      {$_ -lt 0} {$g[$j] = $g[$i]; $changed = $true}
    }
  }
} while ($changed)

$h.keys | sort {$h[$_]} | group {$g[$h[$_]]} |% {"[$($_.group -join ", ")]"}

-- 実行結果 --
[a1, a2, b1, b2, b3, a3, a4, a5, b4]
[c1, c2, c3, c4, d1, d2, d3]
[e1, e2, e3]
219デフォルトの名無しさん
垢版 |
2024/02/04(日) 19:02:37.59ID:fS5H2fbQ
>>218の5行目の if (!$h[$_]) を if ($h[$_] -eq $null) に訂正
220デフォルトの名無しさん
垢版 |
2024/02/04(日) 19:43:39.57ID:NiYs7EK6
>>206
C++
https://mevius.5ch.net/test/read.cgi/tech/1434079972/125
完全にやっつけ仕事、いろいろ課題がありますね
221211
垢版 |
2024/02/04(日) 23:55:45.21ID:ytAuzkvH
>>206 ruby
https://ideone.com/2UiT8U
>>211から若干のアレンジ
・同一グループの収集にSortedSetを使用
22217
垢版 |
2024/02/05(月) 02:54:15.12ID:8tY/Vubv
>>206
Kotlin

入力データを標準入力から入力したり、クラス作ってその中でまとめる等、色々やって長くなった。

https://paiza.io/projects/zdysD5ygRDFVbY2gAGCwOw
223221
垢版 |
2024/02/05(月) 20:08:21.07ID:tt/WRhkt
>>206 ruby
https://ideone.com/j2xPyB
>>221から若干のアレンジ
・SortedSet単位でのみいじるようにした
f = -> a {
g = -> a {a.combination(2) {|x, y| break g.(a.tap {x.merge y; a.delete y}) if x.intersect? y}}
h = a.map {|s| s.split('=')}.flatten.uniq.map.with_index.to_h
a = a.map {|s| s.split('=').map {|k| h[k]}.to_set SortedSet}
g.(a).map {|set| set.map &h.invert.method(:[])}
}
224デフォルトの名無しさん
垢版 |
2024/02/05(月) 23:26:45.85ID:YjqgZClx
>>206
>>218-219をC#化
https://ideone.com/qWA5TB
225223
垢版 |
2024/02/05(月) 23:51:15.55ID:tt/WRhkt
>>206 rust
https://ideone.com/Ma1WGV
>>223の移植
・色々迷いアリ
 .map(|k| *h.get(k).unwrap())のところは当初
 .map(|k| h.get(k).map(|&i| i)).flatten()などとしていたが
 正解がわからないので迷った挙げ句に短く書けるほうを採用
・これに限らずrustは不慣れなので色々珍妙なことをしている可能性アリ
226225
垢版 |
2024/02/06(火) 22:07:13.88ID:6T/Xuns0
>>206 rust
https://ideone.com/m5INyJ
>>225から若干の修正
・不必要なループ回数を訂正
・二重forを一重に(でもかえって煩雑に)
・まだまだ迷いアリ
 .map(|k| *h.get(k).unwrap())は結局
 .flat_map(|k| h.get(k)).cloned()に置き換え
 こっちのほうが個人的にはスッキリ感アリ

>>206 rust
https://ideone.com/hT5zGF
・上記のmutナシ版
・パフォーマンス的な観点もナシ
227デフォルトの名無しさん
垢版 |
2024/02/06(火) 22:17:05.66ID:ICpsP2hv
>>206
C#で>>224とは別の解法
https://ideone.com/fvtgZa
228デフォルトの名無しさん
垢版 |
2024/02/09(金) 20:11:03.28ID:xlZlW34G
>>206
C#でHashSet型を使用。実効速度は>>224>>227より遅い。
https://ideone.com/cPsAYu
229226
垢版 |
2024/02/09(金) 22:33:42.16ID:JDB9tF7l
>>226
すべてruby移植版rust
DでもE見た目派生まとめ

mutあり版
https://ideone.com/m5INyJ // for if return
https://ideone.com/R8wcOJ // match find
https://ideone.com/ifI5EX // if let find

mutなし版
https://ideone.com/hT5zGF // for if return
https://ideone.com/1PNKbR // match find
https://ideone.com/btKWb1 // if let find

集合同士の組み合わせに重なりが一個もなかったときに
最後に返す a がポツーンと片隅に居るのが落ち着かなかったので
match/if letで書き直してみたがそれはそれで難があり?
条件部分が奥に入ってしまったのがなんかイヤだったり?
一行目が長くなりすぎる、という理由で二行に分けたり?
やっぱ元のfor if returnのリズムのほうが眼球に入りやすい?
230デフォルトの名無しさん
垢版 |
2024/02/10(土) 22:10:46.31ID:HaBtyH/G
>>206
>>227をC++に移植
https://ideone.com/RgBBVA
2024/02/11(日) 15:34:27.52ID:3wEOIMb0
>>206 octave
https://ideone.com/b2MsDk

>>206 octave
https://ideone.com/x6Lzmb
232デフォルトの名無しさん
垢版 |
2024/02/11(日) 20:38:42.50ID:v64KP9lJ
>>206
>>230をDで書くと
https://ideone.com/9oenyq
になるが、switch case 0, 1, 2の場合も3の場合と同じ処理にすると、効率は落ちるもののかなり短くできる。
https://ideone.com/ILLUdy
233223
垢版 |
2024/02/12(月) 23:45:12.86ID:ix8w7wd+
>>206 octave
https://ideone.com/VtqJcV
・組み合わせつくって集合のペアごとに調べることをやめた
・集合間で重複する要素に着目して集合を減らすようにした

>>223
g.(a).map {|set| set.map &h.invert.method(:[])}じゃなくて単に
g.(a).map {|set| h.keys.values_at *set}で良かった
2024/02/14(水) 09:32:06.19ID:JjlrBdlD
お題:数値が入力されるのでその数値に最も近い回分数を出力せよ
回分数とは回分になっている数(負数含まず)のことである
最も近い回分数が2つある場合は2つとも出力せよ

入力 0
出力 0

入力 17
出力 22

入力 100
出力 99
出力 101
235デフォルトの名無しさん
垢版 |
2024/02/14(水) 15:20:24.32ID:VoM/Kva2
>>234 lisp
https://ideone.com/MvDoGf
2024/02/14(水) 21:10:48.99ID:/8p4lTpf
>>234 ocaml
https://ideone.com/4RtyBj

>>234 rust
https://ideone.com/eLCvSJ
237デフォルトの名無しさん
垢版 |
2024/02/14(水) 23:21:42.28ID:iTsk+dOj
>>236
PowerShell
https://ideone.com/voA7MH
2024/02/15(木) 21:30:35.17ID:MveN6p4/
>>234
Rust

fn foo(n: usize) -> (usize, Option<usize>) {
 let n2b = |n: usize| { let mut o = Some(n); iter::from_fn(|| { let n = o.take()?; o = (n >= 10).then(|| n / 10); Some((n % 10) as i8) }).collect::<Vec<i8>>() };
 let b2n = |b: &[i8]| b.iter().rev().fold(0_usize, |n, b| n * 10 + *b as usize);
 let pal = |b: &mut [i8]| { let len = b.len() / 2; let (l, u) = b.split_at_mut(len); iter::zip(l, u.iter().rev()).for_each(|(l, u)| *l = *u); };
 let inc = |b: &mut [i8]| { let len = b.len() / 2; let mut c = 1; b[len..].iter_mut().for_each(|b| { *b += c; if *b > 9 { *b = 0; c = 1; } else { c = 0; }}); };
 let dec = |b: &mut [i8]| { let len = b.len() / 2; let mut c = 1; b[len..].iter_mut().for_each(|b| { *b -= c; if *b < 0 { *b = 9; c = 1; } else { c = 0; }}); };
 let fix = |b: &mut [i8]| { if b.last() == Some(&0) { if b.len() & 1 == 0 { b[(b.len() - 1) / 2] = 9; } true } else { false } };
 
 let mut b = n2b(n);
 pal(&mut b);
 let n1 = b2n(&b);
 match n.cmp(&n1) {
  Ordering::Equal => return (n, None),
  Ordering::Greater => inc(&mut b),
  Ordering::Less => dec(&mut b),
 }
 if fix(&mut b) { b.pop(); }
 pal(&mut b);
 let n2 = b2n(&b);
 match n.abs_diff(n1).cmp(&n.abs_diff(n2)) {
  Ordering::Less => (n1, None),
  Ordering::Greater => (n2, None),
  Ordering::Equal => (n1, Some(n2)),
 }
}
239デフォルトの名無しさん
垢版 |
2024/02/15(木) 22:00:50.95ID:fu0tHwRa
>>234
>>237は入力が1〜9のとき出力が正しくなかった。function内の1行目に if ($n -le 9) {return $n} を
挿入すると修正される。

Rでは添字の開始値は1で添字0では空のデータが返るので、入力が1〜9のときの場合分けは不要。
[]演算子と+演算子を文字列でも使えるように再定義した。
https://ideone.com/PP5swB

Dでは添字範囲指定は半開区間なので、入力が1〜9のときの場合分けは不要。
https://ideone.com/hvNBia
2024/02/15(木) 23:18:01.58ID:IMdr4idU
>>234 c
https://ideone.com/mWihci
2419
垢版 |
2024/02/16(金) 02:56:10.41ID:7jtCAGu+
>>234 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
2429
垢版 |
2024/02/16(金) 03:13:10.80ID:7jtCAGu+
>>241

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



  last if @a = keys %a;
 }

とコンパクトに書けるんだった、まぁいいや
2439
垢版 |
2024/02/16(金) 14:47:55.29ID:TIAwaOOw
>>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";
}
2024/02/16(金) 21:57:03.19ID:cLyPSkE5
>>234 pascal
https://ideone.com/F1gAKR
24517
垢版 |
2024/02/16(金) 23:58:17.22ID:C4FuIAno
>>234
Kotlin

何か画期的なアルゴリズムを使ったわけではなく、むしろほとんど何も考えずただ作られただけのプログラム。

https://paiza.io/projects/S5qsLnHz_pZD3um9jYRg_Q
2469
垢版 |
2024/02/17(土) 02:10:36.54ID:K8P5qDCx
>>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}
2024/02/17(土) 18:14:20.87ID:nUY+CX2J
>>234 pascal
https://ideone.com/kRXq6z
・dynamic array 使用
248デフォルトの名無しさん
垢版 |
2024/02/17(土) 19:03:53.65ID:eWGoJOTY
>>234
C++
https://mevius.5ch.net/test/read.cgi/tech/1434079972/126
249デフォルトの名無しさん
垢版 |
2024/02/17(土) 20:00:17.98ID:k6cg1rdP
>>234
>>239のC#版
https://ideone.com/glAEMw

Julia版
https://ideone.com/cbP5Dm
2024/02/17(土) 20:51:00.88ID:nUY+CX2J
>>234 octave
https://ideone.com/MXux5X
2024/02/17(土) 21:45:58.19ID:nUY+CX2J
>>234 ruby
https://ideone.com/0pvK4o
2024/02/18(日) 17:05:41.93ID:z028saCP
>>251
>[[0, [0]], [17, [11]], [100, [99, 101]]]

17 は、22 だよ
2024/02/18(日) 18:14:23.24ID:puttXdr1
>>235
しらみ潰しで失格
>>236
しらみ潰しで失格
>>240
しらみ潰しで失格
2024/02/18(日) 18:14:51.62ID:puttXdr1
>>243
しらみ潰しで失格
>>244
しらみ潰しで失格
>>245
しらみ潰しで失格
2024/02/18(日) 18:15:27.81ID:puttXdr1
>>246
しらみ潰しで失格
>>247
しらみ潰しで失格
>>248
しらみ潰しで失格
2024/02/18(日) 18:16:03.57ID:puttXdr1
>>250
しらみ潰しで失格
>>251
しらみ潰しで失格
257デフォルトの名無しさん
垢版 |
2024/02/18(日) 18:26:09.28ID:ovKjFpQ6
>>253-256 アスペで不合格w
2024/02/18(日) 18:34:19.30ID:rWy6ZYAH
>>234 ruby
https://ideone.com/N0w91j
f = -> n {
(0..n).lazy.map {|i| [n - i, n + i].select {|x| x.to_s.reverse.to_i == x}}.find(&:any?).uniq
}

>>252
(`・ω・´)ゞ
誤:a - 1, a + 1
正:a - 1, b + 1
2024/02/18(日) 19:41:35.69ID:rWy6ZYAH
>>234 dart
https://ideone.com/e23wRv
void main() {
var rev = (n) => int.parse(n.toString().split('').reversed.join());
var f = (n) => Iterable.generate(n + 1).map((i) => [n - i, n + i].where((x) => x == rev(x))).firstWhere((a) => a.isNotEmpty).toSet().toList();
print([0, 17, 100].map((n) => [n, f(n)]));
}
260デフォルトの名無しさん
垢版 |
2024/02/20(火) 08:46:37.56ID:8US2zplP
【㋮㋑㋣㋹㊀㋳】 チャールズ3世戴冠式に`死神´
https://rio2016.5ch.net/test/read.cgi/kokusai/1690352002/l50
26117
垢版 |
2024/02/20(火) 10:47:13.25ID:YmH8jdAc
>>254
しらみ潰しって、どんなテストしたの?
2024/02/20(火) 12:59:46.62ID:qzcGLGiS
しらみ潰しとは例えば1から順番に見つかるまで全てを試していく最悪な方法を指す
今回の場合だと与えた数から順番に見つかるまで±1を続けて全てを試していって探すプログラムが該当する
2639
垢版 |
2024/02/20(火) 17:18:07.59ID:X5uoFLgg
「どんなテストしたの?」
って質問だよ
264◆QZaw55cn4c
垢版 |
2024/02/20(火) 20:48:17.02ID:RtAsHDVN
>>262
私は >>248
だけれども、解法としてはそれしかないと思いますね
2024/02/20(火) 22:00:55.76ID:e+y9lgSN
>>249>>238
しらみ潰しではなく
きちんとプログラミングして算出しているようにみえますね
2024/02/21(水) 13:54:29.89ID:ve9Dz9D8
>>264
私は解答は提出していないが、ざっくりと自分が思いついた方法

まず、以下のような操作を考える
A. 1234という入力に対して1234321を返す
B. 1234という入力に対して12344321を返す
ここで、xという入力に対してA,Bが返す数をA(x),B(x)と表すことにする

次に、与えられた数の桁数で場合分け
(1)与えられた数字の桁数が奇数の場合
例として5桁の数字を考える
N=a*10000+b*1000+c*100+d*10+e*1 (a~eは1桁の自然数, aは0でない)
が与えられたとき、
M=a*100+b*10+c*1
とすると、N=10000の場合を除いて、Nに最も近い回文数は
A(M), A(M+1), A(M-1)
の3つの候補に絞られる(厳密にはA(M)とNとの大小比較からA(M±1)の何れかは明らかに候補にならないので2つを考えれば良い)
N=10000の場合は9999と10001が答え

(2)与えられた数の桁数が偶数の場合
例として6桁の数を考える
(1)と同様に
N=a*100000+b*10000+c*1000+d*100+e*10+f*1
に対して
M=a*100+b*10+c*1
とすると、N=100000の場合を除いて
B(M), B(M+1), B(M-1)
のどれかがNに最も近い回文数(厳密には以下略)
N=100000の場合は99999と100001が答え

十分大きな数に対しては虱潰しに回文判定していくより速く求まる
267デフォルトの名無しさん
垢版 |
2024/02/21(水) 16:02:55.06ID:Sko4Sglv
>>266
N=17
のときは?
268259
垢版 |
2024/02/21(水) 23:06:20.13ID:DX/jvS2m
>>259
Iterable.generate(n).map(f)は単に
Iterable.generate(n, f)で良かったと判明
269デフォルトの名無しさん
垢版 |
2024/02/21(水) 23:42:23.78ID:bqTl0uQM
>>234
>>249をC++で書き換え(入力値は64ビット整数の範囲内限定)
https://ideone.com/e1AM8A

元々はCで書き、4行目はなし、15行目と24行目はstrrev(s + i);だったが、Windowsのgccでは
コンパイルできたのにideoneではできなかったので、仕方なくC++にしてstd::reverseで代用した。
270デフォルトの名無しさん
垢版 |
2024/02/22(木) 00:34:50.13ID:+mJgzEZf
>>234 lisp
>>266を参考に>>249(C#)を移植
https://ideone.com/CUPTas
2024/02/22(木) 01:30:35.61ID:9s07Ijs0
>>234
Rust

fn nearest_palindrome_numbers(n: usize) -> Vec<usize> {
 let mut dd = DecimalDigits::new(n);
 dd.palindrome_using_upper_half();
 let n1 = dd.to_number();
 match compare(n, n1) {
  Equal => return vec![n],
  Greater => dd.increment_upper_half(),
  Less => dd.decrement_upper_half(),
 }
 if dd.is_most_upper_zero() {
  return vec![n - 1, n + 1];
 }
 dd.palindrome_using_upper_half();
 let n2 = dd.to_number();
 match compare_absolute_diff((n, n1), (n, n2)) {
  Less => return vec![n1],
  Greater => return vec![n2],
  Equal => return if n1 < n2 { vec![n1, n2] } else { vec![n2, n1] },
 }
}
272266
垢版 |
2024/02/22(木) 01:47:44.56ID:c61GBvnr
>>267
N=17=1*10+7*1のとき、Nは2桁(偶数桁)でM=1*1=1
B(M)=B(1)=11はNより小さいのでB(M-1)は考えなくてよい
B(M+1)=B(2)=22なので11,22が答えの候補
11より22のほうが17に近いので22が答え

ちょっとNに対するMの説明が足りてなかったけど言葉で上手く言い表せないすみません(上位半分以上かつ最小の桁数を抜き出す、的な)
2024/02/22(木) 20:54:45.16ID:+nyM4OV5
>>234 ruby
https://ideone.com/rJCYgT
・それっぽい三個の候補から選んでるだけ
274デフォルトの名無しさん
垢版 |
2024/02/22(木) 21:04:16.48ID:3p8Kt6H4
>>234
>>269の一部でC++の機能をどうせ使ってしまったので、この際、全部をC++流に変えたら
C流よりすっきり書けた。
https://ideone.com/38bo2E
275273
垢版 |
2024/02/22(木) 21:48:36.22ID:+nyM4OV5
>>273
> [1000, [1001]]

誤:ps = [p.(s), p.(t.to_i.pred.abs.to_s + u), p.(t.succ + u)]
正:ps = [p.(s), p.(t.to_i.pred.abs.to_s + u), p.(t.succ + u), p.(s.to_i.pred.abs.to_s)]

とりあえず雑に修正してみたが?
(ノ∀`)アチャー
27617
垢版 |
2024/02/23(金) 18:10:28.85ID:ZR6D6MGM
>>262
>>245のKotlinのプログラムは何も考えてなくて本当に馬鹿正直に±1して一つ一つ検査する方式で作ったんだけど、それでもあなたのテストではダメということになったの?
まあ Int (符号付32bit整数) 使ってるからその限界超えたらダメではあるんだけど、そういう問題ではなく?
2024/02/23(金) 18:58:34.05ID:9Umf93zL
>>276
それはしらみつぶしと言われる駄目プログラミングだよ
例えば求める解法が存在する方程式を解くのに値を±1しながら順に代入して試していくのと同じ
278デフォルトの名無しさん
垢版 |
2024/02/23(金) 21:39:34.55ID:ZR6D6MGM
>>277
あー。プログラムにバグがあってまともに答えが出ないっていうことではなく何の捻りもないプログラムだからダメっていう感想ね。それならわかる。
こちらもアルゴリズム思い浮かばないけどとりあえず作ってみただけだし。ダメというほどではないが良いとも思えないプログラムなので。
279273
垢版 |
2024/02/23(金) 23:06:54.56ID:RzwC5Hr4
>>234 ruby
https://ideone.com/E9VSE3
・273の[1000, [1001]]バグ修正版
・275とは違う方法で修正してみたがやっつけ感大

>>234 ruby 2.5.5
https://ideone.com/1zqSr1
・いわゆる(?)ジェネレータ版
・「終端を持たない範囲オブジェクト」はRuby 2.6.0から
2024/02/24(土) 00:25:03.27ID:f2xn4abB
>>234
Ruby
https://paiza.io/projects/2G8vPQJQOBZecXPD5ZIFTQ?language=ruby
281279
垢版 |
2024/02/24(土) 13:21:16.94ID:aSUCvHSH
>>234 ruby 2.5.5
https://ideone.com/04fxGM
・ジェネレータ版ちょっとアレンジ
・to_sしてto_iするのをやめた
2024/02/24(土) 14:25:41.40ID:NZEL8Kud
異なる自然数 a, b (a > b) における a^3 - b^3 を「a, b の三乗差」と呼ぶことにする。
異なる5通りの組(a, b) (c, d) ... (j, k) について三乗差がすべて相等しいとき
その組(a, b)...(j, k) および三乗差自体を求めよ
異なる6通りの組で三乗差が相等しい場合があるかも検討せよ
283デフォルトの名無しさん
垢版 |
2024/02/24(土) 16:47:38.19ID:KRWvIUHe
>>282
[(1134, 357), (1155, 504), (1246, 805), (2115, 2004), (4746, 4725)]
a^3 - b^3 == 1412774811
28417
垢版 |
2024/02/24(土) 16:52:08.36ID:Pf8MFN4C
数学、か・・・
2024/02/24(土) 18:16:29.01ID:O6Cw1j13
>>282 ruby
https://ideone.com/wBX9Rs
・そのまま版
・5秒じゃ_
286デフォルトの名無しさん
垢版 |
2024/02/24(土) 20:03:55.52ID:mNVJyIZh
>>234
>>274を巨大整数対応にした。
https://ideone.com/Hg3kGJ
287デフォルトの名無しさん
垢版 |
2024/02/24(土) 22:30:55.28ID:mNVJyIZh
>>282
aが5000以下限定で>>283の解はRで5秒以内に求められた。8〜9行目は下三角行列の要素番号から
行番号と列番号を求めているだけで、>>282を解く特別なアルゴリズムというわけではない。
https://ideone.com/w4X3DC
288285
垢版 |
2024/02/25(日) 08:52:58.18ID:M1xmyD2F
>>282 ruby 2.5.5
https://ideone.com/4GdMaO
・285の無駄なループ回数を削減
・でも5秒じゃ_
289デフォルトの名無しさん
垢版 |
2024/02/25(日) 21:06:57.77ID:CUQUyFSy
>>282
>>287は下三角行列の要素番号から列番号を求めるのに2次方程式を解くのが分かりにくかったから、
各列の最下行の要素番号を計算しておいてそれを二分探索するように変更した。
https://ideone.com/Tefgkh

n = 25000で実行してみても、n = 5000ときの解のa, bを両方とも2, 3, 4, 5倍した解しか別に
見つからなかった。
290デフォルトの名無しさん
垢版 |
2024/02/26(月) 22:18:39.21ID:CjcYgBx5
>>282
>>289と似た手順でC++
https://ideone.com/nFRsrK

Rではソートする前に重複値だけを抽出しているが、C++のunique関数はソート済みデータにしか
使えないので使っていない。
291288
垢版 |
2024/02/27(火) 21:45:30.42ID:nu8aoj+0
>>282 c
https://ideone.com/eM18H1
・288の移植
292デフォルトの名無しさん
垢版 |
2024/02/27(火) 22:30:42.88ID:BJV11H6M
>>282
下三角行列の各列内の要素は昇順で既に並んでいるのに、>>290は下三角行列の全要素を
ソートして無駄なので、列のマージに変更(要するにマージソートを途中段階から開始)
したら少し速くなった。
https://ideone.com/EZSvB3

n = 10000でも5秒以内に終わった。
https://ideone.com/huQiBe
293288
垢版 |
2024/02/28(水) 22:00:05.18ID:7ZY4TL6q
>>282 c++
https://ideone.com/teo5Mm
・288の移植

>>282 rust
https://ideone.com/G94aN3
・288の移植
294デフォルトの名無しさん
垢版 |
2024/02/28(水) 23:21:09.16ID:FCtvUtiC
>>282
>>292とは別の方法で>>290を高速化
https://ideone.com/QxjmyT

1³, 2³, 3³, …, 5000³をD = 5001で割った余りはすべて異なる値になるから、d = a³ − b³を
Dで割った余りはどれか1つの値に偏ることなく均等に分布する。dをDで割った余りによりdを
区分すれば、各区分に入る個数はどれも多すぎないのでソートに時間が余りかからない。
Dの値はconstexpr関数によりコンパイラに計算させている。n = 10000, 15000のときは
それぞれD = 10002, 15009になる。
295291
垢版 |
2024/02/29(木) 22:20:45.85ID:HlaTo1dC
>>282 c
https://ideone.com/JnJpJW
・291から省メモリ化
 旧:unsigned int values[10];
 新:unsinged short values[4];
296デフォルトの名無しさん
垢版 |
2024/03/01(金) 22:22:26.10ID:6k2oCbjk
>>282
C++
https://ideone.com/1c4s5I
>>294はa, bの二重ループ内でa³ − b³をD = 5001で割った余りrにより区分していたが、
rのループ内でa, bを変化させるように変更したら、2次元配列がなくなってすっきりした。
その結果、メモリ使用量が激減し、nが大きい場合でも実行できるようになった。
297デフォルトの名無しさん
垢版 |
2024/03/01(金) 22:23:18.03ID:6k2oCbjk
>>296の続き
n = 1000000, m = 6で実行すると、12通りの解が見つかった。

[6つ組解]
424910390480793: (75978, 23919), (77385, 33768), (83482, 53935), (141705, 134268), (317982, 316575), (596001, 595602)
620174235433536: (86184, 27132), (87780, 38304), (90237, 48573), (94696, 61180), (160740, 152304), (360696, 359100)
1238805803151000: (107487, 14487), (108540, 34170), (110550, 48240), (119260, 77050), (454260, 452250), (851430, 850860)
1384074844012224: (112152, 29844), (125324, 83600), (130050, 93426), (159372, 138624), (224928, 215412), (357447, 353799)
1936290882196125: (127629, 52254), (133320, 75675), (149285, 111620), (228525, 215430), (246510, 235395), (290214, 282339)
4589726535576000: (170172, 69672), (177760, 100900), (185265, 120945), (304700, 287240), (328680, 313860), (386952, 376452)
4961393883468288: (172368, 54264), (175560, 76608), (180474, 97146), (189392, 122360), (321480, 304608), (721392, 718200)
11072598752097792: (224304, 59688), (250648, 167200), (260100, 186852), (318744, 277248), (449856, 430824), (714894, 707598)
36717812284608000: (340344, 139344), (355520, 201800), (370530, 241890), (609400, 574480), (657360, 627720), (773904, 752904)
52279853819295375: (382887, 156762), (399960, 227025), (447855, 334860), (685575, 646290), (739530, 706185), (870642, 847017)

[7つ組解]
15490327057569000: (249281, 6281), (255258, 104508), (266640, 151350), (298570, 223240), (457050, 430860), (493020, 470790), (580428, 564678)
123922616460552000: (498562, 12562), (510516, 209016), (533280, 302700), (555795, 362835), (597140, 446480), (914100, 861720), (986040, 941580)

6つ組解の(2, 7), (4, 8), (5, 10), (6, 9)番目は各括弧内で自然数比になっている。
6つ組解の5番目の2倍は7つ組解の1番目のうちの6組を構成している。
298デフォルトの名無しさん
垢版 |
2024/03/01(金) 22:24:42.81ID:6k2oCbjk
>>282
C++
https://ideone.com/tM1cuo
>>296のrのループ内でa³ − b³をD2 = 5003で割った余りr2により区分し、それぞれの区分ごとに
解を探すようにしたら速くなった。ただし、nが大きい場合にはかえって遅くなる。
299◆QZaw55cn4c
垢版 |
2024/03/03(日) 19:08:39.58ID:75HCbpT6
>>297
出題者です。
すごいです。ありがとうございます。私の手元ではまだ6通り解、7通り解のひとつも入手できていないので、参考になりました
私のアルゴリズムは効率が悪いようですね
300デフォルトの名無しさん
垢版 |
2024/03/03(日) 22:19:54.92ID:ZEDvt9uH
>>282
C++
https://ideone.com/LEU7EV

>>298でnを大きくするにつれ>>296に対する高速化効果が薄れていくのは、ABをvectorでなく
配列にしたらある程度改善された。n = 5000のときの実行時間は>>296の半分以下になった。
ただし、n = 1000000まで大きくすると、296よりやっぱり遅くなる。

>>299
どんなプログラムを書いたのか見せて。
301デフォルトの名無しさん
垢版 |
2024/03/06(水) 22:35:52.23ID:lIZep5aT
>>282
C++
https://ideone.com/PG6UiY
>>300の実行時間を分析すると、最も時間が掛かっているのは46〜と47行目だと判明した。
そこで配列ABの第1次元と第2次元を入れ替えてみると、n = 5000では変わらないが、
1万, 2万, 5万, 10万, 20万では35%前後高速になった。これは、改良前には第2次元の添字が
小さい要素に書き込みが集中しているため、改良後のように第1次元に入れ替えた方が
纏まったメモリ領域に書き込みが集中しキャッシュの効きが良くなるからだと考えられる。
一方、n = 100万で高速化しないのは、書き込み集中領域が大きすぎるからだろう。

https://ideone.com/6RzW0n
n = 100万の場合にはr2の値によってデータを多数の列へ振り分けるのをやめ、列を1つにして、
その内部でr2の値により2種類に区分し、それぞれの内部で2種類にさらに区分し、…と再帰的に
区分していけば(要するにクイックソートの変形版)、1つの配列内での要素のスワップだけで済み、
キャッシュの効きが改善されるとの予想通り、n = 100万で実行速度は>>296より25%速くなった。
(原理的には>>300より非効率なのでn = 5000では>>300より当然遅い)
2024/03/08(金) 19:02:53.21ID:oHHhAfhn
>>301
ハズレが多いから2passは効果ある?
303デフォルトの名無しさん
垢版 |
2024/03/09(土) 22:13:47.64ID:C74EWG6S
>>282
C++
https://ideone.com/xQD1W8
関数mainのループで配列A, B, Pに書き込まずdにだけ書き込むようにし、関数FindDuplicatesで
dの添字Pではなくdそのものをソートするように変えて、n = 1000000の場合に>>301より10%高速化。
関数PrintSolutionでa, bをmainでと同じ方法で再計算するのは非効率だが、PrintSolutionは僅か12回しか
呼ばれないため、全体の実行時間への影響は無視できる。
2024/03/09(土) 22:47:01.30ID:v99WCN19
お題

460円 580円 600円 の3種類の商品があります
これらを組み合わせて合計10個買ったら5360円になりました
組み合わせを求めるプログラムを書いてください

ちなみに答えの一つは
・600円×2
・580円×4
・460円×4
だそうです

https://rio2016.5ch.net/test/read.cgi/cigaret/1706726196/56-57
305デフォルトの名無しさん
垢版 |
2024/03/09(土) 23:59:51.39ID:C74EWG6S
>>304
面倒なのでRで全探索
https://ideone.com/vrtYvk
2024/03/10(日) 01:20:18.65ID:8NU5B5F+
>>304
面倒なので全て460円を引くと
A=0円 B=120円 C=140円
10個で760円という問題

面倒なのでさらに20で割ると
A=0円 B=6 C=7円
10個で38円という問題

つまり唯一奇数のCは偶数個が確定
Cが6個以上だと42円以上でオーバーしてNG
Cが4個だと28円で残り10円をA,Bで作れないからNG
Cが2個だと14円で残り24円はBが4個で残り4個がA
Cが0個だと0円で残り38円をA,Bで作れないからNG
つまり解は(A,B,C)=(4,4,2)しかない
307デフォルトの名無しさん
垢版 |
2024/03/10(日) 11:20:30.42ID:Doj9A/yB
>>306
すごすぎるだろ、日本の未来を頼む
308デフォルトの名無しさん
垢版 |
2024/03/10(日) 19:06:13.20ID:qBLPZ6x8
>>304
Rで全探索でなくちゃんと解くと
https://ideone.com/F44pCL

解が複数ある場合と全くない場合の例として、600円を540円と520円に変更したときの出力も載せた。
2024/03/10(日) 20:08:55.20ID:6qxPF4Wx
2pass案は多少工夫したらかなり速い

n ␣␣m ␣296␣ ␣301-1 ␣301-2 ␣303␣ ␣2pass
5k␣␣5 ␣ 0.5s ␣ 0.1s ␣ 0.5s ␣ 0.4s ␣ 0.1s
25k ␣5 ␣12.7s ␣ 2.5s ␣13.9s ␣11.1s ␣ 1.7s
100k␣5 ␣3m52s ␣49.3s ␣4m13s ␣3m26s ␣38.9s
1M* ␣6 ␣8h23m ␣2h50m ␣8h51m ␣6h43m ␣1h11m
*n=100万は1万サンプルの部分ループ500k≦r<510kから100倍

>>301の296と301-2の比較記述と違う傾向があるのはキャッシュ階層の違いだと思う
2passは301-1に近いけど1pass目でのランダムアクセスサイズを落としながらも
誤判定率を低く抑える(0.2%~2%)工夫をするのがお楽しみだと思う
2024/03/14(木) 14:43:15.33ID:ZraPd1+Q
2024/03/27(水) 23:42:08.75ID:sRZ89+IF
>>304

a = (600, 580, 460)
m = min(a)
h = set()

def buy(b, yen):
if yen < m: return
for i in range(0, len(a)):
v = a[i]
if yen >= v:
b[i] += 1
if yen == v:
h.add(str(b))
else:
buy(b, yen - v)
b[i] -= 1

buy([0, 0, 0], 5360)
for s in h: print(s)
312デフォルトの名無しさん
垢版 |
2024/03/27(水) 23:55:15.74ID:qNf/D02g
>>304
Haskell

[(a, b, c) | a <- [0..20], b <- [0..20], c <- [0..20], a * 460 + b * 580 + c * 600 == 5360]

output: [(0,2,7),(4,4,2)]
313デフォルトの名無しさん
垢版 |
2024/03/28(木) 00:00:41.99ID:0Zoa9Vsx
合計10個という条件忘れてた。

[(a, b, c) | a <- [0..20], b <- [0..20], c <- [0..20], a + b + c == 10, a * 460 + b * 580 + c * 600 == 5360]

output: [(4,4,2)]
2024/03/31(日) 11:57:53.31ID:enek7T1c
大幅に手直しした
特に前回数値が一部出てこない状態になっていたので色々と手動で最適化した
新しいアイディアを思いつかない限りはシングルスレッドでの限界に近いと思う

n m 301-1 303 2pass 2pass'
5k 5 0.1s 0.4s 0.1s 0.1s
25k 5 2.5s 11.1s 2.3s* 1.7s
100k 5 49.3s 3m26s 38.9s 27.7s
1M* 6 2h50m 6h43m 1h11m 48m10s
2M* 6 17h06m 28h27m 5h47m 3h13m
Max* 6 35h51m 51h23m 11h09m 5h47m

*前回>>309 2pass n=25kの再計測値
*n=1Mは部分ループ500k<=r<510kから100倍
*n=2Mは部分ループ500k<=r<505kから400倍
*Max:=2642245は3乗がUINT64に収まる最大
*n=Maxは部分ループ500k<=r<500k+3785から2642245/3785倍

ヒント含みの数値がこちら

n D1 D2 D3 = 5000 5001 5003 5009
false_positive = 23 / 5001 = 0.46%
total_t_pass1 = 64.220 ms 2.568 ns/iter
total_t_pass2 = 0.044 ms 0.381 ns/iter
real 0m0.097s
2024/03/31(日) 11:58:50.32ID:enek7T1c
n D1 D2 D3 = 25000 25003 25005 25006
false_positive = 171 / 25003 = 0.68%
total_t_pass1 = 1654.681 ms 2.647 ns/iter
total_t_pass2 = 1.407 ms 0.329 ns/iter
real 0m1.709s

false_positive = 2211 / 100005 = 2.21%
total_t_pass1 = 27338.298 ms 2.734 ns/iter
total_t_pass2 = 78.402 ms 0.355 ns/iter
real 0m27.692s

n D1 D2 D3 = 1000000 1000002 1000009 1000015
false_positive = 18 / 10000 = 0.18%
total_t_pass1 = 28674.338 ms 2.867 ns/iter
total_t_pass2 = 5.642 ms 0.313 ns/iter
real 0m28.897s

n D1 D2 D3 = 2000000 2000003 2000013 2000015
false_positive = 13 / 5000 = 0.26%
total_t_pass1 = 28777.424 ms 2.878 ns/iter
total_t_pass2 = 8.620 ms 0.332 ns/iter
real 0m29.015s

n D1 D2 D3 = 2642245 2642246 2642253 2642258
false_positive = 315 / 3785 = 8.32%
total_t_pass1 = 29210.857 ms 2.921 ns/iter
total_t_pass2 = 336.864 ms 0.405 ns/iter
real 0m29.800s
316デフォルトの名無しさん
垢版 |
2024/03/31(日) 22:30:39.09ID:4FIGx2uN
>>304
ぶっちゃけ、他の言語の人と同じっぽくないので心配なんだが…。
自分なりにHaskellで全探索じゃないバージョン書いてみた。

Haskell

[(a, b, c) | a <- [0..10], b <- [0..10 - a], c <- [0..10 - (a + b)], a * 460 + b * 580 + c * 600 == 5360, a + b + c == 10]

答えは同じ[(4,4,2)]。
2024/04/01(月) 04:52:23.91ID:iTC1bSa8
少し一般化して、N個の商品があり、i番目の商品はA_i円です
合計M個購入し、価格の合計がS円であるような購入の仕方を998244353で割った余りを求めてください
だとO(N M S)より小さい計算量で解けるのかな
2024/04/01(月) 16:50:08.47ID:0Kkx57P3
2個、4個、8個…みたいにメモ化すればMはlogMにできるかもしれんね
空間がlogM倍されそうだが
319デフォルトの名無しさん
垢版 |
2024/04/13(土) 11:43:17.27ID:itq2kjOw
ヘロンの公式を実装せよ

使用言語:C
32017
垢版 |
2024/04/13(土) 16:57:10.76ID:SxW/5mRR
>>319
https://paiza.io/projects/_ZdSzHtV9YdEzV-oOySQWQ

Wikipedia でヘロンの公式を調べてそのまま実装しただけで、ほとんど何も考えてない。
321デフォルトの名無しさん
垢版 |
2024/04/13(土) 23:01:22.75ID:wFZkrOeZ
>>319
https://ideone.com/YCi6qe
ヘロンが作ったもう1つの式である平方根を加算と除算の繰り返しで求める式も使用。
sqrt関数を呼び出すより実行形式ファイルサイズがほんの少しだけ小さくなる。
2024/04/14(日) 00:59:32.83ID:ujzJ2+0Y
>>321
無限ループにならない?
機械イプシロン(DBL_EPSILON)とか気になる
323デフォルトの名無しさん
垢版 |
2024/04/14(日) 18:34:21.49ID:MHeAinLP
解答例

#include <stdio.h>
#include <math.h>

void heron(double, double, double);

int main(void)
{
double a, b, c;
printf("3辺a, b, cを入力せよ ");
scanf("%lf,%lf,%lf", &a, &b, &c);

heron(a, b, c);
}

void heron(double x, double y, double z) // heronの定義
{
double s, t;

s = (x+y+z)*0.5;
t = s*(s-x)*(s-y)*(s-z);

printf("3角形の面積は S=%g\n", sqrt(t));

return;
}
324デフォルトの名無しさん
垢版 |
2024/04/14(日) 18:36:52.16ID:MHeAinLP
>>321 さすがですね
325デフォルトの名無しさん
垢版 |
2024/04/15(月) 21:01:04.41ID:dSNEYg5r
>>322
p < 0 のとき(= 三角形を作れない場合)は浮動小数点数の特性に関係なく無限ループになる。
sqrt(p) と同様にNANを返すには、if (p < 0) return 0 / (p - p); を追加すれば良い。

p > 0 のときは無限ループにならないはず。以下が検証プログラム。
https://ideone.com/mzemEM

x = sqrt(p), y = p / x とすると、浮動小数点数の特性により x == y とならない場合は存在する。
このとき、xとyの仮数部を整数と見なした値(以降では「仮数整数」と呼ぶ)の差は1なので、
z = (x + y) / 2 はxとyのうち仮数整数が偶数の方に一致する。zを新たなxとして代入しyとzを
再計算すれば、今度はxの仮数整数が偶数なのでzはxに必ず一致し、>>321の収束判定条件が成立する。

具体例で見ると、p = 2 のときはxの仮数整数が奇数なので x != z となるが、zを新たなxとして代入し
再計算すれば x == z が成立する。桁上がりが起こる p = 3.9999999999999996 のときも、同様に
再計算で x == z が成立する。p = 3 のときはxの仮数整数が偶数なので x == z が成立し再計算は不要。
2024/04/15(月) 22:06:46.39ID:MxMoolaJ
>>325
解説ありがとう
俺には理解できないレベルだと分かりましたw
俺なら収束の自信が無くてDBL_EPSILONを使った判定と
ループ回数上限を組み合わせて実装しそうだ
2024/04/17(水) 05:47:35.77ID:F2fqxIYT
ヘロンの公式はそのままだと、数値計算での安定性が良くないらしいぞ
解決策は、Wikipediaの英語版の方に…
tps://en.wikipedia.org/wiki/Heron%27s_formula#Numerical_stability
328327
垢版 |
2024/04/17(水) 05:52:23.77ID:F2fqxIYT
そしてこんなとこでもカハンせんせーの名前がが
329デフォルトの名無しさん
垢版 |
2024/04/17(水) 16:28:33.14ID:7JRzlbtx
の長さ
この公式で計算される面積は、理論的には正しい値です。しかし、実際には、以下の理由で誤差が生じる可能性があります。

数値計算の誤差: 計算機で数値を扱う場合、有限桁しか扱えないため、丸め誤差が生じます。特に、辺の長さの値が大きく異なる三角形の場合、この誤差が顕著になります。
四捨五入誤差: 計算結果を小数点以下n桁まで表示する場合、n桁目以降の数字を切り捨てます。この四捨五入誤差も、面積の誤差に影響を与えます。

by Gemini
330デフォルトの名無しさん
垢版 |
2024/04/17(水) 23:38:33.35ID:k4k/eSae
>>327に載っている参考文献
 William M. Kahan, ‘Miscalculating Area and Angles of a Needle-like Triangle’
 http://www.cs.berkeley.edu/~wkahan/Triangle.pdf
のTable 1の問題がパソコン等でのC++プログラムでも再現されるか試してみた。
 https://ideone.com/r4toUS

Table 1とは違い、Accurate Δが概ね正確な場合にHeron's Δ'が大きく懸け離れた不正確な値に
なってしまうことはなく、ほぼ同じ値になり差はごく僅かしかない。Table 1のような不安定性は
Table 1の計算に使われたプログラマブル関数電卓に特有の問題で、パソコン等のプログラムでは
再現されない。(パソコン等のdoubleの方が精度が高いので当然と言えば当然だが)

一方、(a, b, c) = (5278.64055, 94721.35941, 99999.99996)の場合は、逆にHeron's Δ' = 0が
正確なのにAccurate Δ = 9.53674324543714が大きく懸け離れた不正確な値になってしまう
重大な欠点がある。これは、Accurate Δの式の根号内の第2因数c - (a - b)が正確には0なのに
3.63797880709171e-12と計算されてしまい、この誤差が他の因数との乗算により増幅されるから。
Heron's Δ'の式の根号内の第4因数s - cは0と計算されるので問題ない。

double向けの入力値(a, b, c) = (31622.77777777662, 0.000000000023, 31622.77777777661)を
作れば、Heron's Δ' = 2.30085990753844e-07, Accurate Δ = 3.20111707955507e-07となり、
相対差は確かに大きくなるが、200ビットで計算したほぼ正確な値3.27490470056059e-07から
見れば両方とも不正確だから、Accurate Δの利点はない。

だから、パソコン等のプログラムでは改良版の式を使う必要がないどころか使うべきではなく、
ヘロンの公式をそのまま使う方が良い。
2024/04/18(木) 07:16:50.63ID:8T8m8Yde
>(a, b, c) = (5278.64055, 94721.35941, 99999.99996)
>c - (a - b)が正確には0なのに3.63797880709171e-12と計算されてしまい

この例に限らず、たいていの場合a,b,cはdoubleでexactに格納されて無くて
この例では「c - (a - b)が正確には0」なのをチョイスしただけでは?
2024/04/18(木) 07:30:10.21ID:PYBA8OB3
パソロジカルな三角形をパラメトライズして面積を積分する検証はどう?
数式計算での正確な値
Heronで面積計算した時の数値積分
Accurateで面積計算した時の数値積分
を比べるのがフェアかなぁと
2024/04/18(木) 07:34:09.77ID:PYBA8OB3
> 200ビットで計算したほぼ正確な値3.27490470056059e-07
この例だけ見るとAccurate Δの方が優れているように見えるので

>>331の様なチェリーピックはどちらの計算式でも出来るので平均的に近似が近い方が精度的に優れているかと
334デフォルトの名無しさん
垢版 |
2024/04/18(木) 22:41:59.70ID:y7NBfn6/
>>331
その通り。そして、(a, b, c) = (10000.1, 10000.2, 20000.3)とすれば、正しい面積は0なのに
Heron's Δ' = 2.69745899635295とAccurate Δ = 1.34872949817647は両方とも大間違いになる。
この場合のようにHeron's Δ'での問題がAccurate Δで改善されないだけでなく、>>331の引用の
場合のようにHeron's Δ'では結果的に問題ないのにAccurate Δでは新たな問題が生じてしまうのは、
参考文献の11ページで述べられた

 An algorithm stood convicted of numerical instability if it could be replaced by
 a new algorithm at least about as fast and accurate as the old for all data,
 and good for all data for which the old algorithm was bad.

 すべてのデータに対して旧アルゴリズムと少なくとも同じくらい高速かつ正確であり、
 かつ旧アルゴリズムが悪くなるすべてのデータに対して良くなる新アルゴリズムによって
 置き換えることができるとしたら、旧アルゴリズムは数値的に不安定と判定される。

という判定条件を満たさないから、Accurate Δは改良版としての適性を欠く。

>>333
その例では有効桁数がHeron's Δ'は0桁、Accurate Δは1桁しかなく、どちらの品質も絶対的に
劣悪で、それらの間の相対的な優劣に大した意味はない。

そもそも針のように異様に細長い三角形が重箱の隅をつつくような話で、普通はそんな場合は
想定しなくても良く、ヘロンの公式で充分。そこを敢えてつつくなら、ヘロンの公式だけでなく
改良式もぼろが出てしまうだけ。
2024/04/18(木) 22:55:38.47ID:n9UdHBZN
総合すると有効桁じゃなくて精度が2桁良いし実装上は大差ないから改良版を使う、と言う方が自然では?
336デフォルトの名無しさん
垢版 |
2024/05/01(水) 12:56:47.83ID:nIC3qyB/
スレ落ちそうなのであげ
2024/05/01(水) 15:39:17.16ID:hqp8cDbc
>>336
嵐を呼び込むために・・・
2024/05/01(水) 22:59:10.72ID:4hNncNW1
何でこんなに過疎化しちゃったのか。前に頻繁に出題していた人がいなくなったのか。
2024/05/02(木) 10:32:38.87ID:ijoO2C2L
お題を出してみてください
340デフォルトの名無しさん
垢版 |
2024/05/02(木) 16:59:52.63ID:DPVqLIsI
>>338
お題が出尽くしたってことはあるんじゃないか?
過去のお題拾ってきてそれを投稿すればいいぐらいまでスレが成熟してしまったのでは?
341デフォルトの名無しさん
垢版 |
2024/05/02(木) 17:21:22.07ID:pg1ymc2D
PC買って、脱衣AIで遊びまくってる「
一日一回無料で使えるみたい「
https://mao.5ch.net/test/read.cgi/gymnastics/1322657462/98
34217
垢版 |
2024/05/02(木) 18:44:04.16ID:LxBZq7I4
>>340
なるほど。それをやるか。
34317
垢版 |
2024/05/14(火) 05:34:03.62ID:ou5vbzLn
じゃあ10年前のこのお題(URLを書くとNGになるようなので書かない)。

プログラミングのお題スレ Part4
115 :デフォルトの名無しさん:2014/06/21(土) 18:36:45.72 ID:/fMJIWig.net

お題:文字列Aを1回以上繰り返した文字列Bが与えられたとき
文字列Aを求める。ただしAの候補が複数ある場合は最短のものとする。

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -> a
123412312341231234123123412312341231234123 -> 1234123
oxoxoxoxoxoxoxoxxoxoxoxoxoxoxoxoxx -> oxoxoxoxoxoxoxoxx
2024/05/14(火) 17:27:18.46ID:AXiunB2g
ttps://ideone.com/KrUq7e
Z-algorithm を使って O(|B|) で解いてみた
345 警備員[Lv.4][初]
垢版 |
2024/05/14(火) 20:59:46.84ID:xk+62xOP
>>343
R
https://ideone.com/ITR83u

C
https://ideone.com/g2INyj
346 警備員[Lv.18]
垢版 |
2024/05/23(木) 14:16:50.64ID:zV267ZMC
あれ?どんぐりの都合か?URL書いてあると書けなくなったような?
347 警備員[Lv.18]
垢版 |
2024/05/23(木) 14:17:56.56ID:zV267ZMC
URLの先頭のhを抜いて書いてみよう。

>>343
Kotlin

こちらは普通に自作したやつ。
ttps://paiza.io/projects/OYy-A5rfKg7RqLzv-DKMIA

こちらは正規表現使ってとても小さくなったやつ。
ttps://paiza.io/projects/jgmtMRDhKfcjYfGAglEl3g
2024/06/01(土) 10:16:34.91ID:hzaQXY32
お題: コロン区切りの時分秒の時刻が与えられるので時分秒をそれぞれ掛け算した結果を表示せよ

例:
04:05:06
120
2024/06/01(土) 11:08:12.83ID:hzaQXY32
お題: バイト列が与えられる。先頭から解析した場合にバイトが1だったら次の4バイトを読み込んで整数として出力し、バイトが2だったら次のバイトを0が来るまで読み込んで文字列として出力せよ

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

出力
1ABC128
2024/06/01(土) 12:57:50.32ID:M5I0DyuF
知らんがな
351デフォルトの名無しさん
垢版 |
2024/06/01(土) 23:31:08.51ID:oEZc8FHN
>>348
R
https://ideone.com/x4hIYG

>>349
C (データ識別子は1か2しかないものとし、整数のエンディアンは実行環境依存とする)
https://ideone.com/aJts6n
352 警備員[Lv.19]
垢版 |
2024/06/02(日) 04:45:03.04ID:yi3OE76t
>>348
Perl

bash のコマンドラインから入力して実行(ワンライナー)

$ perl -ne 'if(/(\d+):(\d+):(\d+)/){print $1*$2*$3,"\n"}else{print"入力エラー\n"}'
1:2:3
6
3:4:5
60
04:05:06
120
$
353 警備員[Lv.20]
垢版 |
2024/06/02(日) 05:19:02.45ID:yi3OE76t
>>349
Kotlin
https://paiza.io/projects/lk2q4-Ciny3H2NptrkAbcw
2024/06/03(月) 13:25:02.42ID:21u+58W3
>>348
Windows のPowershell 上で、Ruby の1-liner を使う

末尾の改行を削除して、: で分割して、
文字列を数値型に変換してから、全ての要素を掛ける。
%Q で、ダブルクォーテーションをエスケープする。つまり、split(":")

echo '01:2:09' | ruby -ne 'puts $_.chomp.split(%Q[:]).map(&:to_i).inject(:*)'

18
2024/06/03(月) 15:28:01.42ID:p+D7Hh++
>ruby -ne 'p eval($_.gsub(":","*"))'
1:2:9
18
2024/06/07(金) 06:27:47.87ID:ZJzD8UbY
お題:引数sとnを取りシーザー暗号化を行う関数を作れ
sは平文、nはずらす文字数(負数可)、返り値は暗号化後の文字列
同様の関数で「Hello, World!」を暗号化し復号化せよ
2024/06/07(金) 09:04:03.36ID:tQi+9x5m
#! ruby

class String
def to_c(n)
if %r|^n|=~n
n=(n.sub(%r|^n|,"").to_i+26)%26
lb=("A".."Z").to_a.join
sb=("a".."z").to_a.join
la=lb[n..25]+lb[0..n-1]
sa=sb[n..25]+sb[0..n-1]
return self.tr(lb,la).tr(sb,sa)
else
return self
end
end
end

p "Hello,World!".to_c("n3") #=>"Khoor,Zruog!"
p "Hello,World!".to_c("n-5") #=>"Czggj,Rjmgy!"
p "Hello,World!".to_c("s") #=>"Hello,World!"
p "Khoor,Zruog!".to_c("n-3") #=>"Hello,World!"
p "Czggj,Rjmgy!".to_c("n5") #=>"Hello,World!"
2024/06/07(金) 09:04:13.66ID:tQi+9x5m
#! ruby

class String
def to_c(n)
if %r|^n|=~n
n=(n.sub(%r|^n|,"").to_i+26)%26
lb=("A".."Z").to_a.join
sb=("a".."z").to_a.join
la=lb[n..25]+lb[0..n-1]
sa=sb[n..25]+sb[0..n-1]
return self.tr(lb,la).tr(sb,sa)
else
return self
end
end
end

p "Hello,World!".to_c("n3") #=>"Khoor,Zruog!"
p "Hello,World!".to_c("n-5") #=>"Czggj,Rjmgy!"
p "Hello,World!".to_c("s") #=>"Hello,World!"
p "Khoor,Zruog!".to_c("n-3") #=>"Hello,World!"
p "Czggj,Rjmgy!".to_c("n5") #=>"Hello,World!"
359デフォルトの名無しさん
垢版 |
2024/06/07(金) 21:13:26.78ID:U/DqAKAj
>>356
R
https://ideone.com/Qj6B3w
360デフォルトの名無しさん
垢版 |
2024/06/07(金) 23:24:01.54ID:KUK95Vnh
Haskell
範囲外の数値は平文字をそのまま返すこととした。

import Data.Char

cearsar n |(-26) <= n && n <= 26 = map (f n)
where
f x = chr.(+x).ord
cearsar _ = cearsar 0

sample:
ghci> cearsar 50 "Hello, World!"
"Hello, World!"
ghci> cearsar 3 "Hello, World!"
"Khoor/#Zruog$"
ghci> cearsar (-3) "Khoor/#Zruog$"
"Hello, World!"
2024/06/07(金) 23:28:58.71ID:KMptjexu
TA = [ * ?\x20 .. ?\x7E ]
TS = TA.join
def caesar( s, n ) s.tr( TS, TA.rotate( n ).join ) end

s = "Hello, World!"
p caesar( s, 0 ) #=> "Hello, World!"
p caesar( s, 1 ) #=> "Ifmmp-!Xpsme\""
p caesar( s, -1 ) #=> "Gdkkn+~Vnqkc "
p caesar( s, 20240607 ) #=> "Jgnnq.\"Yqtnf#"
p caesar( caesar( s, 20240607 ), -20240607 ) #=> "Hello, World!"
p caesar( 'HAL9000', 1 ) #=> "IBM:111"
3629
垢版 |
2024/06/11(火) 14:41:10.23ID:NjINqn/m
>>348 Perl5

($x = '04:05:06') =~ s/:/*/g;
print eval $x;
3639
垢版 |
2024/06/13(木) 14:34:57.00ID:XgNTPGgf
>>349
> 「バイトが1だったら次の4バイトを読み込んで整数として出力し、」
正直、意味がわからんかった

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

1に続く4バイトを加算して出力するって意味だったのかいな
2024/06/13(木) 14:48:43.48ID:sldne70j
>>363
整数が4バイト型という脳内補完だった
2024/06/13(木) 14:54:19.57ID:lNMgjwmg
>>363
出題者がエンディアンを知らなくて説明もなくリトル環境を前提にしてしまっている
エンディアンを知っている人たちは出題には書かれてないけど例よりリトル前提だと読み取ってこたえている
366デフォルトの名無しさん
垢版 |
2024/06/13(木) 14:59:03.73ID:fAZ1qthZ
>>365
リトルエンディアンはビットが逆って事じゃ無いぞ

10 00なら
00 10だぞ
2024/06/13(木) 15:00:51.22ID:lNMgjwmg
>>366
>>363を見てないのか?
3689
垢版 |
2024/06/13(木) 17:03:39.85ID:XgNTPGgf
>>365
ああそういうことか「4バイトを読み込んで整数」と書いてあるのはそういう意味だったのか
ならわかるかも。
オレは4バイト一個一個が整数だと捉えて、それを「4バイトを読み込んで整数」とは何のこっちゃと?になってたわ
3699
垢版 |
2024/06/13(木) 17:07:01.55ID:XgNTPGgf
すまんね68系で育ったもんですぐ連想できなんだ
370デフォルトの名無しさん
垢版 |
2024/06/14(金) 21:10:23.18ID:H7FTNa+g
>>367
例が間違えてるか説明が足りて無い

要は4バイトを読み込んでと説明してるが「一気に4バイト読み込む」とおかしくなる
1バイトずつ順に4バイトを読み込んでという説明なら例が腑に落ちる
2024/06/14(金) 21:15:46.04ID:cNkcubsv
例を示しての出題だから
372 警備員[Lv.23]
垢版 |
2024/06/15(土) 16:15:42.96ID:h/vMPGM+
>>356
Kotlin

面倒なのでASCIIコード(0x20-0x7e)でしかシフトしないやつを作った。
まあでも Kotlin は Java 同様に内部でUnicodeで扱っているので平仮名とか漢字とか全然違う言語の文字とかも比較的楽に追加できると思う。

https://paiza.io/projects/5H9H1zSjDnVshGCf4JaQJg
373デフォルトの名無しさん
垢版 |
2024/06/19(水) 15:22:47.09ID:xfTENZQh
>>348 awk
https://ideone.com/dMvvZG
374デフォルトの名無しさん
垢版 |
2024/06/20(木) 17:43:48.64ID:0f6ktMCR
お題:迷路生成を様々な言語で

例:
C
https://ideone.com/a527mc
2024/06/20(木) 20:17:47.11ID:0f6ktMCR
https://paiza.io/projects/a6ZS3co-gsEV1tN57VUctA
376デフォルトの名無しさん
垢版 |
2024/06/21(金) 02:17:42.15ID:wIxdZD1d
迷路。やっつけで汚い。乱数自前

C
https://paiza.io/projects/5vyyygrG7exduzqDa-jBAA

Rust
https://paiza.io/projects/g1UmjFWydgmjAEZAgqS5xw
2024/06/21(金) 05:01:41.33ID:wIxdZD1d
乱数改良

C
https://paiza.io/projects/UWRNkhfbdscMIwR0bTvqHA

Rust
https://paiza.io/projects/g1UmjFWydgmjAEZAgqS5xw
2024/07/26(金) 09:46:37.73ID:PcAUXe08
お題:配管サイズの「A呼称」「B呼称」の相互変換
tps://www.keyence.co.jp/ss/products/process/flowmeter/technique/size.jsp
などに掲載されている「A呼称」から「B呼称」への変換。及びその逆変換。
「A呼称」は整数値で(8とか)、「B呼称」は実数(0.125とか)または分母を8とする分数の分子(1とか)で表すものとする。
規格に存在しない場合(42Aとか)は考慮しなくてもよい。
表を引くだけなら簡単過ぎるので、ツェラーの公式の様な「技巧的」な解法を求む。
2024/07/27(土) 06:14:08.30ID:QMQQaL7S
REM 呼称変換.bat
chcp 65001

ruby -x "%~f0"
ruby tmp.rb
goto end

#~
#!ruby
#encoding: utf-8
Encoding.default_external='UTF-8'

require 'base64'

st=<<'EOS'
IyFydWJ5CiNlbmNvZGluZzogdXRmLTgKRW5jb2RpbmcuZGVmYXVsdF9leHRl
cm5hbD0nVVRGLTgnCgpjbGFzcyBPYmplY3QKICBkZWYgdG9fZmwKICAgIHJl
dHVybiBldmFsKHNlbGYuc3BsaXQoIisiKS5tYXB7fGV8CiAgICAgIGUuc3Bs
aXQoIi8iKS5tYXB7fGZ8IGYudG9fZi50b19zfS4KICAgICAgam9pbigiLyIp
fS5qb2luKCIrIikpCiAgZW5kCmVuZAoKY2xhc3MgTnVtZXJpYwogIEBAYT1b
Niw4LDEwLDE1LDIwLDI1LDMyLDQwLDUwLDY1LAogICAgICA4MCw5MCwxMDAs
MTI1LDE1MCwxNzUsMjAwLDIyNV0KICBAQGI9WyIxLzgiLCIxLzQiLCIzLzgi
LCIxLzIiLCIzLzQiLCIxIiwKICAgICAgIjErMS80IiwiMSsxLzIiLCIyIiwi
MisxLzIiLCIzIiwKICAgICAgIjMrMS8yIiwiNCIsIjUiLCI2IiwiNyIsIjgi
LCI5Il0KICBAQGM9QEBiLm1hcHt8ZXwgZS50b19mbH0KICBkZWYgYV90b19i
CiAgICBuPXNlbGYKICAgIGlmIG48MjUwCiAgICAgIGE9NgogICAgICBAQGEu
ZWFjaHt8ZXwgYT1lIGlmIGUvbjw9MS4wfQogICAgICBiPUBAYltAQGEuaW5k
ZXgoYSldCiAgICAgIGM9QEBjW0BAYS5pbmRleChhKV0KICAgICAgcmV0dXJu
ICIoYT0je2F9KSBiPSN7Yn09I3tjfSIKICAgIGVsc2UKICAgICAgYT0obi81
MCkudG9faSo1MAogICAgICBiPWEvMjUKICAgICAgcmV0dXJuICIoYT0je2F9
2024/07/27(土) 06:15:03.76ID:QMQQaL7S
KSBiPSN7Yn0iCiAgICBlbmQKICBlbmQKICBkZWYgYl90b19hCiAgICBuPXNl
bGYKICAgIGlmIG48MTAKICAgICAgYz0wLjEyNQogICAgICBAQGMuZWFjaHt8
ZXwgYz1lIGlmIGUvbjw9MS4wfQogICAgICBhPUBAYVtAQGMuaW5kZXgoYyld
CiAgICAgIGI9QEBiW0BAYy5pbmRleChjKV0KICAgICAgcmV0dXJuICIoYj0j
e2J9PSN7Y30pIGE9I3thfSIKICAgIGVsc2UKICAgICAgYj1uLnRvX2kKICAg
ICAgYT1iKjI1CiAgICAgIHJldHVybiAiKGI9I3tifSkgYT0je2F9IgogICAg
ZW5kCiAgZW5kCmVuZAoKd2hpbGUgMQogIGFyPVsi77yh5ZG856ew44GL44KJ
77yi5ZG856ewIiwi77yi5ZG856ew44GL44KJ77yh5ZG856ewIiwi57WC5LqG
Il0KICBtc2c9YXIubWFwLndpdGhfaW5kZXh7fGUsaXwiI3tpKzF9OiN7ZX0i
fS5qb2luKCJcbiIpKyJcbiIKICBwcmludCBtc2crImlucHV0IG51bWJlciA+
ICIKICBuPSRzdGRpbi5nZXRzLnRvX2kKICBicmVhayBpZiBuPT0zCiAgbmV4
dCBpZiBuPT0wCiAgd2hpbGUgMQogICAgcHJpbnQgIiN7YXJbbi0xXX06aW5w
dXQgdmFsdWUgPiAiCiAgICBtPSRzdGRpbi5nZXRzLmNob21wCiAgICBicmVh
ayBpZiBtPT0iIgogICAgbT1tLnRvX2ZsCiAgICBwdXRzIG0uYV90b19iIGlm
IG49PTEKICAgIHB1dHMgbS5iX3RvX2EgaWYgbj09MgogIGVuZAplbmQK
EOS

File.write("tmp.rb",Base64.decode64(st))
__END__
:end
381デフォルトの名無しさん
垢版 |
2024/07/30(火) 12:03:21.52ID:zP/xDheD
お題
C言語のトライグラフ(可能ならダイグラフも)と普通のテキストとの相互変換。

ファイルまたは標準入力から読んで変換した結果を標準出力に出力する。
面倒なら文字列変換する関数とそれをテストするメイン関数のみでも良い。
382 警備員[Lv.8]
垢版 |
2024/08/03(土) 07:16:23.70ID:HS6IEZQf
お題
Unicode 文字列を UTF-9 へ変換する。また UTF-9 を Unicode 文字列に変換する。
ただし1バイトが9bitではないコンピュータを使用する場合は9bit以上で扱いやすいbit数の変数(例えば 16bitの変数)を代用して下9bitのみを使用する等しても良い。
UTF-9 の仕様は RFC 4042 を見るか、または下記URLのページを参照。
https://www.wdic.org/w/WDIC/UTF-9%20%28RFC%29
383 警備員[Lv.9]
垢版 |
2024/08/03(土) 17:38:42.19ID:HS6IEZQf
>>381
Kotlin

Digraph, Trigraph の変換と逆変換

https://paiza.io/projects/FPUStm3O4tZZMYi1Cw2ruw
https://paiza.io/projects/4vD2Ux8Jd6EzLIynkzTXtw

Map と正規表現使った簡単な変換なので他の言語で作っても大差ないと思う。
384デフォルトの名無しさん
垢版 |
2024/08/03(土) 20:58:23.65ID:S2fEkJP0
お題
整数の格子がある(伝われ)
任意の2点間を線で結ぶ(座標成分は実数)
格子と交わるところで線を分割せよ
2024/08/03(土) 21:19:51.17ID:VMb0ie+F
>>384
jwwの外部変形としてこんな感じで交点で分割させるの作ったことあるけどプログラミングスレののお題としては座標指定もなく漠然としすぎていていかがなものか。ちょっと伝わんなかった。
386デフォルトの名無しさん
垢版 |
2024/08/03(土) 21:36:58.95ID:dM8NlTKR
ごめん、画像から察してほしい
遊びだから曖昧なところは適当で
https://i.imgur.com/YUKpLcI.png
2024/08/03(土) 21:50:20.46ID:VMb0ie+F
>>386
二直線の交点は連立方程式を解けば良くて行列を使えば簡単だけど、どういう回答が求められてるのかが分からず途方に暮れております
2024/08/03(土) 22:08:55.42ID:/AInVOhB
>>386
出直し
2024/08/03(土) 22:28:33.50ID:Dl6/uvrz
クイズと「プログラミングのお題」との決定的な違い
検証するための入力(問題)と出力(解答)例が明記されているかどうか
390デフォルトの名無しさん
垢版 |
2024/08/03(土) 22:29:35.16ID:S2fEkJP0
テンプレに書いてなかったしいいやって思っちゃった
ここまで伝わらんもんなのか…
391デフォルトの名無しさん
垢版 |
2024/08/03(土) 22:35:56.24ID:S2fEkJP0
具体例を計算するのはめんどくさいけど、例えばさっきの絵で言えば右上が始点で左下が終点なら始点側から順番に座標を出力するとかね
2024/08/03(土) 22:41:57.69ID:Dl6/uvrz
入力例とその時の出力例を
データとして数種類用意すればOK
例えば>>234とか>>343を参考
2024/08/03(土) 22:42:49.82ID:t4RpIT1N
>>390
そういうことは伝える努力をしてから言おうな
394デフォルトの名無しさん
垢版 |
2024/08/03(土) 22:44:30.36ID:S2fEkJP0
めんどくさい
そこまでして出そうと思わんから興味ないならスルーで
2024/08/03(土) 22:52:49.60ID:/AInVOhB
この頭の悪さを見るに学校の課題か何かを丸投げしようとしてるのかな
2024/08/03(土) 23:04:31.31ID:Dl6/uvrz
入出力例があると仕様が定まってプログラミングのお題が成立する
入出力例がないと宿題を手伝わせようとしているだけの可能性も否定できないね
2024/08/04(日) 00:49:43.30ID:iskScWib
>>394
ドンマイ、出題の意図は分かった気がするので改めて出題
お題
10mm方眼用紙、左下原点、入力された任意の直線と方眼線との交点を求めよ
(例)始点(3.5,5.2)終点(6.3,8.1)
2024/08/04(日) 04:51:29.74ID:9TVMMXOl
>>384
nodejs
https://www.mycompiler.io/view/8GupmXA8eQS
2024/08/09(金) 23:38:00.57ID:PnKZlDGe
お題:与えられた線分を指定された長さLで分割せよ。ただし最後に余る分は長さLでなくてもよい。
線分([始点,終点])=[[0,0],[100,100]]
L=50

[[[0,0],[50,50]],[[50,50],[100,100]]]
400 警備員[Lv.7]
垢版 |
2024/08/10(土) 04:24:35.61ID:C1sXjWXk
>>399
その例おかしくない?それか問題がおかしいか。
長さがLということはx=yの線を分割する場合は座標はx, y 共にL/√2倍にならないか?
2024/08/10(土) 08:05:08.91ID:cX2Nc5cZ
ごめん、ミスった
2024/08/10(土) 08:07:10.85ID:cX2Nc5cZ
修正
線分([始点,終点])=[[0,0],[120,0]]
L=50

[[[0,0],[50,0]],[[50,0],[100,0]],[[100,0],[120,0]]]
2024/08/10(土) 08:54:23.54ID:DYGkQoQe
REM 座標計算.bat
chcp 65001
ruby -x "%~f0"
goto end
#~
#!ruby
#encoding: utf-8
Encoding.default_external='UTF-8'
require "matrix"
while 1
print "input start point > " #0,0
p1=$stdin.gets.split(",").map{|e| e.to_f}
print "input end point > " #120,0
p2=$stdin.gets.split(",").map{|e| e.to_f}
print "input length > " #50
l=$stdin.gets.to_f
exit if l<=0
p1[1]=0 unless p1[1]
p2[1]=0 unless p2[1]
v1=Vector.elements(p1)
v2=Vector.elements(p2)
m=(v2-v1).r
n=(m/l).to_i
a=(0..n).map{|e| l*e}
b=a.map{|e| v1+(v2-v1)*(e/(v2-v1).r)}.map{|e| e.to_a}
b<<p2
p b.uniq
end
__END__
:end
2024/08/20(火) 15:28:18.45ID:YrWgN0+y
お題:今日、または任意の日付から、もういくつ寝るとお正月かを求めよ。(昼寝は除く)
2024/08/20(火) 18:03:45.73ID:UEEknM+z
>>404 lisp
https://ideone.com/RhvMjC
406デフォルトの名無しさん
垢版 |
2024/08/21(水) 11:05:18.96ID:kc5yLFga
>>404
徹夜はどうしますか?
407 警備員[Lv.12]
垢版 |
2024/08/22(木) 08:01:35.77ID:dwyU9o+h
>>404
bash のコマンドラインから expr コマンドと date コマンドを利用して次のようにして計算した。
実際に日数が経過後に1月1日になっているかの確認もした。

$ expr $( date -d '2024/12/31' +%j ) - $( date +%j ) + 1
132
$ date -d 'now +132 days'
2025年 1月 1日 水曜日 07:58:54 JST
$
408 警備員[Lv.12]
垢版 |
2024/08/22(木) 08:04:39.02ID:dwyU9o+h
>>407 をちょっと改良
今年に限定しないやりかた。

$ expr $( date -d $(date +%Y)'/12/31' +%j ) - $( date +%j ) + 1
132
$
409デフォルトの名無しさん
垢版 |
2024/08/24(土) 01:28:41.99ID:Ou5o/VfJ
ロケール設定なしとかジョークかよ
2024/08/24(土) 07:25:49.23ID:/cWP8Umv
こまけぇこたぁいいんだよ(AA略)
2024/08/24(土) 23:36:40.04ID:/cWP8Umv
てかこのお題で私、期間中にヨーロッパから帰国しますんでってな特殊ケースまで折り込めって方が無理に思えるけど、ロケール設定した模範解答をどぞ、
2024/08/24(土) 23:58:49.15ID:D7M8BxWI
せっかくだから、旧正月も考慮して
413デフォルトの名無しさん
垢版 |
2024/09/01(日) 04:58:12.84ID:sYmH1KkQ
お題:複数の文字列が格納されている配列と配列の添字がある。標準入力からnextが入力されたら文字列を表示し添字を進め、prevが入力されたら文字列を表示して添字を戻す。添字が始点と終点に達したら始点は終点に、終点は始点に移動させる。動作は例に合うように実装せよ。

v = ["aaa","bbb","ccc"]
next
aaa
next
bbb
prev
aaa
next
bbb
next
ccc
next
aaa
2024/09/01(日) 08:19:39.59ID:MmIh9kGJ
>>413 lua
https://ideone.com/OEEqAA
2024/09/01(日) 11:51:46.92ID:Zfu0bsG/
>>413
REM nextprev.bat
ruby -x "%~f0"
exit
#~
#!ruby
#encoding: utf-8
i=0;v=["aaa","bbb","ccc"]
while 1
puts v[i]
print "input next or prev [n/p]> "
a=$stdin.gets.chomp
if ""==a
exit
elsif /^n/=~a
i=i+1
elsif /^p/=~a
i=i-1
end
i=(i+3)%3
end
2024/09/03(火) 07:13:35.79ID:1bP400Ev
お題
引数aから引数bまでの数列を返す関数がある。この関数を数列にゾロ目が含まれていた場合に空の数列を返すように実装せよ
2024/09/03(火) 07:56:47.18ID:Jxau6mSM
>>416 lisp
https://ideone.com/WMC2aN
2024/09/03(火) 09:22:31.13ID:HQsZJT0t
>>417
windowsを使ってるんですが>>417を実行するにはどのような環境を整えれば良いでしょうか?
2024/09/03(火) 10:00:07.45ID:VHciJKZC
417ではないが,clispかsbclをインストールすればいいよ.Windowsでもできるし,WSLならさらに簡単にできる
2024/09/03(火) 10:17:03.41ID:HQsZJT0t
>>419
ありがとうございます
そうするとemacsが使えるようになるのでしょうか?
それともプログラミング言語としてのlisp環境が整うだけでしょうか?
2024/09/03(火) 13:27:22.48ID:Jxau6mSM
>>418
Windowsは不断使いしていないんで開発環境とかemacsとかはわからないけど、動かすだけなら
https://www.sbcl.org/platform-table.html からWindows版のSBCLインストーラーを落としてインストール

コマンドプロンプトなどのコマンド行で
sbcl --script ファイル名 とすると「ファイル名」のファイルをスクリプトとして実行します

--script を付けない場合REPLが起動します(Pythonでいうところの対話モード)
これの終了は (quit) と入力してEnterキー
2024/09/03(火) 13:38:16.60ID:Jxau6mSM
ちょっと試すだけならウェブサービスを使う手も

Common Lispを動かせるオンラインコンパイラーサイト
https://rextester.com/l/common_lisp_online_compiler
https://www.jdoodle.com/execute-clisp-online
https://wandbox.org/

これらはideoneとは異なり "Share" とか "Save" とかをクリックしない限り保存・公開されない(はず)
2024/09/03(火) 22:13:24.20ID:HQsZJT0t
レス頂いた方、ありがとうございます
とりあえず>>422辺りで試してみます
2024/09/04(水) 03:34:25.27ID:k+9kMn3u
REM zorome.bat
ruby -x "%~f0"
exit
#~
#!ruby
while 1
print "input a > "
a=$stdin.gets.chomp
exit if a==""
a=a.to_i
print "input b > "
b=$stdin.gets.to_i
ar=(a..b).to_a
z=0
ar.each{|e|
n=e.to_s.gsub(/^-/,"")
m=n.split("").uniq
if n.size>1 && m.size==1
z=1
break
end
}
ar=[] if z==1
p ar
end
__END__
a=0;b=10 => [0,1,2,3,4,5,6,7,8,9,10]
a=0;b=11 => []
2024/09/04(水) 06:34:37.52ID:FQ5fjJ2m
>>416
fn is_zorome(n: i32) -> bool {
let s = n.abs().to_string();
let b = s.as_bytes();
if b.len() > 1 {
b[1..].iter().all(|&d| d == b[0])
} else {
false
}
}

fn odai(a: i32, b: i32) -> Vec<i32> {
if (a..=b).any(|n| is_zorome(n)) {
vec![]
} else {
(a..=b).collect()
}
}

fn main() {
assert_eq!(odai(1, 10), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
assert_eq!(odai(1, 11), []);
}
426 警備員[Lv.7]
垢版 |
2024/09/29(日) 14:12:38.24ID:Sdg7KlJR
>>416
Kotlin
(URL投稿禁止になってるようなので先頭の https:// は抜きで)。
paiza.io/projects/nPK7U1uDtt4b7O2saECP0A

[入力]タブの方で開始、終了の値を入れている。とりあえず 10 40 を入れてある。
一桁の数を指定した場合は全てゾロ目扱いになるので出力は空のリストになる。
2024/10/08(火) 17:17:22.09ID:CS1PHEoT
お題:文字列を中央寄せする関数を作れ。
関数は文字列、全体の横幅(整数)、余白を埋める文字、を引数に取る。横幅分の文字列を引数の文字で作成し、その中央に引数の文字列を埋め込み戻り値として返せ。
2024/10/08(火) 19:52:28.65ID:Rq2an05y
py
text.center
429 警備員[Lv.12]
垢版 |
2024/10/09(水) 00:07:23.87ID:O5zCFPJO
>>427
文字幅についてはどう考えれば良い?
エンコーディングが UTF-8 や UTF-16 だとバイト数や要素数が画面の表示幅と一致しないわけだが。
一致するような Shift-JIS だったとしても端末のフォント設定次第で表示幅が変わる。
2024/10/09(水) 00:38:16.24ID:j8RLE5Fj
EUCにも半角2バイト文字なんてあったりする
2024/10/09(水) 00:56:06.70ID:LtADXZKH
asciiの前提では
全角判定関数は切り分けるべきだし
432デフォルトの名無しさん
垢版 |
2024/10/09(水) 01:18:55.72ID:4B3K5XUV
#ドラクエ3が超好きだったので、お題にしてみる。ただしロト3のファミコン版のドラクエな!w
"こちらの職業は勇者、戦士、空手家、僧侶、柔道家の5人がかりw
勇者から柔道家までの5人の攻撃回数が異なります。"まずは変数と確率の問題。
勇者=you戦士=sen,空手家=kara,僧侶=sou
まず勇者は1~2回攻撃、戦士は1~3回攻撃、空手は2~3回攻撃、柔道は足払いで相手を20%で麻痺させることができる。(1ターン何もできない)10%では超麻痺。(2ターン何も敵は動かない)
5%でクリティカルヒットの足払いで3ターン敵は何もできない。
柔道は敵に攻撃を加えられない分、足払いで相手を痙攣させる。
(勇者の1回分の攻撃は100〜200、20%の確率でクリティカルヒットの攻撃になることがある。
(戦士の攻撃は200〜300、20%の確率で攻撃がクリティカルヒット1回になることがある。
(空手家)空手家の攻撃は350〜500、ただし20%の確率で攻撃がクリティカルヒットとなるときがある。youはぞろ目(111とか222とか999まで)の場合はロトの剣を取得する。
攻撃回数無限で全てクリティカルヒットになります。
クリティカルヒットは攻撃力X2です。さてプログラムをやっていくか。"
*ただし、ロトの剣は勇者しか使えない。
”まずギルガメッシュっていう名前のenemy
ラスボスの名前はenemyとする。ボスのHPは5万。
ボスは基本的に何もしません、できません。これやるとさすがに面倒なのでw
基本的にボスは攻撃しません。(面倒だからw)
一方的になかまあつめてボコすw”
*ロトの剣で攻撃したら攻撃力が1.5倍あがります。*
**癒しの穂。食べたら防御力と賢さがあがります**
ロトの剣の出現条件は3並びで一つ食べることができます。
例えば111攻撃とか222攻撃とか333攻撃とか〜999まで。
次の発言からコードを書いていく。
ニーズあるか?
2024/10/09(水) 01:22:59.53ID:YvVjSPhZ
プログラミングする以前に読むのが面倒くさい
434デフォルトの名無しさん
垢版 |
2024/10/09(水) 01:43:57.73ID:4B3K5XUV
しまった。初期化してなかったなw変数のところ。
あとsouの回復もホイミ、ベホイミ、ベホマラーの3種類だけ。
その3種類がぞろ目の時(111,222など)
そしたらベホマズンを使える。ほぼ運ゲーですw
人修羅みたいに取り巻きがいます。それはバラモスエビルと神龍です。
ある一定時期を過ぎると取り巻きが一斉にHPを連続してあげまくるので
取り巻き先に倒さないと厳しいです。取り巻き=tori種類1の取り巻き=tori0
種類2の取り巻き=tori1 5人だとなかなか倒せないから6人目の魔法剣士=maken
だれか
これをいれよう。
さてif文を完成させよう!if zoma =1
print("ゾーマが現れた”)
import random
random.random()x = random.uniform(0.1,0.9)
print(x)
if x >200 :
print( 'enemyに' +200のダメージを与えた)
elif x > 0.5 :
print( 'enemyに100+のダメージを与えた' )
elif x > 0.2 :
print( '相手が躱した' )
else :
print( "まだゾーマは死んでません")
つかれたーw
もっと簡単なやつにしまーすw
2024/10/09(水) 01:45:35.37ID:YvVjSPhZ
頑張って読んだけどこのままでは多分スレチ、ずっと条件を簡単にして出題し直してみる。

お題
勇者(HP1000)対魔王(HP5000)、先鋒勇者、サイコロ(目は1から6)を振って出た目だけ相手にダメージを与えられ、交互に攻撃しHP0となったら負け。魔王のサイコロは1個だけど勇者のサイコロはN個(N=1~10)の時の勇者の勝率を求めよ。
436デフォルトの名無しさん
垢版 |
2024/10/09(水) 02:10:34.29ID:4B3K5XUV
# RPGの攻撃状況を再現

# モンスターと戦っている。
# 1から10のサイコロをふって、
# 6未満の場合、サイコロの目だけダメージを与えたと表示。
# 6以上の場合、クリティカルヒットとして、100のダメージを与えたと表示。
# 0の場合、防御されたとして、0ダメージを表示。

import random
hit = random.randint(0,10)
if 1 <= hit < 6:
print("スライムに、" + str(hit) + "のダメージを与えた!")
elif hit >= 6:
print("クリティカルヒットダメージ100を与えた")
else:
print("ダメージは、" + str(hit) + "防御された")
#楽しすぎだなwこれはw
2024/10/09(水) 18:59:48.61ID:Vd16zyId
>>429
asciiで。
2024/10/11(金) 05:53:27.29ID:EzY86rdr
お題:文字列の中で1つ以上連続している空白をすべて空白4つに置換せよ。ただし正規表現は使ってはならない。

例:
"abc def ghi" -> "abc def ghi"
439438
垢版 |
2024/10/11(金) 05:54:39.00ID:EzY86rdr
5chは空白を1つに置換するらしく例は出せない。脳内保管せよ。
440デフォルトの名無しさん
垢版 |
2024/10/11(金) 20:53:22.06ID:BlO5cFoG
>>438
perl -lpE'$_=join$"x4,split$"'
(文字列を入れる)
441デフォルトの名無しさん
垢版 |
2024/10/11(金) 20:58:31.10ID:BlO5cFoG
>>440
splitのあとの$"は不要だった。
どちらにしてもタブも置換してまうのでアウトかも。
442デフォルトの名無しさん
垢版 |
2024/10/11(金) 22:15:53.82ID:H5F5jhxE
>>438
R
https://ideone.com/LO7vyR
2024/10/12(土) 01:34:10.91ID:OB4ycmPb
>>435
こういう場合の確率の計算はよく分からなかったので実際にそれぞれ一万回ずつ戦わせてみた。
サイコロ1個で100000戦0勝
サイコロ2個で100000戦0勝
サイコロ3個で100000戦0勝
サイコロ4個で100000戦0勝
サイコロ5個で100000戦47171勝
サイコロ6個で100000戦100000勝
サイコロ7個で100000戦100000勝
サイコロ8個で100000戦100000勝
サイコロ9個で100000戦100000勝
サイコロ10個で100000戦100000勝
2024/10/12(土) 01:39:02.69ID:OB4ycmPb
>>443
#!ruby
#encoding: utf-8
$stdout=open("kekka.txt","w")
i=100000 #対戦回数
k=0 #勇者の勝ち
n=1 #勇者のサイコロの数
hpm=5000 #魔王のHP
hpy=1000 #勇者のHP
2024/10/12(土) 01:39:40.49ID:OB4ycmPb
>>444
while n<=10
j,t=0,0
while j<i
hpy-=rand(1..6)
if hpy<=0
j+=1
t,hpy,hpm=0,1000,5000
next
end
m=0
while m<n
hpm-=rand(1..6)
m+=1
end
if hpm<=0
k+=1
j+=1
t,hpy,hpm=0,1000,5000
next
end
t+=1
end
puts "サイコロ#{n}個で#{i}戦#{k}勝"
k,hpy,hpm=0,1000,5000
n+=1
end
446 警備員[Lv.12]
垢版 |
2024/11/05(火) 05:27:21.14ID:srt1vo+S
>>427
Kotlin

スペースが何個なのか分り易くするために '*' をスペースの代わりに入れて呼び出している。

https://paiza.io/projects/xSP0nP203HXTwqyxlQD0Gg
2024/11/13(水) 22:01:15.62ID:nRkxNwtG
>>435
R

f=\(N){
u=1000
m=5000
while(u>0 & m>0){
m=m-sum(sample(6,N,replace=TRUE))
u=u-sample(6,1)
}
u>m
}
sim=\(N) mean(replicate(1e3,f(N)))
p=sapply(1:10,sim)
plot(p)
data.frame(N=1:10,p=p)

N p
1 1 0.000
2 2 0.000
3 3 0.000
4 4 0.000
5 5 0.498
6 6 1.000
7 7 1.000
8 8 1.000
9 9 1.000
10 10 1.000
2024/11/13(水) 22:22:31.42ID:nRkxNwtG
>>435
Wolfram

f[N_] :=(
u=1000;
m=5000;
Until[u<=0 || m<=0, m-=Total@RandomChoice[Range[6],N];u-=Total@RandomChoice[Range[6],1]];
Boole[u >= m]
)
Table[Mean@Table[f[x],10^3],{x,1,10}] // N

{0., 0., 0., 0., 0.511, 1., 1., 1., 1., 1.}
449デフォルトの名無しさん
垢版 |
2024/12/31(火) 22:33:49.84ID:5KitXLte
ベクターにあるこれを解いてくれ
昔2ch、5chスレでやってたができず
いまだと4x4はパワーで行けるとおもうが

4x4盤タイルゲーム for Windows
対戦するたびに学習して次第に強くなる「最善手探索+対戦学習型知能ゲーム」
2025/01/01(水) 12:58:01.50ID:emEmRiID
他力本願か?
2025/01/01(水) 13:30:44.19ID:WMbw73Fu
出題の仕方でプログラミング能力の無さがわかる
452デフォルトの名無しさん
垢版 |
2025/01/01(水) 13:32:50.17ID:ZpviU2f/
>>438
Java
https://paiza.io/projects/c5TaBFHebIAdHNIU_QToUg
453デフォルトの名無しさん
垢版 |
2025/01/01(水) 13:54:47.38ID:ZpviU2f/
>>427
Java
https://paiza.io/projects/9XrtZ_9CpiIeg-xcQkcc1Q?language=java
454デフォルトの名無しさん
垢版 |
2025/01/01(水) 15:04:31.04ID:ZpviU2f/
>>416
Java
https://paiza.io/projects/xs9ggwnP0Am-Y9dDK0794A?language=java
455デフォルトの名無しさん
垢版 |
2025/01/01(水) 18:14:11.44ID:X9RQ0R0S
>>449
勝手に名付けて水道管連結ゲーム
先後で縦か横で管を繋げた方の勝ち
ただしこの場合、黒が角においたら連結するだけだが今白が角におくと黒2つは除去される

□▓
456デフォルトの名無しさん
垢版 |
2025/01/01(水) 19:18:52.94ID:ZpviU2f/
>>382
Java
https://paiza.io/projects/Nvq9hUoU-aTzCInIQLugGg
457デフォルトの名無しさん
垢版 |
2025/01/01(水) 19:35:45.17ID:ZpviU2f/
>>381
Java
https://paiza.io/projects/DzTt5UiETM3n60v4Pj5-hg?language=java
458デフォルトの名無しさん
垢版 |
2025/01/01(水) 20:12:46.32ID:ZpviU2f/
>>356
Java
https://paiza.io/projects/9oGyF38BDGg3_l8X-MS5-Q?language=java
459デフォルトの名無しさん
垢版 |
2025/01/01(水) 20:32:30.47ID:ZpviU2f/
>>349
Java
https://paiza.io/projects/VuNCoPaBlgTLpp9G-pMWxg?language=java
460 警備員[Lv.16]
垢版 |
2025/01/02(木) 03:06:13.48ID:PSAM74+n
>>438
Kotlin

https://paiza.io/projects/8ePwRoyLPZQ0cMWtO7MSHg
461 警備員[Lv.16]
垢版 |
2025/01/02(木) 03:15:13.97ID:PSAM74+n
>>449
解いてくれって?何をしたらいいの?
全パターンやらせて勝つパターンを出せってこと?
462デフォルトの名無しさん
垢版 |
2025/01/02(木) 10:05:16.72ID:gED46q9T
>>461
最善手だったら先手の勝ちかどうか
463デフォルトの名無しさん
垢版 |
2025/01/02(木) 16:25:40.35ID:H7SLSd6p
https://mevius.5ch.net/test/read.cgi/tech/1624028577/251

Java
https://paiza.io/projects/hQp_tZ73CDJ-oBAxcJuHbA?language=java
464デフォルトの名無しさん
垢版 |
2025/01/03(金) 13:22:57.82ID:dEYOS8Dq
お題
AのあとbノAと同じ数だけBが続く言語エビがあるとします
文字列が入力されたときそれがエビ言語であるか判定するプログラムを作成してください

→ true
A → false
B → false
AB → true
ABB → false
AAB → false
AABB → true
ABAABBAAABBB→ true
465デフォルトの名無しさん
垢版 |
2025/01/03(金) 13:25:00.11ID:dEYOS8Dq
>>464
文字化け訂正
誤:AのあとbノAと同じ数だけBが続く言語エビがあるとします
正:AのあとにAと同じ数だけBが続く言語エビがあるとします
466デフォルトの名無しさん
垢版 |
2025/01/03(金) 15:30:14.42ID:aGLRGnDr
>>464 lisp
https://ideone.com/hHjwKz
467デフォルトの名無しさん
垢版 |
2025/01/03(金) 15:34:16.34ID:aGLRGnDr
>>464 python
https://ideone.com/2Xa1tx
2025/01/03(金) 17:52:02.97ID:aGLRGnDr
>>464 lisp (chatgptに教えてもらった)
https://ideone.com/UYK3Qu
https://chatgpt.com/share/67778c2d-647c-8011-96dd-954a8f0fba92
2025/01/03(金) 20:07:57.67ID:yesC/P5F
>>464
fn is_ab_lang(input: &str) -> bool {
match input
.chars()
.fold(Some(0), |state, char| match (state, char) {
(Some(count), 'A') => Some(count + 1),
(Some(count), 'B') if count > 0 => Some(count - 1),
_ => None,
}) {
Some(0) => true,
_ => false,
}
}

fn main() {
for s in ["", "AB", "AABB", "ABAABBAAABBB"] {
assert!(is_ab_lang(s)); // true
}
for s in ["A", "B", "BA", "ABB", "AAB", "ABBA"] {
assert!(!is_ab_lang(s)); // false
}
}
2025/01/03(金) 23:45:21.31ID:AD9nWeeV
>>464 c
https://ideone.com/KDcKNc
#include <stdio.h>
#include <string.h>
int isablang(const char *s) {
size_t a = strspn(s, "A"), b = strspn(s + a, "B");
return !*s || 0 < a && 0 < b && a == b && isablang(s + a + b);
}
void g(const char *s) {
printf("%s\t%s\n", isablang(s) ? "true" : "false", s);
}
int main() {
g("A"), g("B"), g("C"), g("BA"), g("CA"), g("ABB"), g("AAB"), g("AABABB"), g("ABC"), g("CAB"), g("ABCAB");
g(""), g("AB"), g("ABAB"), g("AABB");
return 0;
}
471デフォルトの名無しさん
垢版 |
2025/01/04(土) 14:03:19.07ID:uiECOsgP
>>468
ChatGPTロジックだとAABABBが受理されちゃう
472468
垢版 |
2025/01/04(土) 15:43:19.87ID:RKGS1C18
あら
ちょっとだけ修正すれば…って、無理か
2025/01/04(土) 16:26:18.49ID:kbkaPDs8
>>464 c
https://ideone.com/x7a81M
・strspn使わない
・再帰しない
#include <stdio.h>
int isablang(const char *s) {
const char *t, *u;
for (; *s; s = u) {
if (*s != 'A') return 0; else for (t = s; *t == 'A'; t++);
if (*t != 'B') return 0; else for (u = t; *u == 'B'; u++);
if (t - s != u - t) return 0;
}
return 1;
}
474デフォルトの名無しさん
垢版 |
2025/01/04(土) 21:19:41.74ID:uiECOsgP
お題
貨幣・銀行券を次の文字列で表すとします
(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)
2025/01/04(土) 22:52:21.99ID:frbzLXtQ
>>474 c
https://ideone.com/TBzq6C
476デフォルトの名無しさん
垢版 |
2025/01/05(日) 03:39:43.83ID:/228f09V
>>449
誰もいないので自分でAIに司令してやってみた
が何かおかしい
https://ideone.com/ZlulrF
2025/01/05(日) 21:35:39.46ID:6Z+55hA8
>>474 ruby
https://ideone.com/6bso7P
478 警備員[Lv.18]
垢版 |
2025/01/12(日) 04:14:11.28ID:zWON4EbF
>>464
Kotlin
https://paiza.io/projects/SkS05OZPJQJlBJ0iWlkkeA
479 警備員[Lv.18]
垢版 |
2025/01/12(日) 04:47:49.98ID:zWON4EbF
>>474
Kotlin
https://paiza.io/projects/rM9KpHluaNW1E3bsLY2k6A
480デフォルトの名無しさん
垢版 |
2025/01/12(日) 17:40:12.54ID:Mt0OVaIB
4*4タイルゲームをAIに命令させてやらせているが
それっぽいのを出力はするが正しい勝利判定ができていない
2025/01/13(月) 13:03:01.90ID:mFwJihvQ
>>438 c
https://ideone.com/UKze06
2025/01/13(月) 20:43:35.02ID:zlmvetys
>>438 java
https://ideone.com/mGUDU4
4839
垢版 |
2025/01/20(月) 01:11:38.35ID:zWVP8H/r
>>474 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)
4849
垢版 |
2025/01/21(火) 02:09:25.80ID:Kvjf8jsk
>>483 Perl5

$_ = 'abc def ghi';
print join(' ' x 4, split) . "\n";
485デフォルトの名無しさん
垢版 |
2025/01/22(水) 21:35:12.82ID:JtEnwxKE
お題

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

入力: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]
2025/01/22(水) 22:43:43.59ID:EHGf/TPZ
>>485
Rust

fn odai(文字列: &str, 長さ: usize) -> Vec<String> {
use itertools::Itertools;
(0..長さ)
.map(|_| 文字列.chars())
.multi_cartesian_product()
.map(String::from_iter)
.collect()
}

fn main() {
assert_eq!(odai("ABC", 1), ["A", "B", "C"]);
assert_eq!(odai("ABC", 2), ["AA", "AB", "AC", "BA", "BB", "BC", "CA", "CB", "CC"]);
assert_eq!(odai("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"]);
}
2025/01/22(水) 23:18:53.24ID:dYX3B7ea
>>485 ruby
https://ideone.com/EA8orq
f = ->(s, n) {:product.to_proc.(*[s.chars]*n).map(&:join)}
2025/01/22(水) 23:57:13.34ID:EHGf/TPZ
>>485
Rust 今回は積ライブラリを使わない自力版

fn odai(文字列: &str, 長さ: usize) -> Vec<String> {
let chars = 文字列.chars().collect::<Vec<_>>();
let mut state = vec![0; 長さ];
let mut output = Vec::new();
'Loop: loop {
let s = state.iter().map(|i| chars[*i]).collect();
output.push(s);
for index in state.iter_mut().rev() {
*index += 1;
if *index == chars.len() {
*index = 0;
continue;
}
continue 'Loop;
}
return output;
}
}

検証用main()は>>486と同じ
489デフォルトの名無しさん
垢版 |
2025/01/23(木) 18:33:06.01ID:hcg9tgUx
>>485
JavaScript

const prod = function* (str, len, buf = [])
{
 if (len > 0)
 {
  for (let i = 0; i < str.length; i++)
  {
   buf.push(str[i]);
   yield* prod(str, len - 1, buf);
   buf.pop();
  }
 }
 else
 {
  yield buf.join("");
 }
};

for (let n = 1; n < 4; n++)
{
 console.log([...prod("ABC", n)]);
}
2025/01/23(木) 20:05:23.84ID:naue5Hlh
>>485 ocaml
https://ideone.com/hEQ0UI

>>485 octave
https://ideone.com/Hga7TO
4919
垢版 |
2025/01/24(金) 01:44:22.46ID:p08ruAfw
>>485 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
4929
垢版 |
2025/01/24(金) 17:38:14.24ID:cg1ZmS3G
>>464 Perl5

for (<DATA>) {
 chomp;
 print "$_ → ", (/^(A((AB)?|(?1))B)+$/g ? 'true' : 'false'), "\n";
}
__DATA__

A
B
AB
ABB
AAB
AABB
ABAABBAAABBB
ABC
AABABB

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

実行結果
~ $ perl 22_464_AB_rec_rex.pl
→ false
A → false
B → false
AB → true
ABB → false
AAB → false
AABB → true
ABAABBAAABBB → true
ABC → false
AABABB → false
2025/01/24(金) 20:04:46.59ID:kDOvSp0D
>>485 dart
https://ideone.com/nZXS5G

>>485 rust
https://ideone.com/07rym1
4949
垢版 |
2025/01/25(土) 02:52:09.44ID:wVQIyzpy
>>492
/g の gは不要で / でおkだった…orz
2025/01/25(土) 03:04:24.02ID:Z97MpHAu
どんまい
2025/01/25(土) 21:23:47.57ID:KM9w0vp0
>>485 c
https://ideone.com/7DAmou
・バッファに取る版

>>485 c
https://ideone.com/irBE3p
・バッファに取らない版
・表示するだけ
497デフォルトの名無しさん
垢版 |
2025/01/26(日) 14:07:38.91ID:nBBaggrk
>>485
Java
https://paiza.io/projects/W5rymKHMXkZgp2ID0-tfMg
498493
垢版 |
2025/01/26(日) 15:22:46.05ID:dl7YvN1C
>>485 dart
https://ideone.com/WtkLVE
・若干の簡略化

>>485 rust
https://ideone.com/VXyvY2
・若干の簡略化?
2025/01/27(月) 00:00:51.14ID:/Jqezixy
>>485 java
https://ideone.com/H7Pti7
500デフォルトの名無しさん
垢版 |
2025/01/27(月) 09:16:22.69ID:rqFJtGlJ
お題
入力された文字列から重複する文字を抽出してください

T →
CG →
ATA → A
CGGA → G
ATGAT → AT
GTTGCA → GT
CCCCGGG → CG
ACTGCGAG → ACG
ATCAGAATA → AT
TGCCATGACA → TGCA
5019
垢版 |
2025/01/27(月) 17:15:59.64ID:cwZgX9Gy
Perl5

for (qw{T CG ATA CGGA ATGAT GTTGCA CCCCGGG ACTGCGAG ATCAGAATA TGCCATGACA}) {
 %h = (); $h{$_}++ for split '';
 print "$_ → ", (grep{1 < $h{$_}} keys %h), "\n";
}

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


実行結果
~ $ perl 22_500_dupe_char.pl
T →
CG →
ATA → A
CGGA → G
ATGAT → TA
GTTGCA → GT
CCCCGGG → CG
ACTGCGAG → GAC
ATCAGAATA → TA
TGCCATGACA → TGAC
5029
垢版 |
2025/01/27(月) 21:20:12.94ID:cwZgX9Gy
>>501 Coilotに入力して処理内容を問うてみたらちゃんと返してきてワラタ
https://copilot.microsoft.com/chats/rbPk2t5sxTRgAPM8BeSxZ
5039
垢版 |
2025/01/27(月) 21:22:36.75ID:cwZgX9Gy
CopilotのURLをコピペしても他の人に内容を見せることはできなかったワ…orz
2025/01/27(月) 21:24:28.42ID:LHxZVLOG
>>500 octave
https://ideone.com/eLcVPC
function s = f(s)
[~, ia] = unique(s);
s(ia) = [];
if 1 < length(s)
[~, ia] = unique(s, 'first');
s = s(sort(ia));
end
end

>>500 ruby
https://try.ruby-lang.org/playground/#code=f+%3D+-%3Es+%7Bs.chars.tally.select+%7B1+%3C+_2%7D.keys.join%7D%0Ass+%3D+%3C%3CEOS.lines(chomp%3A+true)%0AT%0ACG%0AATA%0ACGGA%0AATGAT%0AGTTGCA%0ACCCCGGG%0AACTGCGAG%0AATCAGAATA%0ATGCCATGACA%0AEOS%0Aputs+ss.map+%7B%7Cs%7C+%22%23%7Bs%7D+-%3E+%23%7Bf.(s)%7D%22%7D&engine=cruby-3.3.0
https://ideone.com/9E5Z9a
f = ->s {s.chars.tally.select {1 < _2}.keys.join}
2025/01/27(月) 21:30:57.80ID:l9HsQRRu
>>485 lisp
https://ideone.com/Hiqt3o

>>500 lisp
https://ideone.com/eRqGSp
2025/01/28(火) 21:18:03.62ID:oNqYbqge
>>500 dart
https://ideone.com/WZzsxb

>>500 c
https://ideone.com/1c41ME
2025/01/29(水) 01:00:49.19ID:4mvV5Tkg
>>500 c++
https://ideone.com/5VRuHk
2025/01/29(水) 01:49:29.44ID:PQfpjql4
>>500
REM 重複チェック.bat
ruby -x "%~f0"
exit

#~
#!ruby
while 1
print "> "
a=$stdin.gets.chomp.split("")
exit if a==[]
puts a.select{|e| a.count(e)>1}.uniq.join
end
2025/01/29(水) 21:56:05.24ID:GDFS0NvX
>>500 java
https://ideone.com/zIZZ1G
510デフォルトの名無しさん
垢版 |
2025/01/30(木) 21:27:24.39ID:te1+SH0T
お題
ソース文字列と検索文字列が入力されます
検索文字列の文字をすべて含むソース文字列の部分文字列のうち
一番短い部分文字列を出力してください

DHBICEJAFG EIC → ICE
FDGJHCBIEA EIC → CBIE
FBHDCIJGEA EIC → CIJGE
JDIBGHCEAF EIC → IBGHCE
JBCIAGDHEF EIC → CIAGDHE
EJFBCAGIHD EIC → EJFBCAGI
IADCGJFBEH EIC → IADCGJFBE
IDFHBJGAEC EIC → IDFHBJGAEC
511506
垢版 |
2025/01/30(木) 21:43:26.41ID:ID2xuR+0
>>500 c
https://ideone.com/LLFaOP
・unsigned int m[128] = {0};を使って集計
2025/01/30(木) 22:47:12.58ID:3iB+73MI
高速文字列解析の世界に似た問題のアルゴリズム(ウェーブレット木)が沢山ありました
2025/01/31(金) 00:36:51.89ID:MBodgIXJ
>>510 ruby
https://ideone.com/K7lxJe
514デフォルトの名無しさん
垢版 |
2025/01/31(金) 13:46:22.55ID:+tPQNmsr
このスレでいいのかわからんのだけど
Rust勉強中なんだがメモリ安全性の恩恵を受けやすいなんかしらかのプログラムを書こうと思ってるんだがなにかいいお題はあるか?
言語処理系は大体作ってるのでそれ以外で頼む
2025/01/31(金) 15:33:43.41ID:b4vq2KMj
う~んこの嫌われムーブはあのおじさんか
このスレでは自重して欲しいな
516デフォルトの名無しさん
垢版 |
2025/01/31(金) 16:14:43.64ID:fZW/Grtl
>>514 へのお題

次の操作ができる循環リンクリストを作成してください

・空のリストへの挿入
・冒頭の挿入
・最後に挿入
・指定された位置への挿入
・最初のノードを削除する
・最後のノードを削除する
・任意の位置からノードを削除する
2025/01/31(金) 21:55:55.86ID:mLWOFznj
>>514
Rustはメモリのデータ競合もデータ参照競合も全てコンパイルエラーにしてくれるから間違えようがないね
他の普通の言語だと実行して問題発生に気付いて調査して頑張ってようやく競合が原因だと判明して間違えていたことがわかるから開発効率の悪さとして差が現れるけど
Rustは実行前にその種のミスのデバッグまで全て終えてしまう感じ
2025/01/31(金) 22:10:00.47ID:4ClqIqkw
普通は問題発生前に気がつく
2025/01/31(金) 22:17:10.46ID:bHXxdIdo
>>510 c
https://ideone.com/MZt32o
2025/01/31(金) 22:38:00.61ID:3jAIz2ps
>>518
グローバル変数を排他制御せずに使ってしまっていたりするミスなどよく見かけるような
一般的にも巨大なコードになったり複数人で共通認識なかったりで見逃しミスは必ず出てくる
そしてタイミング次第によって稀にバグが起こるパターンとか負荷が高くなって起きてバグ発覚とか
2025/01/31(金) 23:44:08.10ID:mLWOFznj
全て自分で出来る気付くミスらない
って自己過信な人がセキュリティホールを招いてるからね
自動的にサポートしてくれる言語を使うのが安全で開発効率もいいよ
2025/02/01(土) 00:00:30.73ID:pgp85i6o
ちゃんとルールを守って運転すれば
事故も起きないし、違反で捕まらない
それと同じ
2025/02/01(土) 00:26:30.15ID:cvjWKAds
>>517
せっかくだからRustで>>516やってきなよ
524519
垢版 |
2025/02/01(土) 17:22:30.12ID:/Ur4AoNp
>>510 c
https://ideone.com/tdT1q2
・若干の高速化
 部分文字列を一文字ずつズラして検証していたのを
n = strcspnで探してn文字スキップへ
2025/02/01(土) 22:42:58.39ID:1BfoGXYb
>>516
横からだがその仕様ならベクタをリングバッファとして使った両端キューで十分だな
多くの実用例でもこの方が速いことが知られている

use std::collections::VecDeque;
// 空のキュー
let mut deque: VecDeque<T> = VecDeque::new();
// 先頭に挿入
deque.push_front(t);
// 最後に挿入
deque.push_back(t);
// 指定位置に挿入
deque.insert(index, t);
// 先頭を削除して得る
let first: Option<T> = deque.pop_front();
// 最後を削除して得る
let last: Option<T> = deque.pop_back();
// 指定位置を削除して得る
let element: Option<T> = deque.pop_back();
2025/02/01(土) 22:57:16.48ID:FwGLv5NU
ズルしてどうするんよ…
2025/02/01(土) 23:00:12.86ID:FwGLv5NU
Rustのメモリ安全性を確認するためにプログラム書きたいんでしょ、だったら循環リストをフルスクラッチするしかないよね
2025/02/02(日) 19:41:14.89ID:NpAQnhYs
リンクリストならindex番目の操作(挿入or切除)は
index番目で分解して操作して合体するだけなのでこれで動くよ

use std::collections::LinkedList;

trait LinkedListExt<T> {
fn insert_at(&mut self, index: usize, value: T);
fn remove_at(&mut self, index: usize) -> Option<T>;
}

impl<T> LinkedListExt<T> for LinkedList<T> {
fn insert_at(&mut self, index: usize, value: T) {
let mut tail = self.split_off(index);
self.push_back(value);
self.append(&mut tail);
}
fn remove_at(&mut self, index: usize) -> Option<T> {
let mut tail = self.split_off(index);
let value = tail.pop_front();
self.append(&mut tail);
value
}
}
529デフォルトの名無しさん
垢版 |
2025/02/03(月) 21:15:02.53ID:swo++26S
>>510
R
https://ideone.com/0Hr1lU

C++ (>>524と同じ巨大文字列での繰り返しあり)
https://ideone.com/7fJXjB
2025/02/03(月) 22:57:52.37ID:VF4m0iMh
>>510 c
https://ideone.com/L4xIAy
・f_529 は529さんのパクり
・f_strcspn_chr は strchr してから strcspn すると単純ながら若干の速度向上
531530
垢版 |
2025/02/04(火) 21:13:55.63ID:k8XtEdoq
>>510 c
https://ideone.com/Mar3S7
・f_529direct は出現位置集めるのやめた
 *min = strchr(*min + 1, **min)) でそのまま次へ
532531
垢版 |
2025/02/05(水) 20:39:11.49ID:mFRiRIqM
>>510 c
https://ideone.com/jeAf1a
・デバッグと若干の整理
533532
垢版 |
2025/02/05(水) 23:28:39.35ID:mFRiRIqM
>>510 java
https://ideone.com/EdHfzN
534デフォルトの名無しさん
垢版 |
2025/02/06(木) 22:16:32.16ID:u6r6iDwj
>>510
C++
https://ideone.com/ywT3qw

>>529からの変更点
・sへのtの文字の出現位置を高速取得(1バイト文字のみに対応)
・sにtの同一文字が3回以上連続して出現する場合に最初と最後以外の位置を省略
2025/02/07(金) 19:14:17.64ID:UF6GKvr5
>>500
Wolfram Language

str = "ATGAT"
>> Out[1]= ATGAT

duplicates = str // Characters \
(* { A, T, G, A, T } *) \
// Counts \
(* <| A -> 2, T -> 2, G -> 1 |> *) \
// Select[Function[ 1 < # ]] \
(* <| A -> 2, T -> 2 |> *) \
// Keys \
(* { A, T } *) \
// StringJoin (* "AT" *)
>> Out[2]= AT
2025/02/07(金) 21:12:13.92ID:n3kvQb3T
テス
5379
垢版 |
2025/02/07(金) 21:20:22.98ID:dMuAEB5V
>510 Perl5

https://ideone.com/lceN9R
2025/02/07(金) 22:53:14.41ID:ovhX7KXo
>>510 c
https://ideone.com/uYlPLX
・f_537 は537さんのパクリ
5399
垢版 |
2025/02/07(金) 23:00:25.46ID:dMuAEB5V
>>537
しくった、これ一番短い範囲ではなく間違って一番長い範囲を検出してる。
サンプルデータではたまたま同じ解になるようで、間違いを見落としてしまった。

それから、一番長い(短いにすべきだったが)範囲の検索にわざわざ候補listをsortして[0]番目を
取得しているが無駄だし規模が大きくなると効率よくない

時間あったら直しますわ〜
5409
垢版 |
2025/02/07(金) 23:02:20.43ID:dMuAEB5V
>>538
あーでも527の方式がいまんとこ一番早いんだな、検証thx
5419
垢版 |
2025/02/07(金) 23:04:01.40ID:dMuAEB5V
>>540 527 じゃなくて 537ね。スマソ
542538
垢版 |
2025/02/07(金) 23:08:45.80ID:ovhX7KXo
>>540
>>537さん方式は動的にメモリとらなくていいのがいいよね、清々しくていいよね
あと実行時間の値はまぁアテにはならんので参考程度にw
543デフォルトの名無しさん
垢版 |
2025/02/07(金) 23:41:05.56ID:qBbgMoXu
>>500
PowerShell

"T", "CG", "ATA", "CGGA", "ATGAT", "GTTGCA", "CCCCGGG", "ACTGCGAG ", "ATCAGAATA", "TGCCATGACA" |% {
  "$_ → $(-join ([char[]]$_ | group -case |% {$_.name[$_.count -le 1]}))"
}

[実行結果]
T →
CG →
ATA → A
CGGA → G
ATGAT → AT
GTTGCA → GT
CCCCGGG → CG
ACTGCGAG → ACG
ATCAGAATA → AT
TGCCATGACA → TGCA
5449
垢版 |
2025/02/08(土) 00:22:55.52ID:vma3KbbM
>>510 Perl5、>>537 の修正版

https://ideone.com/klqLux

修正点
>>537では間違って一番長い範囲を検出していたが、一番短い範囲に修正した。(サンプルデータではそれらの解はたまたま一致)
・パターンが3文字であることに依存する定数「2(=3 -1 )」をハードコードしている箇所があったので、パターン文字数次第で処理するように修正
・検出した候補文字列リストのうち一番短い物の検索のためにわざわざ候補リスト全体をsortするのをやめて
 reduceによって長さが一番短い文字列を検索するように修正

List::Utils は言語処理系にデフォルトで付属のコアモジュール、
List::MoreUtils はCPANのオプションノジュールだがideoneのperlにはインスコされていたので使っちゃいましたテヘペロ

なお、候補文字列リストを作らず、ループの最内ifの中で一番短い文字列だけを記録していく様に記述すれば
大規模問題で若干効率が良くなるだろうけど、
まあいいや、もういいや。
5459
垢版 |
2025/02/08(土) 00:26:07.95ID:vma3KbbM
>>544 List::Utils → List::Util ね。スマソ
546デフォルトの名無しさん
垢版 |
2025/02/08(土) 08:27:20.39ID:7bAG/IVE
>>510
Wolfram Language

s = "DHBICEJAFG"
>> Out[1]= DHBICEJAFG
pattern = "EIC"
>> Out[2]= EIC

shortestMatch = \
(* 全通りの部分文字列を生成する *) \
ReplaceList[ Characters[ s ], {___, x__, ___} -> {x} ] \
(* 短い順、先頭に近い順に並べる *) \
// Sort \
(* 検索文字列の文字を全て含むものを選ぶ *) \
// Select[ ContainAll[ Characters[ pattern ] ] ] \
(* 1つ目を文字列として返す *) \
// Extract[ 1 ] // StringJoin
>> Out[3]= ICE
5479
垢版 |
2025/02/08(土) 17:50:15.20ID:HpUe4TZQ
>>510 Perl5、>>544 をもう一回だけ改良

https://ideone.com/YkuK1w

改良点:
・検出された範囲の候補を一通りリストに蓄えて、あとでその中から最短のものを探す方式を止めて、
 範囲を検索するループ内のifでその時点までの最短な範囲の判定と記録を行うようにした。
・CPANモジュールList::MoreUtilsのminmaxを使わない。
・コアモジュールList::Utilはminだけ使う。reduceは使わない。

なんだかPerlのコードらしい感じが減って、ベタな感じのコードになってしまいました
548デフォルトの名無しさん
垢版 |
2025/02/08(土) 19:59:09.70ID:EDI8nVtP
>>510
C++
https://ideone.com/7EHx0H

>>534からの変更点
・minmax_elementを呼び出さずに済むようにして高速化
549デフォルトの名無しさん
垢版 |
2025/02/08(土) 20:02:06.41ID:EDI8nVtP
>>510
C++
https://ideone.com/TluWQi

>>548では検索文字列が短くて高速化されたか分かりにくかったので、長くして529, 534, 548の
実行時間を比較してみると、効果が顕著に現れた。
550 警備員[Lv.19]
垢版 |
2025/02/09(日) 03:18:28.07ID:Y8d2noVo
>>485
Kotlin
https://paiza.io/projects/RtyGxT2PXZScHW6eucI5ng
551 警備員[Lv.19]
垢版 |
2025/02/09(日) 03:56:54.57ID:Y8d2noVo
>>500
Kotlin
https://paiza.io/projects/eipNjg4meAtA7__e3JTRdg
2025/02/09(日) 12:47:59.38ID:uN83pfj6
>>510 c
https://ideone.com/D2AZMK
・両端に着目し、両端のみを更新しつつ調べていく(が、これといってパっとせず)
・f_both_ends はあくまで元の文字列s上を調べていく
・f_both_ends_v2 は「次」「隣」にアクセスしやすくした構造の上を調べていく
・あと実行時間の値ははげしくブレブレなので参考程度にとどめておいてね
553デフォルトの名無しさん
垢版 |
2025/02/09(日) 21:29:55.65ID:do9MXosP
>>485
R
https://ideone.com/wuW5oV
554デフォルトの名無しさん
垢版 |
2025/02/09(日) 21:31:24.58ID:do9MXosP
>>510
C++
https://ideone.com/bwvs06

>>548からの変更点
・データ構造を単純化したら速くなった
555デフォルトの名無しさん
垢版 |
2025/02/09(日) 21:35:08.87ID:do9MXosP
>>510
https://ideone.com/46Tb28
>>549の実行速度比較に554を追加。548は不要な2行を削除した。検索文字列が短いのと長いのの両方をテスト。
556 警備員[Lv.19]
垢版 |
2025/02/10(月) 13:21:24.86ID:g+w4FSG9
>>510
Kotlin

出来たことは出来たが、もっと簡単に出来そうな気がしてきた。

https://paiza.io/projects/RwNXYMH6q3P6v0vx9zbZng
557デフォルトの名無しさん
垢版 |
2025/02/10(月) 21:24:31.20ID:KgR1Tipz
>>485
C# (IEnumerableとして列挙)
https://ideone.com/UBY8bl
558デフォルトの名無しさん
垢版 |
2025/02/11(火) 03:27:04.16ID:FlAqv/ML
動画再生回数、登録者数、評価数、コメント数

上2桁、下2桁に04、13、40、44、71、74など
(+生年月日、IDの数字など)の組み合わせ

業者による忌み数字、不吉数字の嫌がらせ&精神攻撃がキモすぎ
559 警備員[Lv.20]
垢版 |
2025/02/11(火) 05:48:25.27ID:Y4Uu1QjJ
それはお題なのか?それともただの誤爆か?
2025/02/11(火) 06:03:36.08ID:h8gYOd9x
糖質でしょ
忌み数字不吉数字とか意味不明なこと言ってるし,それを業者が特定個人を狙って表示する意味も分からんし
561デフォルトの名無しさん
垢版 |
2025/02/11(火) 10:54:21.93ID:E5oVpL7o
お題
数列が入力されます
ニ番目に小さい数を出力してください

入力:4, 5, 1, 7, 1, 2, 8, 9, 2, 7
出力:2
2025/02/11(火) 11:46:37.94ID:A5/Zs5AB
こんちゃ
質問いいでしょうけ
プルダウン(ポップアップ)をUIとしてだすとして
見えている項目名と、実際にパラミータとして出す値を変えたい時はどうしたらよか
5639
垢版 |
2025/02/11(火) 14:53:15.78ID:mMj2PIa8
>>561 Perl5

$h{$_} = $_ for 4, 5, 1, 7, 1, 2, 8, 9, 2, 7;
@s = sort keys %h;
print "$s[1]\n";


実行結果
~ $ perl 22_561_second.pl
2


Perl5.26以降に付属のList::Utilにはuniq関数があるのでそれを使えば:

use List::Util qw(uniq);
@s = uniq sort 4, 5, 1, 7, 1, 2, 8, 9, 2, 7;
print "$s[1]\n";
564 警備員[Lv.20]
垢版 |
2025/02/11(火) 16:33:48.19ID:Y4Uu1QjJ
>>562
環境や言語やフレームワークを書いて限定しないと色々な環境や言語やフレームワークでの答えが適当に沢山湧いて出て来る可能性あるぞ。
しかも分からない所は適当に解釈してだ。なぜならここはお題スレだから。
2025/02/11(火) 16:37:12.05ID:WPoAkGuN
>>561 ruby
https://ideone.com/OI7hWs

>>561 octave
https://ideone.com/36aKUO

>>561 c
https://ideone.com/eDmlMM
2025/02/11(火) 16:40:21.13ID:gFwXvlnz
>>561
#!ruby
puts $stdin.gets.chomp.split(",").map{|e| e.to_i}.uniq.sort[1]
2025/02/11(火) 17:43:14.68ID:7RexIvi8
>>510 lisp
https://ideone.com/qm4PsV
2025/02/11(火) 17:48:30.95ID:7RexIvi8
>>561 lisp
https://ideone.com/g6m1EK
2025/02/11(火) 18:19:05.70ID:7RexIvi8
>>568
全然だめでした
取りあえずテスト追加済
570デフォルトの名無しさん
垢版 |
2025/02/11(火) 20:45:09.89ID:hMHygfcC
>>561
R
https://ideone.com/3beF1j

C++
https://ideone.com/A8hp2f

それぞれ3通りの方法で、大きなデータでの実行時間を比較
2025/02/11(火) 23:21:03.54ID:Vzh5cLYk
数列が入力されるので
整数の数列だけでなく浮動小数点数の数列にも対応してくださいね

ニ番目に小さい数がない時
例えば同じ数しか存在しない時や数列の長さが1の時には
解がないことを返してくださいね
例えばその時にMAX値が返ってきたら失格ですよ
572565
垢版 |
2025/02/11(火) 23:28:05.14ID:qmej6t15
>>561 ocaml
https://ideone.com/aV59Yd

>>561 java
https://ideone.com/PdgusX
5739
垢版 |
2025/02/11(火) 23:36:31.53ID:yxel6cu3
先に言えよって、感じw
2025/02/11(火) 23:48:25.56ID:E5oVpL7o
>>571は出題者ではないよ
出題者として申し上げるなら>>571は観点がダサい
2025/02/11(火) 23:50:12.69ID:HwVbkmdb
小数対応はともかく
max値を返してしまう人はプログラマ失格かな
あとsortを使ってしまう人は計算量を知らない初心者
2025/02/11(火) 23:53:59.73ID:E5oVpL7o
そういうこだわりはアスペルガーにしか思えないな、どうでも良いじゃないですかそんなこと
2025/02/11(火) 23:56:29.96ID:E5oVpL7o
こだわりは自分の胸のうちに留めていただきたい、他人に求めたら回答の幅を狭めるだけ、多様性のある回答こそ美しい
2025/02/11(火) 23:57:23.71ID:HwVbkmdb
>>576
多くの人はちゃんとnilとかemptyとかNoneなどを返しているよね
プログラマならそこだけは守らなければならない必須事項
2025/02/11(火) 23:59:56.87ID:E5oVpL7o
だからそういう、こうじゃないとダメだという態度がアスペルガー仕草なんだってばよ、君が思うのは勝手だが他人に求めるものじゃない
2025/02/12(水) 00:01:10.34ID:hk2aQo3G
プログラミングはもっと自由なものなんだよ、思ったとおりにかけば良い
5819
垢版 |
2025/02/12(水) 00:03:23.15ID:yw0CaA/O
そういう条件は回答を見て思いついた後から言わず先に書くべきでは?
そうでなければ、与えられた短い文とテストデータから、
処理対象データの範囲や要求仕様を読み手が色々解釈しても仕方ないだろ。
後からいろいろ言って批判なんてでもってのほかだと思うが。
5829
垢版 |
2025/02/12(水) 00:05:30.21ID:yw0CaA/O
出来たもの見て実はこういう条件がありましたってケチつけるのはクソクライアントと一緒だな
2025/02/12(水) 00:13:52.34ID:SJ0T1N6w
ざっと見たけどmax()を返してるのはC++の人だけで他は皆まともだ
普段からまともなコード書いてるかどうかバレてしまうから自由が面白い
2025/02/12(水) 00:18:10.68ID:hk2aQo3G
好きにしたら良いんやで吉田松陰もそんなこと言ってた気がする
2025/02/12(水) 00:20:24.72ID:hk2aQo3G
まともとかバレるとかそういう当て擦りの嫌味ったらしい言い方どこで身につけてきたのあんた、母ちゃんは悲しいよ
586デフォルトの名無しさん
垢版 |
2025/02/12(水) 00:22:24.96ID:Qtl/TEf6
>>583
関数がINT_MAXを返すのはまともなコードだろ。2番目に小さい数はINT_MAXではありえないから、
返り値がINT_MAXの場合は「なし」と表示すれば良いだけ。
5879
垢版 |
2025/02/12(水) 00:28:30.94ID:yw0CaA/O
「データが二個未満の場合にはnilを返す。」とか書いとくべき。
でもそういう細かい条件をちまちま指定した窮屈な課題は、つまんなくて回答を造る意欲が減るんだよな。

シンプルで純な課題に対してどういうエレガントでエッセンシャルな回答があるか考えるのが楽しいのであって、
細かいいろんな条件を守る周辺コードで固めるような作業はつまんないから趣味の世界ではやりたくないな
2025/02/12(水) 00:31:16.47ID:1WuTe288
普段はプログラム載せるだけだけど、みんな意外と饒舌なんだなw
5899
垢版 |
2025/02/12(水) 00:33:57.88ID:yw0CaA/O
ここはある意味、回答のコードでもって語るスレだからな
2025/02/12(水) 00:35:35.77ID:kQv2EDFI
お題にそんな指定ないのに
みんなnilなどを返してるからこのスレの住人たちはセンスいいな
2025/02/12(水) 19:12:16.26ID:FZJ50oR3
>>561 lisp (sbcl)
https://ideone.com/Bct7bC

>>561 lisp (clisp)
https://ideone.com/yqfmzh

clispだと何故かsort版の方が速い
2025/02/12(水) 20:45:54.96ID:JML0DDov
>>561 ruby
https://ideone.com/svMSSw

>>561 sqlite
https://ideone.com/W02Q5r
593デフォルトの名無しさん
垢版 |
2025/02/12(水) 22:44:39.40ID:Qtl/TEf6
>>561, 571
>>570のC++のf3をint型の最大値を含むデータにも対応させた。

C#にはint?型があるのですっきり書けるが、
https://ideone.com/oRhDL1

C++ではまあまあすっきり書くにはintへのポインタを返すしかないか。
https://ideone.com/xYnTSD
(該当値が複数の位置に存在する場合にそれらのうちのどれへのポインタを返すかについては
こだわらないものとする)
2025/02/13(木) 12:04:43.08ID:KGk2Z9bM
お題:ランダムな数列から任意の並んでいる二つの数同士を足して、その二つの数の間に挿入せよ。
その新しい数が一桁ならそのまま挿入し二桁なら桁同士を足してその二桁の間に挿入せよ。

< 123456789 3 4
> 1237456789

(3+4=7)

< 123456789 6 7
> 123456143789

(6+7=13 1+3=4)
2025/02/13(木) 12:31:31.25ID:QhFtS6hw
問題文の記述が下手かよ
2025/02/13(木) 13:27:16.37ID:J5YSE8js
>>594 ruby
a=$stdin.gets.chomp.split(" ")
b=a[1].to_i+a[2].to_i
c=(b<9 ? a[1]+b.to_s+a[2] : a[1]+"#{b/10}#{b/10+b%10}#{b%10}"+a[2])
puts a[0].gsub(a[1]+a[2],c)
5979
垢版 |
2025/02/13(木) 17:35:13.67ID:UAfabByi
>>594 Perl5、見易くするためインデントは全角スペースに置換してあります

for (<DATA>) {
 ($s, $a, $b) = split;
 $c = $a + $b;
 $c = $1 . ($1 + $2) . $2 if $c =~ /(\d)(\d)/;
 $s =~ s/$a$b/$a$c$b/g;
 print "$s\n";
}
__DATA__
123456789 3 4
123456789 6 7
123456789 8 9
3141592653589793238462643383279502884197169399375105820974944 9 7


実行結果
~ $ perl 22_594.pl
1237456789
123456143789
123456781879
3141592653589176793238462643383279502884191767169399375105820917674944
598デフォルトの名無しさん
垢版 |
2025/02/13(木) 20:12:01.16ID:3SfOseF2
>>594
題意が以下の通りだとして、PowerShell (エラーチェックは省略)

 自然数x, i, j (i + 1 = jを満たす) が与えられる。xの上i桁目の数字をx[i]で表す。
 x[i]とx[j]の和をyとして、

 ・yが1桁のとき、yをx[i]とx[j]の間に挿入せよ
 ・yが2桁のとき、y[1]とy[2]の和をy[1]とy[2]の間に挿入してから、yをx[i]とx[j]の間に挿入せよ

function f($x, $i, $j)
{
  $s = [string]$x
  $y = [int][string]$s[$i - 1] + [int][string]$s[$j - 1]
  if ($y -lt 10) {
    $s.insert($i, $y)
  } else {
    $s.insert($i, 11 * $y)
  }
}

(123456789, 3, 4), (123456789, 6, 7) |% {
  "< $($_[0]) $($_[1]) $($_[2])"
  "> $(f $_[0] $_[1] $_[2])", ""
}

[実行結果]
< 123456789 3 4
> 1237456789

< 123456789 6 7
> 123456143789
5999
垢版 |
2025/02/13(木) 20:24:48.49ID:UAfabByi
数学屋さんかいなw
i,jの「3 4」とか「6 7」は桁の位置をしていしているのではなく数値列の中にある数字を指定するんジャマイカ
とオレは解釈したが
600デフォルトの名無しさん
垢版 |
2025/02/13(木) 20:34:25.67ID:3SfOseF2
>>599
そうか。だとすれば、

function f($x, $i, $j)
{
  $s = [string]$x
  $y = $i + $j
  if ($y -ge 10) {$y *= 11}
  $s -replace "$i$j", "$i$y$j"
}

(123456789, 3, 4), (123456789, 6, 7), (123456789, 8, 9), ("3141592653589793238462643383279502884197169399375105820974944", 9, 7) |% {
  "< $($_[0]) $($_[1]) $($_[2])"
  "> $(f $_[0] $_[1] $_[2])", ""
}

[実行結果]
< 123456789 3 4
> 1237456789

< 123456789 6 7
> 123456143789

< 123456789 8 9
> 123456781879

< 3141592653589793238462643383279502884197169399375105820974944 9 7
> 3141592653589176793238462643383279502884191767169399375105820917674944
2025/02/13(木) 20:45:01.39ID:KiG3F5Wd
>>561 c
https://ideone.com/ZyWoVM

>>594 ruby
https://ideone.com/gp9Fvp
6029
垢版 |
2025/02/13(木) 20:52:32.26ID:UAfabByi
なんでこの人はコーデイングするのがこんなに早いんだろう…
2025/02/13(木) 22:58:07.29ID:bC7pFAVH
>>594 Rust

fn f(input: &str, a: u32, b:u32) -> String {
let src = format!("{a}{b}");
let dst = if a + b < 10 {
format!("{a}{x}{b}", x = a + b)
} else {
format!("{a}{x}{y}{z}{b}", x = 1, y = 1 + a + b - 10, z = a + b - 10)
};
use itertools::Itertools;
input.split(&src).join(&dst)
}

fn main() {
assert_eq!(f("123456789", 3, 4), "1237456789");
assert_eq!(f("123456789", 6, 7), "123456143789");
assert_eq!(f("3141592653589793238462643383279502884197169399375105820974944", 9, 7),
"3141592653589176793238462643383279502884191767169399375105820917674944");
}
2025/02/13(木) 23:47:12.83ID:bC7pFAVH
>>561 Rust

fn second_smallest<T: Copy + Ord>(input: &[T]) -> Option<T> {
use std::cmp::Ordering::{Equal, Greater, Less};
input
.iter()
.copied()
.fold(None, |state, t| match state {
Some((_t0, Some(t1))) if t >= t1 => state,
Some((t0, _)) => match Ord::cmp(&t, &t0) {
Less => Some((t, Some(t0))),
Equal => state,
Greater => Some((t0, Some(t))),
},
None => Some((t, None)),
})
.and_then(|(_t0, t1option)| t1option)
}

fn main() {
assert_eq!(second_smallest(&[4, 5, 1, 7, 1, 2, 8, 9, 2, 7, 1]), Some(2));
assert_eq!(second_smallest(&[1, 1, 1]), None);
assert_eq!(second_smallest(&[] as &[i32]), None);
}
2025/02/14(金) 17:55:06.91ID:L6dJMbYJ
わけがわからん
アセンブラじゃあるまいし
2025/02/14(金) 18:42:18.21ID:RXjqXFcF
わからないのはどのへんなんだろう?
・型がジェネリックになっている点
・代入文がないなど関数型プログラミングになっている点
・パターンマッチングが使われている点
いずれも最近は対応している言語が増えてるような
2025/02/14(金) 23:21:45.00ID:bNo2F1oE
可読性の良さから高階関数を使ったメソッドチェーンが一般的になってきたね
マイクロソフトがC#などでLINQ広めたのがきっかけで各言語もその有用性から導入するようになった
2025/02/14(金) 23:42:29.57ID:PVqLPxMJ
お題:ランダムな英文字列が与えられる。隣り合う英文字が同じ大文字だった場合、その間にその大文字の小文字を挿入せよ

In < abcDDefGG
Out > abcDdDefGgG
2025/02/15(土) 00:16:29.67ID:aVKCg5xf
>>608 ruby
while 1
s=DATA.gets.chomp
exit if s==""
t=s.gsub(%r|([A-Z])\1|){$1+$1.downcase+$1}
puts "IN < #{s}\nOUT > #{t}"
end
__END__
abcDDefGG
2025/02/15(土) 00:16:34.18ID:f9ERvXXy
>>594 dart
https://ideone.com/uQxzo1

>>608 ruby
https://ideone.com/pwoRRH
2025/02/15(土) 00:28:45.42ID:/PgyVRU9
>>606
正規表現みたい非人間的な書式はやめようぜっての
612デフォルトの名無しさん
垢版 |
2025/02/15(土) 00:39:27.81ID:rssRTGdz
>>608
PowerShell

function f($s)
{
  -join $(
    foreach ($i in 0..($s.length - 2)) {
      $s[$i]
      if ($s[$i] -ne $s[$i + 1]) {continue}
      if ($s[$i] -lt [char]"A" -or $s[$i] -gt [char]"Z") {continue}
      ([string]$s[$i]).ToLower()
    }
    $s[$i + 1]
  )
}

"abcDDefGG", "abcDDDfGG" |% {"$_ → $(f $_)"}

[実行結果]
abcDDefGG → abcDdDefGgG
abcDDDfGG → abcDdDdDfGgG
2025/02/15(土) 01:01:01.24ID:qzrI3kKZ
>>608 Rust

fn f(input: &str) -> String {
 let mut output = String::new();
 let mut pre_uppercase = None;
 for char in input.chars() {
  if Some(char) == pre_uppercase {
   output.push(char.to_ascii_lowercase());
  }
  output.push(char);
  pre_uppercase = char.is_ascii_uppercase().then_some(char);
 }
 output
}

fn main() {
 assert_eq!(f("abcDDefGG"), "abcDdDefGgG");
 assert_eq!(f("abcDDDfGG"), "abcDdDdDfGgG");
}
2025/02/15(土) 09:21:24.60ID:XILc/8JX
>>608 ruby
https://ideone.com/nHcphN

>>608 dart
https://ideone.com/NxwW8Y
615614
垢版 |
2025/02/15(土) 10:02:25.10ID:UI50KRFJ
>>608 dart
https://ideone.com/2E5Rxy
6169
垢版 |
2025/02/15(土) 10:36:35.12ID:1WENuqRv
>>608 Perl5、肯定先読みと置換の小文字変換

s/([A-Z])(?=\1)/\1\l\1/g, print for <DATA>;
__DATA__
abcDDefGG
abcDDDefGGG


実行結果
C:\Home>perl 22_608_ins_l.pl
abcDdDefGgG
abcDdDdDefGgGgG
6179
垢版 |
2025/02/15(土) 10:39:20.52ID:1WENuqRv
>>611
お断り〜します〜♪
    ハハ
   (゚ω゚)
 ((⊂ノ  ノつ))
   (_⌒ヽ
εニ≡ )ノ`J
2025/02/15(土) 10:40:34.16ID:+yYMeR0h
>>594 >>608 lisp
https://ideone.com/W5gGfD
619615
垢版 |
2025/02/15(土) 13:20:38.24ID:eC3jFbuY
>>608 java
https://ideone.com/YfufZz

>>616
_人人人人人人人人人人人人_
> 置換の小文字変換!? <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄

勉強になりました
620デフォルトの名無しさん
垢版 |
2025/02/15(土) 21:05:44.70ID:rssRTGdz
>>612は文字列長が1文字の場合にバクがあった。PowerShellの0..-1は空(から)ではなく0, -1になるのが
原因 (Rの0:-1も同様)。修正するには、fの最初に if ($s.length -lt 2) {return $s} を挿入する。
621デフォルトの名無しさん
垢版 |
2025/02/15(土) 21:06:37.89ID:rssRTGdz
>>561
C++
https://ideone.com/bQBKIM
C#のヌル許容型と同じ挙動のnullable型を自作し、>>593のC#のmin2関数をジェネリック化、
ポインタ参照化して移植した。

https://ideone.com/p2LNC9
593のC++のmin2関数と実行速度を比較する¹と30%ほど遅い。文字列型や可変長数値型と
違って最大値が存在する固定長数値型では、それを利用するf593の方が良い。

──
¹ Microsoft C++では100回繰り返しテストが最適化され1回しか実行されない
2025/02/15(土) 21:52:48.39ID:qa0m30Tb
>>621
最大値をundefined代わりに使ってはいけないと指摘があったのにまだ使っているのかいな
そのコードで入力数列がこうだった場合
vector<int> a = {IntMax - 1, IntMax};
2番目に小さい数として正解のintMaxを返さなければならない
623デフォルトの名無しさん
垢版 |
2025/02/15(土) 22:00:12.34ID:rssRTGdz
>>622
>>593のC++プログラムの実行結果を参照。入力数列にINT_MAXが含まれる場合でも問題ない。
2025/02/15(土) 22:09:09.66ID:qa0m30Tb
>>623
それはm1とm2を間接にポインタで持つために遅くなっているf593()
m1とm2を直接に整数で持つため速いf3()はIntMaxに対応できていない
625デフォルトの名無しさん
垢版 |
2025/02/15(土) 22:24:28.09ID:rssRTGdz
>>624
>>621の速度比較テストに>>570のf3も追加
https://ideone.com/scnfdu

ポインタで持つf593との比で、整数で持つf570は6%速いだけ。一方、null許容型のf621は29%も遅い。
最大値が存在する型ではそれを利用する方が良いという結論に変わりはない。
626デフォルトの名無しさん
垢版 |
2025/02/15(土) 22:29:41.23ID:rssRTGdz
まあ、同じ値の要素が大量に存在する入力データではf570は遅くなるが、平均的な速度はf570の方が速い。
627デフォルトの名無しさん
垢版 |
2025/02/15(土) 22:31:16.05ID:rssRTGdz
>>626はf570じゃなくてf593だった。
2025/02/15(土) 22:42:01.35ID:v2QOLp/q
f593でローカル変数へのポインタを返し得るのは如何かと
629デフォルトの名無しさん
垢版 |
2025/02/15(土) 23:34:59.77ID:rssRTGdz
>>628
返しえないでしょ。
2025/02/15(土) 23:46:12.83ID:qa0m30Tb
>>625
まずnullableのコードがおかしい
例えばoverload(op)のこれ

if (y.isNull) return false; \
return x op y.value; \

Nullだとfals eとなり
opの計算結果次第でもfal seとなり
両者を区別できない
2025/02/15(土) 23:47:32.80ID:qa0m30Tb
>>625
あとvector扱うコードは倫理的に際どいかな
長さ0でないことを調べずに
いきなりint *m1 = &a[0], m2 = &y;
今回は長さ0の時に*m1をアクセスしないから論理的にギリセーフだけど際どい

そのへんのトリッキーさも含めて
(もしあれば)最小値も返す場合
(もしあれば)3番目の最小値も返す場合など
このIntMax方式は破綻すると思う
632デフォルトの名無しさん
垢版 |
2025/02/15(土) 23:52:31.08ID:rssRTGdz
>>630
>>621に書いた通り、C#のヌル許容型T? (Nullable<T>のエイリアス) の挙動に従っただけだから。
文句があるならMicrosoftに言ってくれ。
6339
垢版 |
2025/02/16(日) 06:28:07.79ID:GnMUCCm7
qa0m30Tb の回答はどれよ?
634デフォルトの名無しさん
垢版 |
2025/02/16(日) 08:09:49.66ID:v+IcfGmt
いるよねえ他人の回答に文句だけつけて自分では回答しないやつ
635デフォルトの名無しさん
垢版 |
2025/02/16(日) 08:16:54.29ID:v+IcfGmt
他人の回答が間違いとなるようにお題を解釈するのは知的なことではないよバカの所業だよ
2025/02/16(日) 08:20:29.71ID:eNZyrnPC
そんなことより>>616のワンライナーがカッコよくてほれぼれする
2025/02/16(日) 10:58:48.51ID:EXJYkLn8
帰ったと思ったらまたやってんのw
2025/02/16(日) 15:14:38.18ID:8bpH8MuA
コンパイラ警告無視するのが知的な事だと思ってそうだな
6399
垢版 |
2025/02/16(日) 15:45:59.98ID:GnMUCCm7
回答のコードでもって語ってほしいなぁ
2025/02/17(月) 13:08:08.60ID:lz3iaMcC
お題:ランダムな数列が与えられる。隣り合う数字が偶数同士の時、あいだに0を。奇数同士の時は1を挿入し、それ以外は何も挿入しない

In < 123346
Out > 12313406
2025/02/17(月) 13:47:54.59ID:1CKZ5rpi
>>640 ruby
DATA.readlines(chomp:1).map{|e|
a=e.split("").map{|f| f.to_i}
(0..a.size-2).each{|n|
a[n]=a[n]*10 if (a[n]%2==0 && a[n+1]%2==0)
a[n+1]=a[n+1]+10 if (a[n]%2==1 && a[n+1]%2==1)}
puts "IN < #{e}\nOUT > #{a.map{|f| f.to_s}.join}"}
__END__
123346
2025/02/17(月) 20:02:39.61ID:SzDlV4TD
>>640 lisp
https://ideone.com/DV9DeR
643デフォルトの名無しさん
垢版 |
2025/02/17(月) 20:47:46.22ID:2enU2rA/
>>640
PowerShell (一般的な文字コードを想定)

function f([string]$s)
{
  $rprev = 2
  -join ([char[]]$s |% {
    $r = $_ % 2
    if ($r -eq $rprev) {$r}
    $rprev = $r
    $_
  })
}

123346, 12333468, 1, "" |% {"$_ → $(f $_)"}

[実行結果]
123346 → 12313406
12333468 → 123131340608
1 → 1
644デフォルトの名無しさん
垢版 |
2025/02/17(月) 20:48:16.10ID:2enU2rA/
正規表現置換なら、

function f($s)
{
  $s -replace "[02468](?=[02468])", "$&0" -replace "[13579](?=[13579])", "$&1"
}

1回で済ますなら、

function f($s)
{
  [RegEx]::Replace($s, "[02468](?=[02468])|[13579](?=[13579])", {$_ = $args[0].value[0]; "$_$($_ % 2)"})
}
2025/02/17(月) 20:58:11.16ID:UxhkW11K
>>640 Rust

fn f(input: &[u8]) -> Vec<u8> {
 input.windows(2).fold(Vec::new(), |mut vec, w| {
  if vec.is_empty() {
   vec.push(w[0]);
  }
  if (w[0] ^ w[1]) & 1 == 0 {
   vec.push(w[0] & 1 + b'0');
  }
  vec.push(w[1]);
  vec
 })
}

fn main() {
 assert_eq!(f(b"123346"), b"12313406");
 assert_eq!(f(b"12333468"), b"123131340608");
}
646デフォルトの名無しさん
垢版 |
2025/02/18(火) 10:32:01.38ID:Spp0fdd/
>>645
そうやればいいのか、なるほどね
2025/02/18(火) 17:51:16.96ID:ZRfTlf8i
Vecのnewやpushなど普通にcollectに任せる手もあるね
条件付き挿入は汎用にOptionで取捨を示してflat_mapとflattenでも可能
前値など状態を保ちつつ1つにまとめるならfoldでイテレータに流すならscan
一例としてこんな感じ

fn f(input: &[u8]) -> Vec<u8> {
 input
  .iter()
  .scan(None, |pre, &x| {
   Some([
    pre.replace(x & 1)
     .and_then(|p| (p == x & 1).then_some(p + b'0')),
    Some(x),
   ])
  })
  .flat_map(|list| list.into_iter().flatten())
  .collect()
}

>>640
Rust
648デフォルトの名無しさん
垢版 |
2025/02/19(水) 21:30:14.30ID:LKzHskwz
>>640
>>643-644の3つのfを上から順にf1, f2, f3とし、長い文字列を引数として呼び出したときの
実行時間を比較すると、

$s = -join (1..10000)
$t = 1..3 |% {(iex "measure-command {f$_ $s}").ticks}
$tmin = ($t | measure -min).minimum
1..3 |% {"f$_`: {0:0.00}倍" -f ($t[$_ - 1] / $tmin)}

[実行結果の一例]
f1: 34.78倍
f2: 1.00倍
f3: 14.93倍

大差でf2 < f3 < f1となった。インタプリタ言語のコード実行は遅いので、処理を自分で
書くほど遅くなり、ライブラリ関数等に丸投げすれば速くなることによる。

https://ideone.com/GVewWL
コンパイラ言語のC#で同様の比較をすると (PowerShellより速いので文字列を長くし、
f1の改良版としてStringBuilder使用のf4を追加した)、当然f4< f1 < f2 < f3になった。
2025/02/19(水) 21:58:22.55ID:Hs/awmG/
>>647
関数型でタブーの可変な変数宣言してもよいなら、もっと簡単になるね。

fn f(input: &[u8]) -> Vec<u8> {
 let mut pre = None;
 input
  .iter()
  .flat_map(|&x| {
   [
    pre.replace(x & 1)
     .and_then(|p| (p == x & 1).then_some(p + b'0')),
    Some(x),
   ]
   .into_iter()
   .flatten()
  })
  .collect()
}
2025/02/20(木) 23:25:43.81ID:Zfo8kSSQ
mutableの使用は必要最小限が望ましいが
mutableを使えない言語は実用的ではない
651 警備員[Lv.21]
垢版 |
2025/02/22(土) 15:11:12.54ID:nEyoRU5r
>>640
Perl5
https://paiza.io/projects/gW_sI1_VqokddmYSJ6Lj2A
652 警備員[Lv.21]
垢版 |
2025/02/22(土) 15:42:54.65ID:nEyoRU5r
>>640
Kotlin
https://paiza.io/projects/mAEXhhFdJiHVQWYtHvIP-g
653 警備員[Lv.21]
垢版 |
2025/02/22(土) 15:53:04.03ID:nEyoRU5r
>>640
C
https://paiza.io/projects/7L9vpqOvFcbZfv9vO5GPvA
654デフォルトの名無しさん
垢版 |
2025/02/22(土) 23:33:07.08ID:k7PDvk0j
>>640
Haskell
https://ideone.com/U3SvTZ
655 警備員[Lv.21]
垢版 |
2025/02/24(月) 18:11:14.44ID:Ikw9MrIX
>>608

>>651とかとアルゴリズムはほぼ同じ。これといった捻りはない。
よく分からないが5chに書き込みがブロックされたのでURLのコロンまでは削った。

Perl
//paiza.io/projects/zAqms-VVEWIMhcgr8AV6Pw
Kotlin
//paiza.io/projects/iu8mTSyKsxqWx_T51Wpj4Q
C
//paiza.io/projects/bDkj3tRF_KmiBL67miRxyA
656デフォルトの名無しさん
垢版 |
2025/02/26(水) 21:33:47.93ID:rkiIsmEI
お題: Python の int.bit_count()

65535 → 16
15 → 4
6 → 2
1 → 1
0 → 0
-1 → 1
-6 → 2
-15 → 4
-65535 → 16
657デフォルトの名無しさん
垢版 |
2025/02/26(水) 23:29:03.38ID:Gl9HHMVG
>>656
C++20
https://paiza.io/projects/R-sSq9oCAOmG17wk6c5naw
2025/02/27(木) 00:23:41.10ID:TOGelnHV
>>656
Rust

fn bit_count(x: i64) -> usize {
const MAGIC_1: u64 = 0x5555555555555555; // 0101..0101
const MAGIC_2: u64 = 0x3333333333333333; // 0011..0011
const MAGIC_3: u64 = 0x0f0f0f0f0f0f0f0f;
const MAGIC_4: u64 = 0x00ff00ff00ff00ff;
const MAGIC_5: u64 = 0x0000ffff0000ffff;
const MAGIC_6: u64 = 0x00000000ffffffff;

let x = x.unsigned_abs();
let x = (x & MAGIC_1) + ((x >> 1) & MAGIC_1);
let x = (x & MAGIC_2) + ((x >> 2) & MAGIC_2);
let x = (x & MAGIC_3) + ((x >> 4) & MAGIC_3);
let x = (x & MAGIC_4) + ((x >> 8) & MAGIC_4);
let x = (x & MAGIC_5) + ((x >> 16) & MAGIC_5);
let x = (x & MAGIC_6) + ((x >> 32) & MAGIC_6);
x as usize
}

fn main() {
assert_eq!(bit_count(65535), 16);
assert_eq!(bit_count(15), 4);
assert_eq!(bit_count(6), 2);
assert_eq!(bit_count(1), 1);
assert_eq!(bit_count(0), 0);
assert_eq!(bit_count(-1), 1);
assert_eq!(bit_count(-6), 2);
assert_eq!(bit_count(-15), 4);
assert_eq!(bit_count(-65535), 16);
}
2025/02/27(木) 08:26:19.30ID:LSRTW28H
>>656 Rust

trait BitCount {
 fn bit_count(&self) -> usize;
}
impl BitCount for i32 {
 fn bit_count(&self) -> usize {
  self.unsigned_abs().count_ones() as usize
 }
}
use num::{BigInt, One};
impl BitCount for BigInt {
 fn bit_count(&self) -> usize {
  self.iter_u64_digits().map(|x| x.count_ones() as usize).sum()
 }
}

fn main() {
 for (input, output) in [(65535, 16), (15, 4), (6, 2), (1, 1), (0, 0), (-1, 1), (-6, 2), (-15, 4), (-65535, 16)] {
  assert_eq!(input.bit_count(), output);
 }
 assert_eq!(BigInt::from(-1).bit_count(), 1);
 assert_eq!((BigInt::from(2).pow(1_000_000_000) - BigInt::one()).bit_count(), 1_000_000_000);
}
660デフォルトの名無しさん
垢版 |
2025/02/28(金) 01:30:55.49ID:1HSOHgVq
intは処理単位のことなんだけどな
何ビットで表現できるかという意味ではない
6619
垢版 |
2025/02/28(金) 03:12:43.15ID:MEvV9q87
負の場合に表現可能なビット数を配慮しないとPython の int.bit_count()と同じ結果にならないんジャマイカじゃまいか
たぶんPythonの整数がbigintのせいだとおもう
絶対値とってpopcountとかやらないと意外とあれこれ書いてプチ長めのコードになりそうなおかん
2025/02/28(金) 23:07:16.17ID:SRu+xdWw
よく見たらみんな絶対値をとったりbigintを使ったりしてるな
663デフォルトの名無しさん
垢版 |
2025/03/01(土) 20:18:20.34ID:H8RpZRUP
>>656
PowerShellのBigIntなら、

$b = @(0)
1..8 |% {$b += $b |% {$_ + 1}}

function bit_count([BigInt]$n)
{
  ($b[[BigInt]::Abs($n).ToByteArray()] | measure -sum).Sum
}

65535, 15, 6, 1, 0, -1, -6, -15, -65535, [BigInt]::Pow(123, 45) |% {
  "$_ → $(bit_count $_)"
}

[実行結果]
65535 → 16
15 → 4
6 → 2
1 → 1
0 → 0
-1 → 1
-6 → 2
-15 → 4
-65535 → 16
11110408185131956285910790587176451918559153212268021823629073199866111001242743283966127048043 → 159
664デフォルトの名無しさん
垢版 |
2025/03/01(土) 20:19:24.06ID:H8RpZRUP
お題:1からnまでの自然数のビット単位での総排他的論理和1 ⊕ 2 ⊕ 3 ⊕ … ⊕ nを求める
関数を作り、n = 123456789, 12345678901234567890のときの値を表示せよ。
665デフォルトの名無しさん
垢版 |
2025/03/01(土) 21:19:28.22ID:5VrbV50/
A003815かな
2025/03/01(土) 21:32:49.43ID:UfbLQAky
数学の試験で中間式を省いて解答だけ書くタイプw
667デフォルトの名無しさん
垢版 |
2025/03/01(土) 23:41:19.76ID:+HRoh0yF
まあ数列の問題ならOEISを見てみるよな
2025/03/02(日) 01:21:29.93ID:xdmIFouH
>> 664  Rust
fn f(n: u64) -> u64 {
 // f(n) = 1⊕2⊕3⊕...⊕n とすると (2k)⊕(2k+1)=1 であるから 1⊕1=0 より
 // f(4k+1) = (4k+1)⊕(4k)⊕(4k-1)⊕(4k-2)⊕f(4k-3) = f(4(k-1)+1) = ... = f(1) = 1
 // f(4k+3) = (4k+3)⊕(4k+2)⊕f(4k+1) = 0
 // f(4k) = (4k)⊕f(4k-1) = 4k
 // f(4k+2) = (4k+2)⊕f(4k+1) = (4k+2)⊕1 = 4k+3
 match n % 4 {
  0 => n,
  1 => 1,
  2 => n + 1,
  3 => 0,
  _ => unreachable!(),
 }
}

fn main() {
 for n in [123456789, 12345678901234567890] {
  println!("f({n}) = {fn}", fn = f(n));
 }
}
出力
f(123456789) = 1
f(12345678901234567890) = 12345678901234567891
669デフォルトの名無しさん
垢版 |
2025/03/11(火) 21:18:30.26ID:Qmk3F8/1
>>656
PowerShellでもPopCountがいつの間にか使えるようになっていた。Version 7.5.0で動作確認。

function bit_count($n)
{
  [BigInt]::PopCount([BigInt]::Abs($n))
}

65535, 15, 6, 1, 0, -1, -6, -15, -65535, [BigInt]::Pow(123, 45) |% {
  "$_ → $(bit_count $_)"
}

実行結果は>>663と同じ。
670デフォルトの名無しさん
垢版 |
2025/03/13(木) 20:35:03.45ID:QP/8WHEA
お題:数列が入力される。元の数列に逆順にした数列を減算したときの値を出力せよ

In < 12345
OUt > -41976 (12345 - 54321)
671デフォルトの名無しさん
垢版 |
2025/03/13(木) 21:13:53.77ID:SRpNsp20
>>670
PowerShell

function f([BigInt]$n)
{
  $c = [char[]][string]$n
  $n - [BigInt]-join $c[-1..-$c.length]
}

12345, [BigInt]::Pow(12, 34) |% {"$_ → $(f $_)"}

[実行結果]
12345 → -41976
4922235242952026704037113243122008064 → 314233029528909439273950854852378624
2025/03/14(金) 02:10:51.25ID:wjeVVi0w
>>671
12の34乗は合っているけどその後の差がおかしくない?
4922235242952026704037113243122008064 から
4608002213423117304076202592425322294 を引いて
314233029528909399960910650696685770 が正解のところ
314233029528909439273950854852378624 となっているよ
正解は1の位が「4 - 4 = 0」になるはずだよね

>>670 Rust 逆文字列を生成する版

use num::BigInt;

fn odai(input: &str) -> Option<String> {
 let rev_input: String = input.chars().rev().collect();
 let x: BigInt = input.parse().ok()?;
 let y: BigInt = rev_input.parse().ok()?;
 Some((x - y).to_string())
}

fn main() {
 assert_eq!(odai("12345"), Some("-41976".to_string()));
 assert_eq!(odai("4922235242952026704037113243122008064"), Some("314233029528909399960910650696685770".to_string()));
}
2025/03/14(金) 02:30:00.58ID:wjeVVi0w
>>670 Rust 逆文字列を生成しない&整数ジェネリック版
use num::{BigInt, CheckedAdd, CheckedMul, CheckedSub, FromPrimitive};

fn chars_to_integer<X>(input: impl Iterator<Item = char>) -> Option<X>
 where X: FromPrimitive + CheckedMul + CheckedAdd,
{
 let (zero, ten) = (X::from_u32(0).unwrap(), X::from_u32(10).unwrap());
 input
  .map(|c| X::from_u32(c.to_digit(10)?))
  .try_fold(zero, |acc, x| acc.checked_mul(&ten)?.checked_add(&x?))
}

fn odai<X>(input: &str) -> Option<X>
 where X: FromPrimitive + CheckedMul + CheckedAdd + CheckedSub,
{
 let x = chars_to_integer::<X>(input.chars())?;
 let y = chars_to_integer::<X>(input.chars().rev())?;
 x.checked_sub(&y)
}

fn main() {
 assert_eq!(odai::<i64>("12345"), Some(-41976));
 assert_eq!(odai::<BigInt>("4922235242952026704037113243122008064"), Some("314233029528909399960910650696685770".parse::<BigInt>().unwrap()));
}
674デフォルトの名無しさん
垢版 |
2025/03/14(金) 20:19:17.17ID:Imul3vYR
>>672
確かに間違っていた。PowerShellの旧ヴァージョンでは [BigInt]文字列 と書くだけで
文字列をBigInt型に正確に変換できるから>>671のプログラムでも正しい結果が得られるが、
新ヴァージョンではdouble経由での変換に仕様変更されたようで誤差が生じてしまうから
[BigInt]::Parse(文字列) と書かなければならなくなった。
675デフォルトの名無しさん
垢版 |
2025/03/14(金) 21:36:16.55ID:pC/XkvI4
数列の長さは指定されていない。

10 INPUT "0-9";I
20 PRINT "0"
30 END
2025/03/15(土) 19:04:58.28ID:GCbQqql0
>>673
これらのwhere~は何という名称ですか?

> where X: FromPrimitive + CheckedMul + CheckedAdd,
> where X: FromPrimitive + CheckedMul + CheckedAdd + CheckedSub,
6779
垢版 |
2025/03/16(日) 00:12:31.12ID:8GU62dKf
>>670 Perl5

use bigint;
print $_ - reverse($_), "\n" for 12345, 4922235242952026704037113243122008064;


実行結果

$ perl 22_670_reverse_minus_biginit.pl
-41976
314233029528909399960910650696685770
678 警備員[Lv.23]
垢版 |
2025/03/16(日) 17:25:01.96ID:wlGuyFJ7
>>670
Kotlin

文字列にしてひっくり返しているだけの何の捻りもないプログラム

https://paiza.io/projects/VBq2l9lhzmUxVo6xAMuAHg
679デフォルトの名無しさん
垢版 |
2025/03/16(日) 22:59:41.54ID:wtk+s/+W
>>670
PowerShellでジェネリック化(もどき?)
途中式や結果が入力値の型で表せない場合は$nullを返す。

function f($n)
{
  $T = $n.GetType()
  $s = [string]$n
  try {
    $n - $T::Parse(-join $s[-1..-$s.Length]) -as $T
  } catch {
    $null
  }
}

12345, [BigInt]::Pow(12, 34), [byte]12, [sbyte]12, [sbyte]123, -123 |% {
  "[$($_.GetType())]$_ → $(f $_)"
}

-- 実行結果 --
[int]12345 → -41976
[bigint]4922235242952026704037113243122008064 → 314233029528909399960910650696685770
[byte]12 →
[sbyte]12 → -9
[sbyte]123 →
[int]-123 →
680デフォルトの名無しさん
垢版 |
2025/03/16(日) 23:01:39.52ID:6JX6mCC/
お題:36桁以下の負でない整数で16進表記が10進表記の部分文字列であるものをすべて求めて下さい。

(例)
・1の16進表記1は10進表記1の部分文字列です
・123の16進表記7Bは10進表記123の部分文字列ではありません
・357440の16進表記57440は10進表記357440の部分文字列です

※遅い言語では15桁以下で解いても構いません
2025/03/16(日) 23:59:39.36ID:qWmLE6LP
>>676
where句だよ
型Xのトレイト境界を宣言してる
6829
垢版 |
2025/03/18(火) 16:05:22.66ID:GYPHuJM6
>>680 Perl5、ナイーブな処理方式だと時間がかかり過ぎで最後まで解けないおそれがあるが、なかなかほかに回答者が現れないし、
出現傾向を見るだけでも…と思って、16進数の桁にa-fの現れる値をskipするナイーブな処理方法で。

$m = sprintf '%x', 9 x 15; # 10進で15桁まで
print $m . ' '. hex($m)."\n";
$m =~ s/[a-f]/9/g;
print "1 .. 0x$m\n";
print "".localtime."\n";
for (1 .. $m) {
 $d = hex($_);
 if (0 <= index($d, $_)) {
  $n++;
  print "$d, 0x$_\n";
 }
}
print "".localtime."\n";
print "$n count found";
6839
垢版 |
2025/03/18(火) 16:07:07.28ID:GYPHuJM6
>>682
実行結果 (改行数を減らすため適度につなげてます)
$ perl 22_680_hex_substr_1.pl
38d7ea4c67fff 999999999999999
1 .. 0x3897994967999
Tue Mar 18 09:15:31 2025
1, 0x1   2, 0x2   3, 0x3   4, 0x4   5, 0x5   6, 0x6   7, 0x7   8, 0x8   9, 0x9
357440, 0x57440   357441, 0x57441   357442, 0x57442   357443, 0x57443   357444, 0x57444
357445, 0x57445   357446, 0x57446   357447, 0x57447   357448, 0x57448   357449, 0x57449
1079653, 0x107965   1081713, 0x108171   1122966, 0x112296   1123079, 0x112307   1123080, 0x112308
2246166, 0x224616   3369253, 0x336925   3371313, 0x337131   3412566, 0x341256
4494393, 0x449439   4494400, 0x449440   4535653, 0x453565
5658739, 0x565873   5658740, 0x565874   5660793, 0x566079   5660800, 0x566080   5702166, 0x570216
6783879, 0x678387   6783880, 0x678388   6784000, 0x678400
6825253, 0x682525   7948339, 0x794833   7948340, 0x794834   7950393, 0x795039   7950400, 0x795040
2182104640, 0x82104640   2182104641, 0x82104641   2182104642, 0x82104642   2182104643, 0x82104643   2182104644, 0x82104644
2182104645, 0x82104645   2182104646, 0x82104646   2182104647, 0x82104647   2182104648, 0x82104648   2182104649, 0x82104649
1263629042727, 0x12636290427   1307655353654, 0x13076553536   2573583194436, 0x25735831944   2617616245848, 0x26176162458
3330782168640, 0x30782168640   3330782168641, 0x30782168641   3330782168642, 0x30782168642   3330782168643, 0x30782168643
3330782168644, 0x30782168644   3330782168645, 0x30782168645   3330782168646, 0x30782168646   3330782168647, 0x30782168647
3330782168648, 0x30782168648   3330782168649, 0x30782168649   3883544086630, 0x38835440866   3927569962533, 0x39275699625
3927570397557, 0x39275703975

Core i7-8559U で6時間ほど実行してここまで高々13桁。
やはり想定通り気の利いた高速解放が要りますテヘペロ。
2025/03/18(火) 16:35:06.57ID:lVLkTjWA
>>680
ruby
(0..10**16-1).each{|e| puts "#{e},0x#{e.to_s(16)}" if %r|[a-f]|!~e.to_s(16)}
685デフォルトの名無しさん
垢版 |
2025/03/18(火) 21:39:06.90ID:9hwr8+MV
>>683
14桁と15桁には該当値がないので、そこに列挙された数に0を追加した72個が15桁以下の答で
結果的には合っているよ。

出題時に作ったC++プログラムはideoneで36桁以下を0.43秒で完了した。これをPowerShellに
移植したプログラムは15桁以下を0.5秒未満、36桁以下を数分で完了した。

その後、改良したC++プログラムではideoneで36桁以下を0.23秒に短縮できた。
6869
垢版 |
2025/03/18(火) 21:41:48.53ID:GYPHuJM6
>>683
>やはり想定通り気の利いた高速解放が要りますテヘペロ。

そのヒントになるかいな…?
・16進数を10進数に変換すると桁数は同じまたは高々1桁増えるのみ(だともう、証明略)
・桁数が同じ場合、16進数と10進数が同じということはあり得ない、自明
・一桁増える場合は先頭または末尾に一桁増える。残りが16進数と同じ部分文字列であるかが評価対象となる
6879
垢版 |
2025/03/18(火) 21:42:49.00ID:GYPHuJM6
>>685
あそうなんだ。じゃオレ様が一番乗りということでヨロ
ノシ
6889
垢版 |
2025/03/18(火) 21:52:10.05ID:GYPHuJM6
>>686
>・一桁増える場合は先頭または末尾に一桁増える。残りが16進数と同じ部分文字列であるかが評価対象となる

二桁増える場合があるのでこれは誤りでした
689684
垢版 |
2025/03/19(水) 06:18:11.44ID:khMnA4jS
ようやく題意は理解したけど良い解法が思いつかない
ちなみに36桁以下だと答えはいくつありますか?
2025/03/19(水) 08:44:27.79ID:khMnA4jS
>>680
ruby 遅いけど
i=0
while i<10**16
if %r|[a-f]|=~i.to_s(16)
i=i.to_s(16).gsub(%r|[a-f].*|){|e| e.gsub(%r|.|,"f")}.hex
else
puts "#{i},0x#{i.to_s(16)}" if %r|#{i.to_s(16)}|=~i.to_s
end
i+=1
end
6919
垢版 |
2025/03/19(水) 16:33:58.47ID:kDrq13vm
>>686
> ・桁数が同じ場合、16進数と10進数が同じということはあり得ない、自明

大間違い。16進数と10進数で桁数が同じ値のうち、一桁のものは、16進も10審も同じだった…orz

結局、高速解放はあるんだろうか?
あるいはコラッツ予想みたいに「無いかもしれない」類の、考えるだけ無駄な問題なのだろうか?
692デフォルトの名無しさん
垢版 |
2025/03/19(水) 21:08:24.40ID:VtmjGkS9
>>689
167個で最大値は697786638998562641695629924526065234

>>691
時間をかけて64桁以下で解いたら、405個で最大値は

 2714476666993915057605587441263923823484611431446449961712093492

だった。これはナイーヴな解法ではC++ですら到底求められない値だから、高速解法が
実在する証になっているだろう。

解答例は1週間くらい経ったら載せるので、それまでよく考えてみて下さい。
693デフォルトの名無しさん
垢版 |
2025/03/19(水) 22:39:07.36ID:P0JLFopv
お題:単位分数のエジプト風分解(2進数風味)
1/aを、1/a=1/b+c/dを満たす1/bとc/dに分解する。
aは1以上の整数とする。
c, dは整数とし、bは2の整べき乗(1, 2, 4,...)とする。
c/dは絶対値が最小である事(負数であってもよい)。

例:
1/3→1/4+1/12 : b=4, c=1, d=12
1/7→1/8+1/56 : b=8, c=1, d=56
1/9→1/8-1/72 : b=8, c=-1, d=72(c=1, d=-72も可)
1/13→1/16+3/208 : b=16, c=3, d=288
1/60→1/64+1/960 : b=64, c=1, d=960
694693
垢版 |
2025/03/19(水) 22:42:43.02ID:P0JLFopv
aは2以上の整数とする。
に訂正します。
695デフォルトの名無しさん
垢版 |
2025/03/19(水) 23:16:25.83ID:G4dDQ6P7
>>693
R
https://ideone.com/TaaAw2

aが2の整べき乗の場合の出力形式に指定がなかったので適当に決めた。
2025/03/20(木) 08:21:38.87ID:6IEA4H0O
>>693 Rust
fn f(a: i64) -> String {
 let b = (a as u64).next_power_of_two() as i64;
 let b = if 3 * a > 2 * b { b } else { b >> 1 };
 let (c, d) = (b - a, a * b);
 let shift = c.trailing_zeros().min(d.trailing_zeros());
 let (c, d) = (c >> shift, d >> shift);
 if a == b {
  format!("1/{a}=1/{b}")
 } else {
  format!("1/{a}=1/{b}{c:+}/{d}")
 }
}

fn main() {
 assert_eq!("1/3=1/4+1/12", f(3));
 assert_eq!("1/7=1/8+1/56", f(7));
 assert_eq!("1/9=1/8-1/72", f(9));
 assert_eq!("1/13=1/16+3/208", f(13));
 assert_eq!("1/60=1/64+1/960", f(60));
 assert_eq!("1/64=1/64", f(64));
 assert_eq!("1/6718464=1/8388608+1631/55037657088", f(6718464));
 assert_eq!("1/123456789=1/134217728+10760939/16570089725755392", f(123456789));
}
2025/03/21(金) 12:56:29.73ID:CgJbZEAu
>>680  Rust
fn odai_680() -> Vec<i128> {
 let mut answer = vec![0];
 let n_max = (0..).find(|&n| pow16(n + 1) > pow10(36)).unwrap();
 for s in (0..).take_while(|&s| pow16(n_max) >= pow10(n_max + s + 1)) {
  let c = (0..=n_max).map(|i| pow16(i) - pow10(i + s)).collect::<Vec<_>>();
  let rmax = c.iter().scan(0, |s, &c| { *s += if c > 0 { c * 9 } else { 0 }; Some(*s) }).collect::<Vec<_>>();
  let rmin = c.iter().scan(0, |s, &c| { *s += if c < 0 { c * 9 } else { 0 }; Some(*s) }).collect::<Vec<_>>();
  let (mut i, mut n, mut d, mut ct) = (0, 1, vec![0; c.len()], vec![0; c.len() + 1]);
  loop {
   d[i] += 1;
   if d[i] < 10 {
    let m = pow10(n as u32 + s); ct[i] = c[i] * d[i] + ct[i+1];
    if i == 0 {
     if ct[0] >= 0 && ct[0] % m < pow10(s) { answer.push(d.iter().take(n).rev().fold(0, |sum, &d| sum * 16 + d)) }
    } else {
     let (max, min) = (ct[i] + rmax[i-1], ct[i] + rmin[i-1]);
     if max >= 0 && (max - min > m || pow10(s) > min % m || min % m > max % m) { i -= 1; }
    }
   } else { d[i] = -1; i += 1; if i == n { if n == d.len() { break; } n += 1; } }
  }
 }
 answer.sort(); answer
}
2025/03/21(金) 12:58:11.47ID:CgJbZEAu
>>697
// 略記
fn pow16(x: u32) -> i128 { 16_i128.pow(x) }
fn pow10(x: u32) -> i128 { 10_i128.pow(x) }

// 結果検証
fn main() {
 let answer = odai_680();
 assert_eq!(167, answer.len());
 for &a in &answer {
  assert!(a.to_string().contains(&format!("{a:x}")));
 }
 assert_eq!(0, answer[0]);
 assert_eq!(1, answer[1]);
 assert_eq!(357440, answer[10]);
 assert_eq!(2182104649, answer[54]);
 assert_eq!(3927570397557, answer[71]);
 assert_eq!(38135630558262267902210, answer[99]);
 assert_eq!(331052794565713975838768757043267, answer[152]);
 assert_eq!(697786638998562641695629924526065234, answer[answer.len() - 1]);
}
699デフォルトの名無しさん
垢版 |
2025/03/21(金) 20:49:29.98ID:uwhksDTb
>>697-698
Rustはよく知らないが、mainのforループ内をprintln!("{}", a);に置き換えれば解が表示されるんだよね?
実行結果を>>685で述べたC++プログラムのものと照合したら167個の解すべてが一致した。見事正解!
実行時間はC++プログラムの数倍かかるようだが、ideoneでの実行時間も見たいので載せて下さい。
700デフォルトの名無しさん
垢版 |
2025/03/23(日) 23:00:51.13ID:pi1bImlR
>>680から1週間経ったので解答例を掲載

>>685を書いたときに作ってあった2つのC++プログラム
https://ideone.com/KID2jR
https://ideone.com/ysdd6b

1番目ではsolve関数の再帰呼び出しの対象とするx[p]の下限と上限を線形探索するが、
2番目では二分探索する。要素数10では二分探索の効果は薄いと思いきや、大分速くなった。

2番目を読み返していたらバグを発見してしまった。i = N - 1のとき63行目のa[i + 1]はa[N]となり
配列の添字範囲外アクセス。0との比較だけだし、if文の評価がどっちでも以降の処理は結局同じだから、
実害も解への影響もないが、厳格さが必要ならif ((i + 1 < N ? a[i + 1] : 0) >= 0) {と書き換えるべきだな。
実行時間への影響は無視できる。

それぞれのPowerShellへの移植版
https://ideone.com/vEGZ3D
https://ideone.com/azzMa4

完全な逐語訳ではなく、PowerShellで書くと遅くなったり煩雑になったりする箇所は適宜改変した。
15桁以下の場合は64ビット整数でも桁溢れしないので、BigIntの代わりにInt64を使えば少し速くなる。
701デフォルトの名無しさん
垢版 |
2025/03/24(月) 22:16:36.44ID:/lNBwDBZ
非素数であることが既知の巨大整数を素因数分解するときの
最速のアルゴリズムって何がある?
702デフォルトの名無しさん
垢版 |
2025/03/25(火) 15:25:56.57ID:Yc/egiP0
>>699
> 実行時間はC++プログラムの数倍かかるようだが

rustc -C opt-level=2 でコンパイルしたら
g++ -O2 でコンパイルした ideone_KID2jR.cpp (>>700の一つめ) とほぼ同じ速度出たよ
2025/03/25(火) 15:54:47.24ID:GZ5kfx5g
>>702
データ精度を揃えたアルゴリズム比較のために
>>697-698をi128固定ではなくnum::BigIntにして計測して見ては?

あと出題者>>685>>700の二つ目で(倍速以上に)短縮出来たと言っているよ
704デフォルトの名無しさん
垢版 |
2025/03/25(火) 16:11:02.68ID:Yc/egiP0
そこまでは興味ないや
「数倍」だったのはもしかして最適化オプション付けてなかったんじゃない?ってだけの話
705デフォルトの名無しさん
垢版 |
2025/03/25(火) 17:30:47.40ID:Yc/egiP0
>>697-698をBigIntに変えるのはどうしたらいいのか分かんなかったので
>>700の方を boost::multiprecision::cpp_int から boost::multiprecision::int128_t に変えてみた

改変版 | オリジナル
https://ideone.com/Ie0HhO 0.12s | https://ideone.com/KID2jR 0.43s
https://ideone.com/np3p5h 0.11s | https://ideone.com/ysdd6b 0.23s
2025/03/25(火) 20:18:24.92ID:oTGl9wWX
>>705
感心した、出題者回答C++コードはほんの少し変更するだけで簡単にBigInt/i128切り替え出来るのか

>>697-698
Rustはどうなのかな?
707デフォルトの名無しさん
垢版 |
2025/03/25(火) 23:43:24.86ID:V/NXIH+S
>>704
>>699では最適化オプションを付けてrustc -O a.rsでコンパイルした。最適化なしでは
ありの4.6倍くらい掛かった。もしやと思ってコンパイラをアップデートしてみたら、
実行時間は約3分の1に激減し、>>700の1番目と大差ない1.3倍ほどに収まった。

Rustの古いコンパイラ(5年前のもの)がこんなに低性能だったとは…
2025/03/27(木) 11:39:31.21ID:vU3T1Sq/
>>697
crateのnumを使う
709デフォルトの名無しさん
垢版 |
2025/03/27(木) 20:29:20.38ID:DyGv4jyd
c言語で実用的なプログラムを作りたい。
いいテーマはありますか?
2025/03/27(木) 20:35:59.71ID:cvPlHeM5
お題:#(シャープ)を入力の段数でウンコ状に並べて出力せよ
出力は全角でも半角でもどちらでもよしとする(5ch は半角スペース表示できない)

in < 3
out >
  #
 ###
#####
711デフォルトの名無しさん
垢版 |
2025/03/27(木) 21:06:27.50ID:AGn6MWSp
>>710
PowerShell

function unko($n)
{
  if ($n -ge 1) {1..$n |% {" " * ($n - $_) + "#" * (2 * $_ - 1)}}
}

unko 3

-- 実行結果 --
  #
 ###
#####
712デフォルトの名無しさん
垢版 |
2025/03/28(金) 21:33:35.13ID:VDfNaTNz
お題:素因数の総和が2025である2000万以下の自然数をすべて求めて下さい。

例)
32272
 素因数分解すると32272 = 2 × 2 × 2 × 2 × 2017で、
 素因数の総和は2 + 2 + 2 + 2 + 2017 = 2025となります。

※20億以下でもC++で5秒以内に余裕で完了できますが、出力が長すぎるため2000万以下としました。
 その結果、Rでも5秒以内に余裕で完了できる問題になりました。
713デフォルトの名無しさん
垢版 |
2025/03/28(金) 21:54:52.53ID:e6/uDocq
>>710
山状ではだめだったのか
俺にはわからない
714デフォルトの名無しさん
垢版 |
2025/03/28(金) 22:12:15.09ID:g08AymBh
お題
AさんがBさんに惚れてることを
A-B
と表します

両思いのペアを出力してください

入力
D-L,U-X,U-Y,U-R,Z-B,B-E,B-M,B-N,V-H,V-X,W-F,W-R,R-B,R-W,O-W,O-S,F-A,Q-X,P-E,P-L,X-X,Y-M,Y-C,L-U,L-V,I-X,E-B,H-M,A-S

出力
B,E
R,W
715デフォルトの名無しさん
垢版 |
2025/03/28(金) 22:28:49.68ID:VDfNaTNz
>>714
PowerShell

$s = "D-L,U-X,U-Y,U-R,Z-B,B-E,B-M,B-N,V-H,V-X,W-F,W-R,R-B,R-W,O-W,O-S,F-A,Q-X,P-E,P-L,X-X,Y-M,Y-C,L-U,L-V,I-X,E-B,H-M,A-S"
$h = @{}
$s -split "," |% {
  $a, $b = $_ -split "-"
  $h[$a] += , $b
}

foreach ($a in $h.keys) {
  foreach ($b in $h[$a]) {
    if ($a -lt $b -and $h[$b] -contains $a) {"$a,$b"}
  }
}

-- 実行結果 --
B,E
R,W
716デフォルトの名無しさん
垢版 |
2025/03/28(金) 23:19:47.32ID:VDfNaTNz
>>714
PowerShellでもう少し短く

$s = "D-L,U-X,U-Y,U-R,Z-B,B-E,B-M,B-N,V-H,V-X,W-F,W-R,R-B,R-W,O-W,O-S,F-A,Q-X,P-E,P-L,X-X,Y-M,Y-C,L-U,L-V,I-X,E-B,H-M,A-S"
$h = @{}
$s -split "," |% {
  $a, $b = $_ -split "-"
  $i, $t = if ($a -lt $b) {1, "$a,$b"} else {2, "$b,$a"}
  $h[$t] = $h[$t] -bor $i
}

$h.keys |? {$h[$_] -eq 3} | sort

-- 実行結果 --
B,E
R,W
2025/03/29(土) 11:51:50.06ID:UeqVkFR5
>>714
Rust

use itertools::Itertools;

fn f(input: &str) -> impl Iterator<Item = &str> {
 input.split(',')
  .map(|pair| (pair, pair.splitn(2, '-').collect_tuple().unwrap()))
  .filter(|(_, (a, b))| a < b)
  .flat_map(|(pair, (a, b))| {
   input.split(',')
    .map(|pair| pair.splitn(2, '-').collect_tuple().unwrap())
    .filter_map(move |(x, y)| (a == y && b == x).then_some(pair))
  })
}

fn main() {
 let input = "D-L,U-X,U-Y,U-R,Z-B,B-E,B-M,B-N,V-H,V-X,W-F,W-R,R-B,R-W,O-W,O-S,F-A,Q-X,P-E,P-L,X-X,Y-M,Y-C,L-U,L-V,I-X,E-B,H-M,A-S";
 itertools::assert_equal(["B-E", "R-W"], f(input).sorted());
}
2025/03/30(日) 01:28:45.68ID:KrBJAiIU
お題:1〜10までの範囲の乱数生成をn回行ったとき出た値の積が20の倍数になる確率Pnを出力せよ

n=2
2, 10 ... 20
4, 5 ... 20
Pn=???

n=3
2, 5, 2 ... 20
4, 5, 2 ... 40
Pn=???
719デフォルトの名無しさん
垢版 |
2025/03/30(日) 15:24:52.85ID:6QsLEZYT
>>718
ん?
何千回も試行してその実際の発生率を出すの?
それとも数学的に確率の理論値を出すの?
2025/03/30(日) 15:35:52.69ID:bQF7/1H+
後者で学校の課題な予感がするな
721デフォルトの名無しさん
垢版 |
2025/03/30(日) 20:11:24.72ID:qyCZpZxd
>>718
R Version4
https://ideone.com/r03zEZ

ideoneのRは古すぎてエラーが出てしまうので、出力は入力欄に記載した。

巨大整数型を使わなければideoneでも実行できる。
https://ideone.com/K0RefY
722デフォルトの名無しさん
垢版 |
2025/03/30(日) 20:58:57.54ID:qyCZpZxd
>>718
C++への移植版
https://ideone.com/g87ECX

これもideoneのC++が古すぎて10行目をm = size(d)と書けず変更せざるを得なかった。
723 警備員[Lv.4]
垢版 |
2025/03/31(月) 03:24:21.45ID:V+SeThnI
>>714
Kotlin
//paiza.io/projects/WMZL8ULLNxc0zJQPI2uUsA
URLあると書けなかったので先頭のhttps:を抜いた。
2025/03/31(月) 05:32:04.89ID:lZyiUZP+
>>718
学校の課題をここに書くなって教わらなかったの?
725デフォルトの名無しさん
垢版 |
2025/03/31(月) 22:37:26.59ID:eEIz6yDp
>>718
>>721-722を整理して行列とヴェクトルの積ですっきり書けるようにした。

R (ideoneでも巨大整数型で実行可能になった)
https://ideone.com/sHNag3
C++
https://ideone.com/7zgflb

式を展開してしまえばPowerShellで結局これだけ。

$a, $b, $c, $d, $e, $f = 0, 1, 1, 2, 2, [BigInt]4

2..100 |% {
  $a = 10 * $a + 5 * $b + 2 * $c + 2 * $d +   $e
  $b =      5 * $b + 3 * $c +        $e +   $f
  $c =           5 * $c +            $f
  $d =               8 * $d + 4 * $e + 2 * $f
  $e =                    4 * $e + 2 * $f
  $f =                        4 * $f
  for ($p = $a; $p % 10 -eq 0; $p /= 10) {}
  "P[$_] = 0.$p"
}
726デフォルトの名無しさん
垢版 |
2025/04/01(火) 22:39:42.98ID:9GVSWQu0
半角スペースの意味がわからない
そういうこだわりは古臭いよ
2025/04/02(水) 13:29:35.55ID:k9Y5euIy
いまどきのプログラミングなら出力はHTMLだよな
2025/04/02(水) 13:47:27.57ID:hi8l+lAW
PHPさえその動作禁止だぞ
729デフォルトの名無しさん
垢版 |
2025/04/02(水) 14:31:23.27ID:vIYRPSqy
>>725
変数名がa、b、cの時点でプロじゃねえな
2025/04/02(水) 15:10:39.64ID:hi8l+lAW
行列演算は数学でもa,b,c,dだから…
731デフォルトの名無しさん
垢版 |
2025/04/02(水) 19:51:02.16ID:7MGV8+qg
俺が言ってるのは5chのプロじゃねえなってことだから
数学は関係ない
732デフォルトの名無しさん
垢版 |
2025/04/02(水) 19:56:31.51ID:/hTkauy0
5chのプロ 笑
2025/04/02(水) 20:14:17.34ID:ZWpp3MuE
5chのプロはどんな変数名使うのか教えて
734デフォルトの名無しさん
垢版 |
2025/04/02(水) 21:11:27.43ID:HCJVcqu8
>>726
>>725の全角空白のこと? 項の書き忘れや書き間違いがないか分かりやすくするため。余分な空白や長い変数名が
ディスク・メモリ空間やコンパイル・インタプリト時間を無駄に増やすと気にする方が古臭くない?

とはいえ、今でもインタプリタ言語のPowerShellでは変数名を長くすると顕著に遅くなる。例えば、

$t1 = measure-command {for ($i = 0; $i -lt 1000000; $i++) {}}
$t2 = measure-command {for ($AnExtraordinarilyLongVariableName = 0; $AnExtraordinarilyLongVariableName -lt 1000000; $AnExtraordinarilyLongVariableName++) {}}
$t2.Ticks / $t1.Ticks

をPowerShell Ver.7で実行すると1.56前後の値が表示される。奇妙なことに、かなり古いVer.2では1前後の値になる。
実時間ではVer.7の$t2とVer.2の$t2が同程度なので、Ver.7では短い変数名での最適化が施されているということか。

それはさておき、>>712を解く人はいませんか?
735デフォルトの名無しさん
垢版 |
2025/04/02(水) 23:31:04.18ID:vIYRPSqy
>>734
縦に揃えるのは無駄に横に長くなる
736デフォルトの名無しさん
垢版 |
2025/04/02(水) 23:33:04.35ID:vIYRPSqy
>>734
ループは毎回、構文を解析しているわけじゃねえぞ?
737 警備員[Lv.5]
垢版 |
2025/04/05(土) 14:46:26.08ID:bpkT9prW
>>719
このお題の場合は数学的に答えを出そうとするとプログラムを作る必要がなくなってしまわないか?
人が普通に数学的に考えて行くと答えが出てしまいそうな気がするんだが。
またはAIに聞いたらすぐ答えが出そうな感じが。
2025/04/08(火) 23:28:40.30ID:OzdBhfzQ
>>712  Rust
fn solve(n: usize, limit: usize) -> Vec<usize> {
 let mut answer = Vec::new();
 let mut pnt = generate_primes(n).iter().skip(1).rev().map(|&p| (p, 0, 0)).collect::<Vec<_>>();
 let (mut ci, mut cn, mut ct) = (0, n, 1_usize);
 'advance: loop {
  pnt[ci..].iter_mut().for_each(|(_p, n, t)| (*n, *t) = (cn, ct));
  if cn & 1 == 0 && ct.leading_zeros() >= (cn >> 1) as u32 {
   ct <<= cn >> 1;
   if ct <= limit { answer.push(ct as usize); }
  }
  for (i, (p, n, t)) in pnt.iter_mut().enumerate().rev() {
   if *n < *p { continue; }
   *n -= *p; *t *= *p;
   if *t > limit { continue; }
   if *n == 1 { continue; }
   if *n == 0 { answer.push(*t as usize); continue; }
   (ci, cn, ct) = (i, *n, *t);
   continue 'advance;
  };
  break;
 }
 answer.sort(); answer
}
2025/04/08(火) 23:30:40.48ID:OzdBhfzQ
>>738
素因数の総和が2025になる問題を可能な素数の組合せ総当りで挑戦してみました
20億以下で約0.4秒と規定時間以内に実行できました
実行時間 solve(2025, 20000000): 22.638309ms
実行時間 solve(2025, 2000000000): 418.607978ms

fn main() {
 for (n, limit) in [(2025, 2000_0000), (2025, 20_0000_0000)] {
  let start_time = std::time::Instant::now();
  let answer = solve(n, limit);
  let end_time = std::time::Instant::now();
  println!("実行時間 solve({n}, {limit}): {:?}", end_time - start_time);

  // 個数と最初と最後の検証
  let (valid_len, valid_first, valid_last) = match (n, limit) {
   (2025, 2000_0000) => (1265, 30255, 19970000),
   (2025, 20_0000_0000) => (49942, 30255, 1999986740),
   _ => (0, 0, 0),
  };
  assert_eq!(answer.len(), valid_len);
  assert_eq!(*answer.first().unwrap(), valid_first);
  assert_eq!(*answer.last().unwrap(), valid_last);
 }
}
740デフォルトの名無しさん
垢版 |
2025/04/09(水) 14:40:43.48ID:jYixYFG8
>>737
AIも同じこと言ってた
741デフォルトの名無しさん
垢版 |
2025/04/09(水) 22:22:33.83ID:Ip5PiQSs
>>738-739
出題時に作成した解答例

C++
https://ideone.com/y1YZlj
R
https://ideone.com/zvqAsg

と解の個数と最小値・最大値が一致するので正解だろう。

ローカルでコンパイルしようとしたら、

 error[E0425]: cannot find function `generate_primes` in this scope

と表示されコンパイルできなかったので、実行時間の比較はできなかった。
2025/04/09(水) 22:57:11.84ID:R3DmBa+t
>>741
すみません
素数の一覧を返すだけなので素数列挙でもライブラリ利用でも何でもいいのですが
例えばエラトステネスの篩ならこんな感じの関数で

// 素数の一覧を返す [2, 3, 5, 7, 11, ... , (最大max)]
fn generate_primes(max: usize) -> Vec<usize> {
 // maxの平方根までの素数の倍数を篩にかければ全ての素数が見つかる
 let limit = max.isqrt() + 1;
 let mut is_prime = vec![true; max + 1];
 is_prime[0] = false;
 is_prime[1] = false;
 // 偽初期値
 let mut prime = 1;
 // 次の素数を探す (前回の素数以降でtrueを探すと次の素数)
 while let Some(pos) = is_prime[(prime + 1)..limit].iter().position(|bool| *bool) {
  prime += pos + 1;
  // この素数の倍数をfalseにする 【エラトステネスの篩】
  is_prime[(prime << 1)..].iter_mut().step_by(prime).for_each(|bool| *bool = false);
 }
 // 素数一覧を返す (trueになるindex値が素数)
 is_prime.iter().enumerate().filter_map(|(index, bool)| bool.then_some(index)).collect()
}
743デフォルトの名無しさん
垢版 |
2025/04/09(水) 23:40:58.68ID:Ip5PiQSs
>>738-739, 742と>>741のC++を解の標準出力なしに変更したものの実行速度を比較したら、
前者の方が2000万以下では27%、20億以下では11%速かった。
2025/04/09(水) 23:43:56.02ID:R3DmBa+t
前者はどっち?
アルゴリズムが違うのかちょっと見てみる
745デフォルトの名無しさん
垢版 |
2025/04/09(水) 23:50:45.01ID:Ip5PiQSs
>>744
前者は>>738-739, 742のRustプログラム。後者 (C++プログラム) はvectorへの要素追加回数が
多いので時間が掛かっていそう。
2025/04/09(水) 23:59:16.31ID:R3DmBa+t
たしかにC++の20億だと数秒かかりますね
何がそんなに違うのかな
2025/04/10(木) 00:43:03.90ID:1pFQYAQA
vectorのメモリは必要分を最初に確保すると速くならない?
vectorの最初のサイズの初期値は要素10個分だったはず。11個目が追加されたら20個確保して全要素コピーんsんてやってたら遅いよ
2025/04/10(木) 02:19:18.58ID:Zvxe3V8x
ベクタはC++もRustも他でもほぼ同じ仕様で埋まると倍の新たなエリアを確保してコピー
これは2^n個が埋まった時点でそれ以前の累積コピー個数は
最悪の1個スタートでも1+2+4+ ... + 2^(n-2)+2^(n-1) =2^n - 1個しかない
つまりO(1)とみなせるため問題になることは少ない
言語による詳細な差もC++とRustならほぼ無いと思われる

一方で今回の20億以内で素数和が2025になる数を求める問題
C++版がRust版より約10倍遅くなってる原因は
・pushしていくベクタがRust版は1個でC++版は2026個のベクタを利用
・pushしていく回数がRust版は解の個数と同じ49942回でC++版は134621081回
ワーキングメモリ使用量の差が効いてる
749デフォルトの名無しさん
垢版 |
2025/04/10(木) 22:03:03.91ID:Y2N8/SQw
>>747
vector p[0]〜p[S]のサイズの最大値4499個(20億以下では88876個)分のメモリを

  for (auto &v : p) v.reserve(4499);

で最初に割り付けておくと、>>743ではRustの方が2000万以下で27%、20億以下で11%速かったのが、
2000万以下では差が縮まりRustの方が14%速く、20億以下では逆転しRustの方が20%遅くなった。
サイズの最大値は実行前には分からないから、上記の改変はあくまでもvectorのサイズ拡張が実行時間に
及ぼす影響を見るためのテストで、解答として使うことはできないが。

vectorのサイズ拡張は、新しいメモリ割り付けとそこへの要素コピーに掛かる時間によってだけではなく、
要素の格納アドレスが変わることによるキャッシュ有効率の低下によっても、速度低下をもたらしそう。

>>746, 748
どっちがどれだけ速いかは実行環境に依存するとはいえ、C++が20億で数秒とかRustより約10倍遅いと
いうのはいくら何でも遅すぎておかしいと思う。解の標準出力をなしにするのを忘れていたり、Windowsで
コンパイル後の実行ファイルの実行時間をPowerShellでmeasure-command {a.exe}のように計測して
ウィルス・チェックに要した時間も含まれていたりしない?
2025/04/11(金) 07:38:20.09ID:oaeJuxMT
>>738 に手を加えて10倍速くしてみた
fn solve(n: usize, limit: usize) -> Vec<usize> {
 let mut answer = Vec::new();
 let mut pnt = generate_primes(n).windows(2).rev().map(|s| (s[1], s[0], 0, 0)).collect::<Vec<_>>();
 let (mut ci, mut cn, mut ct) = (0, n, 1_usize);
 'advance: loop {
  pnt[ci..].iter_mut().for_each(|(_p, _q, n, t)| (*n, *t) = (cn, ct));
  if cn & 1 == 0 && ct.leading_zeros() >= (cn >> 1) as u32 {
   ct <<= cn >> 1; if ct <= limit { answer.push(ct); }
  }
  'back: for (i, (p, q, n, t)) in pnt.iter_mut().enumerate().rev() {
   'again: loop {
    if *n < *p { continue 'back; }
    *n -= *p; *t *= *p;
    if *n ==1 || *t > limit { continue 'back; }
    if *n == 0 { answer.push(*t); continue 'back; }
    if *q > 3 {
     let mut tt = *t * (*n % *q);
     for _ in 0..(*n / *q) { tt *= *q; if tt > limit { continue 'again; } }
    }; break 'again;
   }; (ci, cn, ct) = (i, *n, *t); continue 'advance;
  }; break 'advance;
 }; answer.sort(); answer
}
2025/04/11(金) 22:07:48.99ID:CMM29JI3
すごいな
アルゴリズムの違いでそんなに速度差変わるものなんだな
752デフォルトの名無しさん
垢版 |
2025/04/11(金) 22:44:47.89ID:4wK2/GRg
>>750
これはとても速いな。ローカルで実行してみたら、>>738のRustプログラムと比較して
2000万以下で16倍、20億以下で55倍の速さだった。
2025/04/12(土) 09:11:24.51ID:xiQsTIG2
>>712
@Wolfram
https://ideone.com/4xyb1s
754デフォルトの名無しさん
垢版 |
2025/04/12(土) 21:18:53.69ID:RVQAocGC
>>741のC++プログラムは for (int i = S; i >= 2; i--) のループの最後のi = 2の場合を
ループの外に出して最適化 (p[S]以外のp[_]への要素追加をしないように) するだけで、
20億以下で解の出力なしのときの実行時間が元のプログラムの半分未満になるな。

https://ideone.com/RtTEO2 (1.02秒)
 ↓
https://ideone.com/1O04wl (0.44秒)
2025/04/12(土) 21:26:41.27ID:csJOBVaF
>>754
それに気づいたけど
まだ>>750と比べて20倍遅いからメモ化の方針が徒となってるのかな
756753
垢版 |
2025/04/13(日) 11:09:12.37ID:vq5HB/06
>>712
初Rust
https://ideone.com/aaj5D8
2025/04/13(日) 23:46:14.76ID:bmEZDV0H
>>756
遅い原因は長さ2000万のベクタ利用?
2025/04/13(日) 23:53:41.46ID:fz+Jdq57
配列にするとどうかね
2025/04/17(木) 00:27:46.72ID:dz0qzhSq
素因数和2025のお題の3系統のコードを読み解いてみた

>>756
2000万まで各々で素因数の和を求めて2025になるかを確認する方法。
ただし各数の素因数分解を工夫せずにすると大変なので、
各数の最小素因数(SPF)を先に一気にエラトステネスの篩で求めてる。
それを用いれば各数の素因数分解はその分解数回の割算だけで求まる。

ただしそのSPF表のために長さ2000万のベクタを用いている。
もし20億までなら32bit✕20億で8GBが許容できるとしても、
あるいはこのSPF一覧のベクタを用いなくても、
20億回の処理を劇的に減らす枝刈り方法を組み込めないと厳しい。
2000万までの計算でも一番遅い。
2025/04/17(木) 00:29:06.02ID:dz0qzhSq
>>741
2000万個すべてを素因数分解する方法とは逆に、
2025以下の素数の組み合わせを調べていく方法。
そのうち和が2025になる組み合わせの積が各解となる。

それを効率よく求めるために2025(+1)個のベクタのベクタpを用意している。
つまり和がsumとなる時の積をp[sum]に記録していく。
効率面からの仮の初期値p[0]に1を入れて、各素数iについて降順に、
ベクタp[j]にxがある時、ベクタp[i+j]にx*iをpushしていく。
ここでjの上限は 2025 - i、処理するxの上限は 2000万 / i の枝刈りができる。
最終的にベクタp[2025]の一覧が解となる。
2025個のベクタを用いることが長所および短所になっている。

この改良版>>754では、最後の素数2だけ特別扱いすることで倍速にしている。
2025/04/17(木) 00:32:14.51ID:dz0qzhSq
>>738
これも2025以下の素数を組み合わせて和が2025になる解を調べる方法。
解一覧を収めるベクタ以外は、固定の長さ305のベクタのみが使われている。
この長さの 305 とは2025以下~3以上の素数[2017, 2011, ... 5, 3]の数になってる。
各素数の冪乗の和 2017^e2017 + 2011^e2011 + ... + 5^e5 + 3^e3 及び積を計算していくが、
各指数のe2017などは解に不要なので使われておらず、
各冪乗の和自体も不要なので2025までの残りの数が使われていて、
固定長ベクタの値は(素数, 残りの数, ここまでの積)の3つ組となっている。
その素数を1つ使うと残りの数が減算されてて積が乗算されるのを繰り返していく。
素数2だけ特別扱いされており、残りの数の半分だけ左シフトすると解の積が出来上がる。

各if~continueが枝刈りとなっていて、残りの下限(=和の上限)や積の上限などがある
この改良版>>750では、次の素数以降の組み合わせで起き得る積の下限で枝刈りしている。
例えば7以下の素数で残り21ならば積の下限は7*7*7=343となるため、
ここまでの積に343を掛けた値が2000万(または20億)を超えていれば枝刈りできるようだ。

このアルゴリズムは作業メモリが固定で小さく常にL1キャッシュに乗り有利と思われる点と、
様々な枝刈りがしやすく処理する組み合わせを大きく減らしている点により、
他のアルゴリズムより桁違いに高速になっていると推測される。
2025/05/03(土) 06:56:07.77ID:Hs+w1scb
お題:0か1のランダムな要素を持つW*Hの行列と二点の座標x, yとp, qが入力される
直線(x,y)→(p, q) を行列内で要素1に当たらないように任意の位置に合同変換したい
合同変換できる座標があればその二点の座標を出力し、なければ「なし」と出力せよ
2025/05/03(土) 14:00:53.01ID:2KurydQy
2025/05/03(土) 14:59:51.97ID:LoSO6jC9
行列の1は格子点上の印なのかクロスワードの黒マスなのか
(x,y)、(p,q)は任意の点なのか格子点なのか
合同変換される直線(x,y)→(p,q)は実は線分だったりしないのか

無限の可能性を感じさせるお題だな
2025/05/03(土) 15:10:32.79ID:OINldK7L
検証用のデータを書いていないお題は失格
入力例とその時の出力例が必要
もし出力が複数個で長いならその特例の一部や個数など
766デフォルトの名無しさん
垢版 |
2025/06/21(土) 16:41:25.25ID:muNvYhtO
お題
2次元の配列があったときに
一番左上を起点として右上方向、左下方向、右上方向…
というふうに斜めに配列の要素をたどることを
ジグザグスキャンと名付けます

たとえば、3 * 3の配列の場合は次の順番で配列の要素にアクセスします

(1, 2, 6)
(3, 5, 7)
(4, 8, 9)

二次元の配列を入力としてジグザグスキャンを行ってください
結果を1次元の配列として出力してください


入力: (A, B, C), (D, E, F), (G, H, I)
出力: (A, B, D, G, E, C, F, H, I)

入力: (A, B, C), (D, E, F)
出力: (A, B, D, E, C, F)

入力: (A, B), (C, D), (E, F)
出力: (A, B, C, E, D, F)
767デフォルトの名無しさん
垢版 |
2025/06/21(土) 19:44:57.30ID:jAwJC0YX
>>766
R
https://wandbox.org/permlink/JoDE3h6F6k7gKbPs
2025/06/21(土) 23:05:10.33ID:awm9eire
>>766
Rust

fn f<T: Clone, const M: usize, const N: usize>(input: &[[T; N]; M]) -> Vec<T> {
 let mut output = Vec::<T>::new();
 for x in 0..(M + N - 1) {
  let start = if x < N { 0 } else { x + 1 - N };
  let end = if x < M { x } else { M - 1 };
  let iter = (start..=end).map(|m| input[m][x - m].clone());
  if x & 1 == 1 {
   output.extend(iter.clone());
  } else {
   output.extend(iter.rev());
  }
 }
 output
}

fn main() {
 assert_eq!(f(&[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I']]), ['A', 'B', 'D', 'G', 'E', 'C', 'F', 'H', 'I']);
 assert_eq!(f(&[['A', 'B', 'C'], ['D', 'E', 'F']]), ['A', 'B', 'D', 'E', 'C', 'F']);
 assert_eq!(f(&[['A', 'B'], ['C', 'D'], ['E', 'F']]), ['A', 'B', 'C', 'E', 'D', 'F']);
}
2025/06/29(日) 20:45:32.73ID:f7vmTtNq
お題:W*Hの行列に迷路を生成してください(アルゴリズムは任意)
2025/06/29(日) 21:58:43.69ID:HlaloW8+
>>769
解がないため不成立
inputとoutputの事例などがないため不成立
2025/07/25(金) 12:30:11.02ID:CjDQVF2B
【問題】
整数のリストが与えられたとき、そのリストを昇順に安定ソートした時の各要素のインデクス(0開始)を対応させたリストを作成せよ

【例】
入力: 1 100 10 10000 1000
出力: 0 2 1 4 3

入力: 3 1 4 1 5 9 2
出力: 3 0 4 1 5 6 2

入力: 0 1 0 1 0 1 0 1
出力: 0 4 1 5 2 6 3 7

実際に必要になって実装したけどスマートな方法があったら知りたい
2025/07/25(金) 20:46:23.28ID:dyl0C+2U
>>771
例がおかしい
わかりやすい最後の例で示すと

入力: 0 1 0 1 0 1 0 1
出力: 0 4 1 5 2 6 3 7 間違い
出力: 0 2 4 6 1 3 5 7 正解

安定ソートなので同値は順序を保ってこうなる
2025/07/25(金) 21:30:28.86ID:Z69qH9vG
>>771 C++ 特にひねりは無い
https://ideone.com/mTHn46
2025/07/26(土) 12:26:55.07ID:xCVVpUlx
>>772
出題者だけど「各要素の移動先のインデクス」って書いた方がよかったか
文言削りすぎた
775デフォルトの名無しさん
垢版 |
2025/07/26(土) 15:08:13.56ID:T78ZrTu7
>>771
SQL

select
 row_number() over(order by arrayValue, arrayIndex) - 1
from
 arrayTable
order by
 arrayIndex
776デフォルトの名無しさん
垢版 |
2025/07/26(土) 19:25:22.74ID:T78ZrTu7
>>771
Java 24
https://text.is/4Z27R
2025/07/27(日) 10:09:36.80ID:vFJ24xnO
>>771 ocaml
https://ideone.com/E7eFPC

>>771 octave
https://ideone.com/KkHu9S

>>771 ruby
https://ideone.com/pPIxcE
2025/07/27(日) 17:05:48.29ID:vFJ24xnO
>>771 c
https://ideone.com/6Wn3eD
2025/07/27(日) 17:08:58.25ID:vFJ24xnO
>>771 ruby 2.6以降?
sorti = ->a {a.map.with_index.sort.map &:last}
f = sorti << sorti
g = method(:p) << f
780デフォルトの名無しさん
垢版 |
2025/07/27(日) 20:19:17.79ID:uFbo+/2v
>>771
R
https://ideone.com/ctaQC5

統計用言語だけあってライブラリ関数rankを呼び出すだけ。ties.method = "min"を指定すれば
同値を同順位(例えば2番目の例では出力が3 0 4 0 5 6 2となる)にもできる。
2025/07/27(日) 21:43:59.43ID:w39E9j9Q
>>771
Rust
既に色々と出ているため別の観点からのコード
一時作業メモリ最小 & ソートは1回 & ジェネリック

fn f<T: std::cmp::Ord>(input: &[T]) -> Vec<usize> {
 let len = input.len();

 // ポジションのリスト [0, 1, 2, 3, ... , len-1] を作成
 let mut pos_list: Vec<usize> = (0..len).collect();
 // inputを利用してそのポジションだけをソート
 pos_list.sort_by_key(|&pos| &input[pos]);

 // 返すべきランクのリスト
 let mut rank_list: Vec<usize> = vec![0; len];
 // ポジション⇔ランクは逆写像なのでソートは不要
 (0..len).for_each(|rank| rank_list[pos_list[rank]] = rank);
 rank_list
}

fn main() {
 assert_eq!(f(&[1, 100, 10, 10000, 1000]), [0, 2, 1, 4, 3]);
 assert_eq!(f(&[3, 1, 4, 1, 5, 9, 2]), [3, 0, 4, 1, 5, 6, 2]);
 assert_eq!(f(&[0, 1, 0, 1, 0, 1, 0, 1]), [0, 4, 1, 5, 2, 6, 3, 7]);
}
782777
垢版 |
2025/07/27(日) 22:54:22.66ID:YfUjoiLt
>>771 octave ソート一回
https://ideone.com/dTRKBs

>>771 ruby 2.5 ソート一回
https://ideone.com/akDhpS
783 警備員[Lv.11]
垢版 |
2025/07/28(月) 23:30:37.16ID:uO5vEij8
>>771
>>776をKotlinに変換してKotlinらしくなるように色々省略しただけのもの。
やはり最初からラムダとか考慮されている言語だと色々省略できて分り易くなるね。
https://paiza.io/projects/0Dhknk4mUHrMqtuwzCDAxQ
2025/07/29(火) 00:12:31.56ID:9AXsNEm+
>>771
Rust
https://ideone.com/jYX2ws

バイナリヒープ使うとソート過程で直接リスト作れるけどコード量増えるしヒープソート遅いから実用性は微妙か
C言語ならありかもしれない
2025/07/30(水) 21:50:10.50ID:Ug40aZKP
>>771 java
https://ideone.com/Z8Q9Dk
786デフォルトの名無しさん
垢版 |
2025/07/31(木) 14:56:29.97ID:cLL+G38O
>> 771
java
>> 785氏のデータも加えてみた。
https://ideone.com/vzXoGd

ideoneのjavaはバージョン古いのか...
ま、通りがかりにこのスレみつけたのでちょっと書いただけ。
787デフォルトの名無しさん
垢版 |
2025/07/31(木) 18:54:11.86ID:cLL+G38O
ち、勘が鈍った。>>もつけ間違えるし、sage忘れるし。
788785
垢版 |
2025/07/31(木) 21:15:09.63ID:R3hgrYP8
>>771 java compose乱用
https://ideone.com/TBTZgj
2025/08/03(日) 22:00:37.87ID:1jv9m6G7
>>771
java >>786を修正。javaが古いねぇ。
https://ideone.com/Z3jS0P
2025/08/04(月) 22:42:57.64ID:A9zbJQ8U
>>771
java >>789を修正。何度もすいませんね。classをメソッド内に移動。
https://ideone.com/BV5FXe
2025/08/04(月) 23:09:28.79ID:A9zbJQ8U
>>771
java >>790修正。classだったらメソッドの引数がみえるので修正。recordではできない。
https://ideone.com/r6T4Zf
2025/08/05(火) 01:04:23.30ID:wgx4FmLX
class ValueWithIndex<U /*extends Comparable<U>*/> implements Comparable<ValueWithIndex<T>> {
ジェネリックは難しい。上のextends Comparable<U>は無くてもよいのだが、無駄でも明記したほうがよさそうなので、
ソースではそうした。
明記しなくとも、Uは正しく推測されているようだ。
793デフォルトの名無しさん
垢版 |
2025/08/06(水) 17:17:53.29ID:qE4NV2ND
>>771
JavaScript
https://paiza.io/projects/xtvAB2LXpLg0XOjzBHfl2w
794デフォルトの名無しさん
垢版 |
2025/08/07(木) 07:21:55.28ID:W/yAWgo4
これからはメソッドの時代
2025/08/10(日) 23:18:32.78ID:FODtZCg5
>>771 scala
https://ideone.com/iycaKk

>>771 swift
https://ideone.com/de2iOi
2025/08/11(月) 20:38:34.09ID:frWpQyFA
>>771 dart 2.3
https://ideone.com/XLI2nC
・拡張メソッドはDart2.7から
・ideone現状はDart (dart 2.3.0)
797デフォルトの名無しさん
垢版 |
2025/08/12(火) 21:05:08.06ID:uRUBTkGF
>>771
PowerShell 6以降

function rank($a)
{
  $n = $a.length
  $r = [int[]]::new($n)
  if ($n) {0..($n - 1) | sort-object -stable {$a[$_]} |% {$i = 0} {$r[$_] = $i++}}
  $r
}

function PrintArray($a)
{
  if ($a.length -le 1) {return $a}
  "[$(($a |% {PrintArray $_}) -join ", ")]"
}

$q =
  (1, 100, 10, 10000, 1000),
  (3, 1, 4, 1, 5, 9, 2),
  (0, 1, 0, 1, 0, 1, 0, 1),
  @(),
  1,
  ((1, 1), (1, 1), (1, 0, 1), (1, 0))

$q |% {
  "入力: $(PrintArray $_)"
  "出力: $(PrintArray (rank $_))"
  ""
}
798デフォルトの名無しさん
垢版 |
2025/08/12(火) 21:05:40.60ID:uRUBTkGF
-- 実行結果 --
入力: [1, 100, 10, 10000, 1000]
出力: [0, 2, 1, 4, 3]

入力: [3, 1, 4, 1, 5, 9, 2]
出力: [3, 0, 4, 1, 5, 6, 2]

入力: [0, 1, 0, 1, 0, 1, 0, 1]
出力: [0, 4, 1, 5, 2, 6, 3, 7]

入力:
出力:

入力: 1
出力: 0

入力: [[1, 1], [1, 1], [1, 0, 1], [1, 0]]
出力: [2, 3, 1, 0]
2025/08/16(土) 01:44:59.97ID:VU+jlz0U
【問題A】
1~9を1つずつ使用して表される9桁の数Anは全部で9!(=362880)個存在する。
整数n(1≦n≦362880)が与えられたとき、n番目に小さいAnを求めよ。

(例)
 1 → 123456789
 2 → 123456798
 3 → 123456879
 123456 → 416589732
 234567 → 684753219
 362880 → 987654321


【問題B】
1~4を3つずつ使用して表される12桁の数Bnは全部で12!/(3!)^4(=369600)個存在する。
整数n(1≦n≦369600)が与えられたとき、n番目に小さいBnを求めよ。

(例)
 1 → 111222333444
 2 → 111222334344
 3 → 111222334434
 123456 → 222331434114
 234567 → 324424331112
 369600 → 444333222111

※求める数値は文字列または各桁の数の配列による表現も可能とする(123⇔"123"⇔[1,2,3])
2025/08/16(土) 13:16:59.50ID:MUbLd8/3
>>799 Rust 愚直にn回まわし

use itertools::Itertools; // for tuple_windows()

fn f(init: &str, n: usize) -> String {
 let mut list = init.chars().rev().collect::<Vec<_>>();
 for _ in 1..n {
  if let Some((pre_index, (_, old))) = list.iter().tuple_windows().enumerate().find(|(_, (pre, cur))| pre > cur) {
   let old_index = pre_index + 1;
   let (new_index, _) = list.iter().enumerate().find(|(_, cur)| cur > &old).unwrap();
   list.swap(old_index, new_index);
   list[..old_index].reverse();
  }
 }
 list.into_iter().rev().collect()
}

fn main() {
 assert_eq!(f("123456789", 1), "123456789");
 assert_eq!(f("123456789", 2), "123456798");
 assert_eq!(f("123456789", 3), "123456879");
 assert_eq!(f("123456789", 123456), "416589732");
 assert_eq!(f("123456789", 234567), "684753219");
 assert_eq!(f("123456789", 362880), "987654321");
 assert_eq!(f("111222333444", 1), "111222333444");
 assert_eq!(f("111222333444", 2), "111222334344");
 assert_eq!(f("111222333444", 3), "111222334434");
 assert_eq!(f("111222333444", 123456), "222331434114");
 assert_eq!(f("111222333444", 234567), "324424331112");
 assert_eq!(f("111222333444", 369600), "444333222111");
}
801デフォルトの名無しさん
垢版 |
2025/08/16(土) 19:14:21.11ID:kN4EEg8M
>>799 の問題A
1からnまでの自然数を並べてできるi番目の順列を求める関数を前に作って持っていたので、
それを流用したらすぐできた(元の関数はBigIntとiの範囲外エラーにも対応)。

R
https://ideone.com/hMTf2k
C++
https://ideone.com/ZiU5Aa
802デフォルトの名無しさん
垢版 |
2025/08/16(土) 20:29:06.33ID:kN4EEg8M
>>799 の問題B
R
https://ideone.com/SdWBKf
C++
https://ideone.com/90BpGt
803デフォルトの名無しさん
垢版 |
2025/08/16(土) 21:32:58.04ID:kN4EEg8M
>>799
>>802 のC++のithDuplicatedPermutation関数は引数が別の値(例えばn = 5, m = 3)のとき
正しく計算できなかったので修正。Rの方はintではなくdoubleで計算しているので問題ない。

https://ideone.com/uH8dpO
2025/08/16(土) 21:46:08.81ID:VU+jlz0U
32bitだと階乗は12!が限界
2025/08/17(日) 12:07:33.92ID:R1ye1QDy
>>799 ruby
https://ideone.com/o2Qlkr

>>799 c
https://ideone.com/Q4XNBb
806805
垢版 |
2025/08/17(日) 15:08:29.44ID:R1ye1QDy
>>799 ruby 若干の改善
https://ideone.com/oavxRo

>>799 c 若干の改善
https://ideone.com/34A07H
2025/08/17(日) 15:21:28.95ID:OrBxx4uG
ソートが消えて>>800と同じアルゴリズムになったね
808デフォルトの名無しさん
垢版 |
2025/08/17(日) 20:40:30.84ID:bUKuWE64
>>804
確かにそうだった。15!も14!もintの範囲内に収まらない。>>803でn = 5に変えた場合に正しい
出力になるのはたまたまだった。

>>802をBigInt化するだけで問題なかった。
R
https://ideone.com/OgBxTJ
C++
https://ideone.com/KLqe3g
809デフォルトの名無しさん
垢版 |
2025/08/19(火) 21:08:19.27ID:zFi0pntB
>>799 問題A
perl

use v5.42;

sub nthPermutation($digits, $rank) {
  my @figures = (1..$digits);
  my @fact = (1);
  push @fact, $_ * $fact[-1] for @figures;
  return join "", map { splice(@figures, $_, 1) } sub($n, $r) {
    $n-- ? (int($r / $fact[$n]), __SUB__->($n, $r % $fact[$n])) : ();
   }->($digits, $rank - 1);
}

for my $i (1, 2, 3, 123456, 234567, 362880) {
  say "$i -> " . nthPermutation(9, $i);
}

1 -> 123456789
2 -> 123456798
3 -> 123456879
123456 -> 416589732
234567 -> 684753219
362880 -> 987654321
2025/08/19(火) 21:28:38.04ID:ahVErwF8
>>771 scheme (chicken 4.13)
https://ideone.com/RREeGy
811806
垢版 |
2025/08/21(木) 22:19:54.42ID:fAlkh9Aq
>>799 ruby
https://ideone.com/3TW9Vr
・問題A時に若干端折る
812デフォルトの名無しさん
垢版 |
2025/08/21(木) 23:15:48.39ID:0KQ1xtxb
>>799 の逆変換プログラム
R
https://ideone.com/TU73Yu
C++
https://ideone.com/dmETd5

問題A, 問題Bとは違って、順列に出現するユニークな整数は1〜nの連番でなくても良いし、
出現回数はすべて同じでなくても良い。例えば、入力は [3, 1, 4, 1, 5, 9] でも良い
(ユニークな整数は1, 3, 4, 5, 9で、出現回数は1が2回、その他が1回)。
813デフォルトの名無しさん
垢版 |
2025/08/22(金) 01:14:43.39ID:6LYRfbyj
>>799
Java
https://paiza.io/projects/F5kCIBu6BOVB9QTX7hHWMg
2025/08/22(金) 06:55:21.34ID:qlaiAqZd
>>812
Rust >>799の逆変換の重複順列の何番目か算出

use itertools::Itertools;
use num::{BigUint, One};

// 重複順列の何番目かを求める ex. "222331434114" → "123456"番目
fn to_nth(input: &str) -> String {
// 出現数
let (mut counts, chars): (Vec<usize>, Vec<char>) = input.chars().sorted().dedup_with_count().multiunzip();
// index化input
let input: Vec<usize> = input.chars().map(|c| chars.iter().position(|&c0| c0 == c).unwrap()).collect();
// 階乗関数
fn factorial(x: usize) -> BigUint { (1..=x).fold(BigUint::one(), |p, x| p * x) }
// 重複順列の総数
let mut whole: BigUint = factorial(input.len()) / counts.iter().map(|&x| factorial(x)).product::<BigUint>();
// nth番目を算出
(1..=input.len()).rev().zip(input).fold(BigUint::one(), |mut nth, (len, index)| {
// 自分より前までの総数をnthに足す
nth += &whole * counts[..index].iter().sum::<usize>() / len;
// 自分の総数へ更新
whole *= counts[index];
whole /= len;
counts[index] -= 1;
nth
})
.to_string()
}
2025/08/22(金) 06:56:46.07ID:qlaiAqZd
>>814の検証分

fn main() {
assert_eq!(to_nth("123456789"), "1");
assert_eq!(to_nth("123456798"), "2");
assert_eq!(to_nth("123456879"), "3");
assert_eq!(to_nth("416589732"), "123456");
assert_eq!(to_nth("684753219"), "234567");
assert_eq!(to_nth("987654321"), "362880");

assert_eq!(to_nth("111222333444"), "1");
assert_eq!(to_nth("111222334344"), "2");
assert_eq!(to_nth("111222334434"), "3");
assert_eq!(to_nth("222331434114"), "123456");
assert_eq!(to_nth("324424331112"), "234567");
assert_eq!(to_nth("444333222111"), "369600");

assert_eq!(to_nth("111333442545225"), "123456");
assert_eq!(to_nth("555444333222111"), "168168000");

assert_eq!(to_nth("11111222223333344444555556666677777899⑩⑩889889⑩⑩⑩9"), "123456");
assert_eq!(to_nth("⑩⑩⑩⑩⑩999998888877777666665555544444333332222211111"), "49120458506088132224064306071170476903628800");

assert_eq!(to_nth("314159"), "127");
assert_eq!(to_nth("3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067"), "11503448027594046007734790817193859678406683579515952737315863863451534425766911708030454269");
assert_eq!(to_nth("なまむぎなまごめなまたまご"), "10515454");
assert_eq!(to_nth("かえるぴょこぴょこみぴょこぴょこあわせてぴょこぴょこむぴょこぴょこ"), "8273693808428448039784");
}
816811
垢版 |
2025/08/22(金) 20:26:43.82ID:m9vhyo0Z
>>799 ruby
https://ideone.com/vvp0kq
・問題A時に全体的な規則性に着目
・部分的に着目しちゃったのが>>811
・何も工夫を入れなかったのが>>806
817816
垢版 |
2025/08/23(土) 20:27:40.18ID:uyhDG+iz
>>799 ruby 問題Bもケア
https://ideone.com/od17Hn
2025/08/23(土) 21:01:55.02ID:gxRFdG35
>>799
java
https://ideone.com/qRTy1Z
819817
垢版 |
2025/08/23(土) 23:26:24.12ID:uyhDG+iz
>>799 java
https://ideone.com/78psr6
820デフォルトの名無しさん
垢版 |
2025/08/24(日) 21:13:57.80ID:ubCw2JoQ
>>812の逆変換プログラムは>>808の順変換プログラムを流用したから処理に無駄があった。
逆変換用に一から書き直したらすっきりした。

R
https://ideone.com/jYUHe1
C++
https://ideone.com/Lne3AQ
821819
垢版 |
2025/08/25(月) 00:28:39.45ID:IbSJkZLt
>>799 java Iterable<int[]>
https://ideone.com/NRTZpa
2025/08/27(水) 00:40:48.46ID:AbNZa8yo
>>799 ocaml
https://ideone.com/1Jx1Q8

>>799 scheme (chicken 4.13)
https://ideone.com/n7pIFw
2025/08/27(水) 21:02:12.94ID:AbNZa8yo
>>799 octave
https://ideone.com/RH6xXb
824デフォルトの名無しさん
垢版 |
2025/08/27(水) 21:46:51.59ID:B7vE54ji
>>820の逆変換プログラムのC#版
https://ideone.com/8HpCN9

LINQのTakeWhileメソッドとSumメソッドを組み合わせたらすっきり書けた。
825821
垢版 |
2025/08/28(木) 21:01:46.43ID:mnaa+hsk
>>799 java
https://ideone.com/aKkfqN
・next()ごとに複製しない版。する版は >>821
・hasNext()側で次を準備。next()側なのは >>821
826デフォルトの名無しさん
垢版 |
2025/08/29(金) 13:52:26.21ID:xrZF+zBK
>>799
https://ideone.com/JLM8r8
C++
2025/08/29(金) 20:09:32.40ID:VEuLqGzD
>>812 ruby 2.5.5
https://ideone.com/tzzN04
・tallyあるのは2.7以降

>>812 octave
https://ideone.com/ebJd9k
828デフォルトの名無しさん
垢版 |
2025/08/29(金) 22:34:59.67ID:uVFRnDIW
>>802をCMD (Windowsバッチファイル) に移植

@echo off & setlocal EnableDelayedExpansion
echo 【問題A】
for %%i in (1, 2, 3, 123456, 234567, 362880) do call :ithDuplicatedPermutation 9 1 %%i
echo.
echo 【問題B】
for %%i in (1, 2, 3, 123456, 234567, 369600) do call :ithDuplicatedPermutation 4 3 %%i
exit /b

:ithDuplicatedPermutation
set /a n = %1, m = %2, i = %3, L = 0, P = 1
for /l %%j in (1, 1, %n%) do (
  set /a c%%j = %m%
  for /l %%k in (1, 1, %m%) do set /a L += 1, P = P * L / %%k
)
set a=%i% →
for /l %%j in (1, 1, %L%) do (
  set /a done = 0
  for /l %%k in (1, 1, %n%) do (
    if !done! equ 0 (
      set /a "q = P * c%%k / (L - %%j + 1)"
      if !i! leq !q! (
        set a=!a!%%k
        set /a c%%k -= 1, P = q, done = 1
      ) else (
        set /a i -= q
      )
    )
  )
)
echo %a%
829デフォルトの名無しさん
垢版 |
2025/08/29(金) 22:35:22.12ID:uVFRnDIW
-- 実行結果 --

【問題A】
1 → 123456789
2 → 123456798
3 → 123456879
123456 → 416589732
234567 → 684753219
362880 → 987654321

【問題B】
1 → 111222333444
2 → 111222334344
3 → 111222334434
123456 → 222331434114
234567 → 324424331112
369600 → 444333222111
2025/08/30(土) 17:37:04.21ID:zI+bKiSo
>>812 ocaml
https://ideone.com/SfsytC

>>812 scheme (chicken 4.13)
https://ideone.com/jwWrRt
831830
垢版 |
2025/09/02(火) 21:36:10.92ID:MM5Gazf9
>>812 scheme (chicken 4.13)
https://ideone.com/fZufck
・集計部分をalistに変えてみただけ
2025/09/06(土) 23:05:19.87ID:Z/aFZPi6
>>561 scheme (chicken 4.13)
https://ideone.com/lCgs9s
833832
垢版 |
2025/09/07(日) 12:29:41.48ID:O1zDlKW9
>>561 scheme (chicken 4.13)
https://ideone.com/8VZv71
・m1m2を不必要にリストにしてたのを廃止
834833
垢版 |
2025/09/07(日) 14:22:59.56ID:O1zDlKW9
>>561 scheme (chicken 4.13)
https://ideone.com/EsJWtG
・letを自然な位置に移動
2025/09/08(月) 23:02:49.14ID:4SI/cFAg
>>485 scheme (chicken 4.13)
https://ideone.com/feYtNB

>>500 scheme (chicken 4.13)
https://ideone.com/Svhv1y
836835
垢版 |
2025/09/08(月) 23:33:25.73ID:4SI/cFAg
>>485 scheme (chicken 4.13)
https://ideone.com/ejvKat
・(product . lists)
・(product xs . rest) が >>835
2025/09/09(火) 21:56:29.91ID:PCxKX9bv
>>438 scheme (chicken 4.13)
https://ideone.com/6weUjU
・まずまとまりに分割して処理

>>438 scheme (chicken 4.13)
https://ideone.com/BCt6fd
・最初のを四つにして、残りはスキップ
838デフォルトの名無しさん
垢版 |
2025/09/10(水) 21:21:57.38ID:rb/tQvOM
>>438
C#で短く書けた
https://ideone.com/SwAZsS

x.EndsWith(" ") でなく x.LastOrDefault() == ' ' の方が長くはなるが効率的かも知れない。
839836
垢版 |
2025/09/10(水) 22:49:33.81ID:NV1RL9MH
>>485 scheme (chicken 4.13)
https://ideone.com/g8wtFG
・デカルト積の解釈を(勝手に)変更
840839
垢版 |
2025/09/10(水) 23:35:38.95ID:6JfM8ZLf
>>485 scheme (chicken 4.13)
https://ideone.com/A6K3XL
・(cons y x)して最後にreverseする
・(list x y)して最後にflattenするのが >>839
841840
垢版 |
2025/09/11(木) 23:05:23.09ID:WPUXbxYH
>>485 scheme (chicken 4.13)
https://ideone.com/YqrvdM
・reverse回数減らした版
2025/09/12(金) 15:41:31.15ID:IRXhEt4s
お題
1行1単語のリストが、しりとりとして成立しているか判定するコードを書きなさい
成立していたら◯、不成立なら☓をしゅつりょくすること

【入力】
りんご
ごりら
らっぱ
2025/09/12(金) 16:19:33.85ID:uazXAFOm
入力例に対する出力例が存在しなくて曖昧
それを補わないと問題が不成立
2025/09/12(金) 20:36:05.46ID:I2wrB793
>>438 scheme (chicken 4.13)
https://ideone.com/SlkO0l
・空白時にdrop-while

>>842 ruby
https://ideone.com/mY83rW
2025/09/13(土) 12:21:51.23ID:nVmVuqdT
退屈そうだからちょっと難易度高め

【問題】
各桁の数が1~5のいずれかで全ての桁の合計がMとなる正整数の集合をG[M]で表す。
例えば123、111111はG[6]の要素、255、222222はG[12]の要素となる。
整数M(1≦M≦32)、N(1≦N)が与えられたとき、N番目に小さいG[M]の要素を求めよ。
ただしNがG[M]の要素数より大きい場合の出力は0とする。
求める数値は文字列または各桁の数の配列による表現も可能とする(123⇔"123"⇔[1,2,3])。

【例】 #入力は(M,N)
(2,1) → 2
(2,2) → 11
(2,3) → 0
(20,1) → 5555
(20,2) → 14555
(20,3) → 15455
(20,400096) → 11111111111111111111
(20,400097) → 0
(32,1) → 2555555
(32,2) → 3455555
(32,3) → 3545555
(32,1000) → 34355354
(32,1000000) → 11532334334
(32,1000000000) → 2141111311212411131
(32,1333610936) → 11111111111111111111111111111111
(32,1333610937) → 0

【ヒント(?)】
G[M]の要素数の数列は下記pentanacci数列a[n]から先頭の[0,0,0,0,1]を除いたものとなる(|G[M]| = a[M + 4])。
・a[0,1,2,3,4] = [0,0,0,0,1]
・a[k] = a[k-1] + a[k-2] + a[k-3] + a[k-4] + a[k-5]  (k≧5)
※a[37]までのリスト: https://oeis.org/A001591/list
846デフォルトの名無しさん
垢版 |
2025/09/13(土) 21:09:19.41ID:rhMflYHg
>>845
R
https://ideone.com/R7chTY

ヒントはどう使うのかわからなかった。
847デフォルトの名無しさん
垢版 |
2025/09/14(日) 02:07:05.25ID:K9dbpWus
>>845 c++
https://ideone.com/ezHz45
先越された
2025/09/14(日) 02:17:37.66ID:ymjVQadn
>>845 ruby
https://ideone.com/wrV2zh
・なんとなく動いてる版
・チマチマと次を探して行く
・G[20]まで出すのがやっと(4.05s)
849デフォルトの名無しさん
垢版 |
2025/09/14(日) 21:00:58.83ID:Yva1i9w5
>>845
R
https://ideone.com/XhdJw4

>>846より行列計算が速くなった。変数名mとnが逆だったのを直した。

C++に移植
https://ideone.com/9dibE0
850デフォルトの名無しさん
垢版 |
2025/09/14(日) 22:50:48.82ID:Yva1i9w5
>>845
Fortranに移植
https://ideone.com/CnJ0S9

行列計算を短く書けて、しかも実行が速い。
851848
垢版 |
2025/09/15(月) 00:34:43.20ID:aTaxsjKO
>>845 ruby
https://ideone.com/3I72I6
・キャッシュ探りながら構築
・c[桁の合計][幅] = とりうるパターン
852851
垢版 |
2025/09/15(月) 00:58:49.72ID:aTaxsjKO
https://ideone.com/GWbQAx
・動きは >>851 といっしょ
・若干の整理
853デフォルトの名無しさん
垢版 |
2025/09/15(月) 22:27:44.05ID:g8zilsSB
>>850では行末に無駄な半角空白文字が出力される。消すには最後から3行目のnthPartition(m, n)を
trim( )で囲めば良い。
854852
垢版 |
2025/09/16(火) 01:02:30.84ID:3CKXdG+H
>>845 ruby
https://ideone.com/n5Jqm3
・動きは >>851 といっしょ
・数値の内部表現を配列から整数へ変更
855854
垢版 |
2025/09/17(水) 22:30:29.22ID:U8XLHdaR
>>845 ruby 2.5.5
https://ideone.com/oAQimi
・とりうるパターン数に着目し迫る
・tallyは2.7以降
856デフォルトの名無しさん
垢版 |
2025/09/17(水) 22:43:48.03ID:RlLGu0ST
>>845
C++
https://ideone.com/I6K1tl

行列Aの計算で加減算・代入回数を>>849より減らした。実行時間の違いは分からなかった。
857デフォルトの名無しさん
垢版 |
2025/09/17(水) 23:39:47.32ID:RlLGu0ST
>>856
BigInt化してm = 2000, n = 2¹⁰²⁴で実行したら違いが明確になった。

(1) >>849のBigInt版
https://ideone.com/S92L9G
(2) >>856のBigInt版
https://ideone.com/3x03xT

加減算・代入回数を削減した(2)の方が確かに速く、(1)の約4分の3の実行時間。
858855
垢版 |
2025/09/18(木) 21:13:33.56ID:mk4sIpUK
>>845 ruby 2.5.5
https://ideone.com/Zm2433
・揃ってからcumsum、のリズムを廃止
859858
垢版 |
2025/09/19(金) 21:59:08.62ID:e72KvXSi
>>845 ruby 2.5.5
https://ideone.com/iwQNCH
・若干の整理(loop廃止、fill三回へ置き換え)
860859
垢版 |
2025/09/20(土) 21:39:31.29ID:zrmIrXrK
>>845 ruby 2.5.5
https://ideone.com/jHqv2L
・内部表現の変更
 112225→[2,3,0,0,1]
861860
垢版 |
2025/09/22(月) 21:37:36.11ID:9W7EeSnZ
>>845 ruby 2.5.5
https://ideone.com/MDHX6v
・内部表現のさらなる変更
・パターン数を直接キャッシュするようにした
 cc[合計][幅] = とりうるパターン数

>>845 ruby
https://ideone.com/PB8S7w
・m = 2000, n = 1 << 1024
862861
垢版 |
2025/09/23(火) 01:13:48.01ID:XS9iE/WB
>>845 c++
https://ideone.com/oma0Jf
・ruby版861の移植
・m = 2000, n = 1 << 1024
863862
垢版 |
2025/09/26(金) 21:58:13.14ID:rAOVnJgT
>>845 ruby
https://ideone.com/YEGl7C
・実りの無い再帰を省略
・結果を配列で集めず整数で集める

>>845 c++
https://ideone.com/f62fkG
・rubyの移植版

>>845 ocaml
https://ideone.com/cHYmdv
・rubyの移植版
・任意精度整数は昔ながらのnumのBig_int使用
・ZarithのZは確かに速かったけどideoneでは使えずボツ
864デフォルトの名無しさん
垢版 |
2025/10/19(日) 18:23:02.12ID:UPYRyJKx
お題
硬貨の種類と金額が与えられます。
硬化の合計がちょうど金額と同じになるように硬貨を選ぶとき、使用枚数の最小値を求めてください。
支払いが不可能なときは-1を出力します。
各硬貨は無制限に使用できます。
額面の大きい硬貨を優先して選ぶ貪欲法が常に最適解を与えるとは限らないことに注意。

入力
硬貨:[1,7,10]
金額:14

出力
使用枚数:2
865デフォルトの名無しさん
垢版 |
2025/10/19(日) 21:36:07.90ID:1trCfbwI
>>864
R
https://ideone.com/bUDu3l
866デフォルトの名無しさん
垢版 |
2025/10/22(水) 21:34:32.83ID:vm0Iby1T
>>864
金額が大きい場合でも高速に求められるようにした。

R
https://ideone.com/NC6lV7
C++
https://ideone.com/52TbeF
867デフォルトの名無しさん
垢版 |
2025/10/26(日) 09:31:44.23ID:Y3+SSpql
お題というか、協力してほしい感じなんですが、素因数分解関数をHaskellで書いて色んな数を素因数分解して遊んでいたら確認したい事実に出くわしたので。

31 <- 素数
331 <- 素数
3331 <- 素数
33331 <- 素数
333331 <- 素数

と、3が5個並んで末尾が1の数字までは素数という事が分かりましたが、いかんせん、ノートだと力不足。
それにCとかで書き直したらもっと先まで行けるかも?という事で、この先、どこまで33...31が素数なのかを調べて欲しいのです。
協力お願いします<(_ _)>

一応、Haskellではこんなコードです。

factorization n = f primes n
 where primes = 2:(sieve [3,5..])
      where sieve (p:xs) = p:(sieve [x | x <- xs, x `mod` p /= 0])

     f (p:ps) n | n <= p = [n]
     f (p:ps) n | n `mod` p == 0 = p:f (p:ps) (n `div` p)
     f (p:ps) n = f ps n
868デフォルトの名無しさん
垢版 |
2025/10/26(日) 09:50:23.90ID:Y3+SSpql
あ、ただの素数判定でも良いです。
ちなみに、66..61の場合は6661までは素数ですが66661は素数じゃなくなりました。
なので、33..31もどこかで素数じゃなくなるのか?それともずっと素数になりそうなのか?って疑問が持ち上がりました。
2025/10/26(日) 10:13:01.91ID:XLS0tlS8
>>867
興を削いですまんが、「33...331は素数か」でググったら、AIが(あまり大きくない桁数で)答えを示してくれた…
2025/10/26(日) 10:19:15.38ID:0X7G2IAI
near-repdigit素数とかで研究されてるらしい

結果だけ知りたいなら↓がまとめてる
https://stdkmd.net/nrr/3/33331.htm
871869
垢版 |
2025/10/26(日) 10:21:11.68ID:XLS0tlS8
>>869
ちなみに、以下の思考経路だったのでプログラミング的な思考がゼロだった訳では無い。
1.多倍長整数で組むべきかな?
2.でも64bit整数の範囲で合成数だったら馬鹿馬鹿しいな
3.組む前にカンニングしちゃえ
4.>>869
872デフォルトの名無しさん
垢版 |
2025/10/26(日) 17:08:32.87ID:Y3+SSpql
>>869-871
いえいえ、ああ、やっぱりずっと素数という訳にはいかないんですね…。
何か素数の秘密に触れるヒントか?と心躍ったけど、そんな訳なかったですね(´・ω・`)

あやうく数学スレで鼻息荒く書き込むところでした。

ありがとうございました<(_ _)>
2025/10/26(日) 17:55:12.41ID:N6SeZsiy
29bitで収まる範囲内
333333331 = 17 × 19607843
これを求められなかったHaskellはすごく遅い?
874デフォルトの名無しさん
垢版 |
2025/10/26(日) 23:06:07.50ID:Y3+SSpql
>>873
速いアルゴリズムに変えたら何とか1分ほどでその数字まで届きました。
(そもそも、>867 のは美しいとか短いとかの枕詞が付くコードですし。33...31に気付かなかったら4桁ぐらいが実用的ならおkだったので)

改良版Haskell
pfactorization = f primes
 where primes =2:3:5#primes
     where n#x@(m:q:y)=[n|gcd m n<2]++(n+2)#last(x:[m*q:y|q^2-3<n])

というか、それより1桁少ない方が少し時間かかりますね。
19607843 < 33333331 なので、素数比較回数が多いのかと。
875デフォルトの名無しさん
垢版 |
2025/10/26(日) 23:07:37.04ID:Y3+SSpql
あ、f の方を忘れた。
f のコードは変更なしです。
876デフォルトの名無しさん
垢版 |
2025/11/07(金) 05:48:17.42ID:ckPLmv2U
>>868
cだとこんな感じでいいのかな?
3333333333333331くらいまで一瞬でできる

#include <stdio.h>

int main(void) {
long long d, n;

printf("Enter a number: ");
scanf("%lld", &n);

for (d = 2; d * d <= n; d++) {
if (n % d == 0)
break;
}
if (d * d <= n)
printf("%lld is divisible by %lld\n", n, d);
else
printf("%lld is prime.\n", n);

return 0;
}
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況