プログラミングのお題スレ Part20
レス数が1000を超えています。これ以上書き込みはできません。
部分解答可
1. クリップボードの内容を取得
2. 現在の日時を次のように出力する 2021/06/19/第3土曜日/10:19/
前スレ参照
#!/bin/sh
for num in "896" "967" "968" "972" "975" "977-982" "994" "996"
do
firefox $( echo '/5422666061/hcet/igc.daer/tset/ten.hc5.suivem//:sptth' | rev )$num
sleep 30
done
3. 現在の日時、キーワード、クリップボードの内容を1行にして指定のファイルに追記。キーワードはプログラム実行時にキーボード入力する。
4. 今日が第3土曜日なら指定の画像ファイルを表示 解答例
#!/bin/sh
# 1
clipb=$(xclip -o)
# 2
day=$(date "+%e")
num=$(( ($day + 6) / 7 ))
today=$( date "+%Y/%m/%d/"第$num"$(date +%a)"曜日"/%H:%M/" )
# 3 キーボード入力した文字列を変数ahaに入れる
read -p "キーワードを入力してください:" aha
# trコマンドを使ってクリップボードにコピペした文章から改行文字\nを削除
copipe=$( echo "$today *$aha $clipb" | tr --delete '\n' )
# >>は追記、>は上書きしてしまうので注意
echo "$copipe" >> "$HOME/Documents/memo.txt"
# backディレクトリの中にmemoディレクトリを作成
# --parentsは指定の親ディレクトリbakが存在しない場合に作成してくれるオプション引数、mkdir -pでもOK
mkdir --parents "$HOME/Documents/bak/memo/"
cp --backup "$HOME/Documents/memo.txt" "$HOME/Documents/bak/memo/"
xdg-open "$HOME/Documents/memo.txt"
# 4 xdg-openは既定のアプリを起動するコマンド
if [ $( echo $today | grep "第3土曜日" ) ] ; then
xdg-open "$HOME/Pictures/image.jpg"
sleep 10 ; exit
fi 0 と "n + 1" を任意に定義して自然数を作り、
足し算と掛け算を実装せよ
なお "n + 1" は次を満たすこと
・ n + 1 == m + 1 ⇒ n == m
・ n が自然数 ⇒ n + 1 は自然数
・ n が自然数 ⇒ n + 1 != 0 お題
リストを受け取って、重複のないリストに分割してください
入力:[b,d,e,c,b,a,a,d,d,a]
出力:[a,b,c,d,e],[a,b,d],[a,d] 「すいませーん パンください」
「なんだとー!パンクはダサくねえ!」 >>9
Ruby
s = "b,d,e,c,b,a,a,d,d,a".split(",")
t = s.group_by{_1}.values.map{(_1 + [nil] * s.size).take(s.size)}.transpose.map{_1.compact}.reject{_1 == []}
p t
[["b", "d", "e", "c", "a"], ["b", "d", "a"], ["d", "a"]] >>9 Ruby
s = '[b,d,e,c,b,a,a,d,d,a]'
a = s.gsub(/[\[\]]/,'').split(',').sort
ans = []
while (u = a.uniq).empty?.!
ans << u
u.each{|x| a.delete_at( a.index(x) ) }
end
puts "[" + ans.map{|x| x * ','} * '],[' + "]" #=> [a,b,c,d,e],[a,b,d],[a,d] >>9
haskell
iimport Data.List
splitSet = transpose . group . sort
main = print $ splitSet $ "bdecbaadda"
----
["abcde","abd","ad"] >>9
python
li = ["b","d","e","c","b","a","a","d","d","a"]
t = 0
while len(li) != 0:
__s = list(set(li))
__print(s)
__for x in s: li.remove(x)
前から順番に重複がないように分割した
li = ["b","d","e","c","b","a","a","d","d","a"]
t = 0
for i in range(len(li)):
__if t>i: continue
__ for j, x in enumerate(li[i:]):
____if j==0: continue
____if x in li[i:i+j]:
______print(x,li[i:i+j])
______t = i+j
______break
else: print(li[t:]) 何分割するか指定がないんだからこれで十分だよね
s = "b,d,e,c,b,a,a,d,d,a".split(",")
puts s.map{|e| "[#{e}]" }.join(",")
出力: [b],[d],[e],[c],[b],[a],[a],[d],[d],[a] 指定は無いがそうすると自明になりつまんなくなる、
つまり問題としてwell-definedじゃなくなるから、Ruby使ってる人は空気と行間を読む訓練をした方がいい お題
正整数2つを入力として、それらの商を互いに異なる正整数の逆数の和で表せ
ただし、分母となる正整数の最大のものが極力小さくなるようにせよ
例
入力 37, 60
出力 37/60 = 1/4 + 1/5 + 1/6
入力 3,1
出力 3/1 = 1/1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 + 1/8 + 1/9 + 1/10 + 1/15 + 1/18 + 1/20 + 1/24 お題
月最後の金曜日をプレミアムフライデーといいますが
指定した年のプレミアムフライデー一覧を出力してください
入力: 2021
出力:
2021-01-29
2021-02-26
2021-03-26
2021-04-30
2021-05-28
2021-06-25
2021-07-30
2021-08-27
2021-09-24
2021-10-29
2021-11-26
2021-12-31 「極力小さく」だから
プログラマの能力でできる限り、
じゃないの? >>21 Ruby
require 'date'
y = 2021
12.times{|m|
d = Date.new( y, m+1 ).next_month().prev_day()
puts d.prev_day( (d.wday-5) % 7 ).strftime( '%F' )
} >>21 Ruby
y = 2021
w = Time.new( y ).wday
tbl = ( (y & 3) == 0 && (y % 100) != 0 || (y % 400) == 0 )?
[ [25,23,25,24,25,24,25,25,24,25,24,25], [2,1,5,3,0,5,2,6,4,1,6,3] ] :
[ [25,22,25,24,25,24,25,25,24,25,24,25], [2,2,6,4,1,6,3,0,5,2,0,4] ]
12.times{|m|
puts "%04d-%02d-%02d" % [ y, m+1, tbl[0][m] + ((tbl[1][m]-w) % 7) ]
} >>21
Kotlin
https://paiza.io/projects/mOAfjYjLJx67zhwlGiIuJw
次の月の1日の曜日を求めてそこから何日引くかを計算して引いているだけ。
java.time.LocalDate クラス使っているので Java でも似たようなプログラムは作れると思う。 >>5-6
# (コマンド),"文字列",(コマンド2) | パイプラインで渡されたコマンド実行結果や文字列を連結して1行の文字列にするJoin-String |
# 連結して1行にした文字列で変数初期化(Tee-Object -Variable 変数) | memo.txtに追記(Tee-Object -Append)
(Get-Date).ToString("yyyy/MM/dd/第"),
[Math]::Floor( ( (Get-Date).Day + 6 ) / 7 ).ToString(),
(Get-Date).ToString("dddd/HH:mm/"),
" #tag#", ( Read-Host "キーワードを入力" ), " ",
( Get-Clipboard ) | Join-String | Tee-Object -Variable kopipe |
Tee-Object -FilePath "$HOME/Documents/memo.txt" -Append
# memo.txtをバックアップ
Copy-Item -Path "$HOME/Documents/memo.txt" -Destination "$HOME/Documents/bak/memo_bak.txt"
# $kopipe = 2021/06/25/第4金曜日/ ###タグ
# 今日が"第4金曜日"なら何かをする
if ( $( Write-Output $kopipe | Select-String -Pattern "第4金曜日" ) ) {
Write-Host "PowerShell"
} else {
Write-Host "Shell Script"
}
# Visual Studio Codeでファイルを開く
code "$HOME/Documents/memo.txt" using InteractiveUtils, Dates
# 1 clipboardの文字列に含まれる改行文字を半角スペースに変換
clipb = replace( clipboard(), "\n" => " " )
# 2 曜日名や月名を日本語で取得するための設定
# docs.julialang.org/en/v1/stdlib/Dates/#Query-Functions
japanese_months = [""] ; japanese_monts_abbrev = [""]
japanese_days = ["月曜日","火曜日","水曜日","木曜日","金曜日","土曜日","日曜日"]
Dates.LOCALES["nihongo"] = Dates.DateLocale(japanese_months, japanese_monts_abbrev, japanese_days, [""])
# 実行結果例:2021/06/25/第
year_month_day = Dates.format( now(), "yyyy/mm/dd/第" )
# floor( 3.9 )の実行結果は3.0でfloor( Int, 3.9 )の実行結果は3
第num = floor( Int, ( Dates.day( now() ) + 6 ) / 7 )
# 実行結果例:金/04:21/ 、locale="上で設定した名前"は曜日名を英語以外の言語で取得するためのオプション
youbi_time = Dates.format( now(), "E/HH:MM/" ; locale="nihongo" )
# 3.grepで一覧表示するときに使うハッシュタグを入力。grep ###5ch, grep ###日記, grep ###英語, grep ###エラー, grep /第2金曜日/")
print("タグを入力:") ; hashtag = readline()
from_year_to_hashtag = year_month_day * string(第num) * youbi_time * " ###" * hashtag
# Juliaで文字列連結は+ではなく*
# docs.julialang.org/en/v1/manual/faq/#Why-does-Julia-use-*-for-string-concatenation?-Why-not-or-something-else?
copipe = from_year_to_hashtag * " " * clipb * "\n"
# docs.julialang.org/en/v1/base/file/#Base.Filesystem.homedir
# docs.julialang.org/en/v1/base/io-network/#Base.open
# "a"はwrite(書き込み), create(作成), append(追記)
io = open( homedir() * "/Documents/memo.txt", "a" )
write( io, copipe )
close(io) # 4. 今日が第4金曜日なら指定の画像ファイルを表示。ゴミの日とかを登録しておくと便利。
# docs.julialang.org/en/v1/manual/control-flow/
if contains( from_year_to_hashtag, "第4金曜日" )
imagefile = homedir() * "/Pictures/image.jpg"
# docs.julialang.org/en/v1/manual/running-external-programs/
# xdg-openの部分はmspaintとかでもOK
run(`xdg-open $imagefile`)
else
println("5ch on")
end
# docs.julialang.org/en/v1/stdlib/REPL/#The-Julia-REPL
# 関数の説明と使用例は次のようにすれば見れるよ。
# julia>using Dates
# julia>? <- Enterキーは押さなくて良い
# help?>dまで入力した後にTabキーを2回押す
# help?>からjulia>に戻すにはBackSpaceキーを押す
# その他の使い方
# julia>usingの後に半角スペースを入力した後にTabキーを2回押してモジュール一覧表示
# julia>aを入力後にTabキーを2回押す
# julia>absの後に半角スペースを入力した後にTabキーを2回押して関数を一覧表示 IJulia
github.com/JuliaLang/IJulia.jl
julia> ]
(@v1.6) pkg>add IJulia
BackSpaceキーを押す
replからjupyter Labを起動
julia> using IJulia ; jupyterlab(dir="/home/xxxx/Documents/jupyterlab")
Ctrl-D
ターミナルから起動
$ jupyter lab --notebook-dir="$HOME/Documents/jupyterlab" --browser="/usr/bin/google-chrome"
Visual Studio Code拡張機能Code Runner
ファイル>ユーザー設定>設定を開き、画面右上にある三角アイコン右横の「設定(JSON)を開く」をクリック
例
"code-runner.executorMap": {
// Julia実行ファイルのフルパス
"julia": "$HOME/julia-1.6.1/bin/julia",
},
//コード実行結果をターミナルに表示する
"code-runner.runInTerminal": true, ともかく最小とか入れてしまうと途端に難しくなる
できればいいんだよ >>21
haskell
import Data.Time.Calendar
premiumFridays y = let
baseDay = ( fromGregorian 2021 6 13 )
lastFriday y m = let
d = gregorianMonthLength y m
difflst = flip diffDays baseDay
$ fromGregorian y m d
lastDay = fromGregorian y m d
in addDays ( - ( mod ( difflst + 2 ) 7 ) ) lastDay
in [ lastFriday y m | m<- [ 1.. 12 ] ]
main = mapM_ print $ premiumFridays 2021
---
2021-01-29
2021-02-26
2021-03-26
2021-04-30
2021-05-28
2021-06-25
2021-07-30
2021-08-27
2021-09-24
2021-10-29
2021-11-26
2021-12-31 Rubyの公式リファレンスは docs.ruby-lang.org お題: 年、月、週の初めの曜日を表す値(0=日曜日, 1=月曜日)を入力するとその月のカレンダーを出力する。
例
入力: 2021 6 0
出力:
日 月 火 水 木 金 土
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
上の例はスペースの幅の都合で表示が崩れているかも知れないが、等幅(漢字は2倍)と考えて作って良い。
(なんだったら出力を画像にしても良い) >>36 Ruby
str = '2021 7 0'
y, m ,s = str.scan(/\d+/).map(&:to_i)
a = '日月火水木金土'.chars.rotate(s)
a << [" "] * ((Time.new( y, m, 1 ).wday - s) % 7)
1.upto(31){|d|
break if Time.new( y, m, d ).month != m
a << '%2d' % d
}
a.flatten.each_slice(7){|w| puts w.join(' ') } >>36 Ruby
str = '2021 7 0'
y, m, s = str.scan( /\d+/ ).map( &:to_i )
( '日月火水木金土'.chars.rotate(s) + [' '] * (( Time.new( y, m, 1 ).wday - s ) % 7) + (1 .. [31, 30, 29, 28].find{|d| Time.new( y, m, d ).month == m }).to_a.map{|d| '%2d' % d } ).flatten.each_slice(7){|w| puts w * ' ' } >>36
>週の初めの曜日を表す値(0=日曜日, 1=月曜日)を入力する
その条件、いるのですか? >>45
誰も要らないとは言っていないのに要らないと言っているように感じられるのは
お前がお前自身のことを要らないと思っているからなのだろうな >>43
キチ外だな
>>46
言い訳すんなアスペ
普通の人間は文脈読むだろ 本気で知らないんだろう
月曜始まりのカレンダーを見たことないご存じないとかじゃね? >>49
むしろ全てのカレンダーを月曜始まりにして欲しいぐらい オプションの話なんてどうでもいいけど
1日を左上始まりの方が合理的だと思う どうかな
多くの場合
月の開始日を固定するより
曜日を固定した方が有用だ
月によって 曜日固定の暦も提案されたけど採用されることはなかったんだよね まあ大抵の人は基本的に曜日で休みが決まってたりするしな 28日×13月、最終月で調整、がシンプルで良かったのにな
年初の時期も夏至とか分かりやすい日にすれば良かったのに 暦は農業をするうえで細かく日を読む必要から作られ発展してきた
農閑期には日付が定められなかったことも
ヨーロッパの言語で前半は神の名が付けられ、後ろの方がテキトーなことからもその時代における重要度が推し量れる そもそも古代ローマの暦では11-12月は名前がなかった >>36 Ruby
お題の仕様を拡張してみた
前後の月の日付も週単位で表示
・前月日付は週はじめから最小1日から最大7日
・翌月日付は週末まで最小0日から最大6日
require 'date'
str = '2021 7 0'
y, m ,s = str.scan( /\d+/ ).map( &:to_i )
a = '日月火水木金土'.chars.rotate(s)
sw = (Time.new( y, m, 1 ) - s % 7).wday
( (sw == 0)? 7 : sw ).downto(1){|d| a << Date.new( y, m, 1 ).prev_day( d ).mday.to_s }
1.upto( Date.new( y, m, 1 ).next_month.prev_day.mday ){|d| a << '%2d' % d }
(-a.size % 7).times{|d| a << '%2d' % (d+1) }
a.each_slice(7){|w| puts w * ' ' } >>36 Ruby
>>63
> sw = (Time.new( y, m, 1 ) - s % 7).wday
は間違いでした
require 'date'
str = '2021 7 0'
y, m, s = str.scan( /\d+/ ).map( &:to_i )
m1 = Date.new( y, m, 1 )
sw = m1.wday - s % 7
pmd = m1.prev_day.mday
a = '日月火水木金土'.chars.rotate(s)
( pmd - ((sw == 0)? 7 : sw) + 1 ).upto( pmd ){|d| a << d.to_s }
1.upto( m1.next_month.prev_day.mday ){|d| a << '%2d' % d }
(-a.size % 7).times{|d| a << '%2d' % (d+1) }
a.each_slice(7){|w| puts w * ' ' } >>64 もバグ有り
> sw = m1.wday - s % 7
sw = (m1.wday - s) % 7 >>28-31
28はPowerShell版
お題:クロームブラウザーのヘッドレスモードを使って何かを作る
google-chrome --headless --disable-gpu --hide-scrollbars --window-size=700,8000 --virtual-time-budget=10000 --screenshot="$HOME/Pictures/$(date +"%H_%M_%S").png" 'yahooリアルタイム検索結果のURL'
--window-size=はスクリーンショットを撮る範囲
--virtual-time-budget=は検索結果が表示されるまで時間がかかるサイトで使う。これがないと検索結果のスクリーンショットがうまく撮れない。10000ミリ秒=10秒。 数学板から
お題
Σ[n:2〜∞]cos(n)/log(n)を小数第10まで求めよ
元々収束するか?で収束するなら10桁計算せよってついてたけど今のところ10桁計算してみせた人おらず
もちろん収束遅すぎて少し工夫しないと10桁出すのは難しいかなと >>67
チェザロ平均考えるとかかな
1万項の平均雑に計算したら-1.34までは収束してる感じ
https://ja.wikipedia.org/wiki/チェザロ平均 >>67 Haskell
sums xs = scanl1 (+) xs
ss n = sums [cos k / log k | k <- [2..n]]
avr xs = sum xs / (fromIntegral $ length xs)
結果:
λ> avr $ ss 10000
-1.3422141860097583
(0.02 secs, 6,244,872 bytes)
λ> avr $ ss 100000
-1.3422187431198473
(0.21 secs, 61,066,720 bytes)
λ> avr $ ss 1000000
-1.3422195503566596
(1.97 secs, 609,383,904 bytes)
λ> avr $ ss 10000000
-1.3422195021937073
(48.08 secs, 6,092,457,440 bytes)
これ以上は厳しそうだから何か工夫しないといけないけど8桁辺りまでは収束してそう この文献
https://www.kurims.kyoto-u.ac.jp/~kyodo/kokyuroku/contents/pdf/1084-4.pdf
をもとに C
#include <math.h>
#include <stdio.h>
int main(){
double p=12.0,q=7.0,s=0;
long n,nmax=166;
for(n=2;n<nmax;n++) s+=(cos(n)/log(n))*0.5*erfc(n/p-q);
printf("s=%-20.16lf, N=%d\n",s,nmax-2);
return 0;
}
s=-1.3422195101745578 , N=164 >>67 収束する。
B_k := Σ[n : 2..k] cos(n)
|B_k| = |cos((k + 1) / 2) sin(k / 2) / sin(1 / 2) - (1 + cos(1))|
(see https://math.stackexchange.com/questions/225941/proving-sum-limits-k-0n-coskx-frac12-frac-sin-frac2n12x)
<= 1 / sin(1 / 2) + 1 + cos(1) ... (i)
a_n := 1 / log(n)
Σ[n : 2..∞] |a_{n + 1} - a_n|
= Σ[n : 2..∞] |log(n / (n + 1)) / (log(n) log(n + 1))|
<= Σ[n : 2..∞] |log(2) / log(n + 1)^2|
< ∞ ... (ii)
lim a_n = 0 as n -> 0 ... (iii)
(i), (ii), (iii) よりアーベルの級数判定法の条件を満たすので所与の級数は収束する。 >>72
すごい
あんまり読めてないけど交代級数じゃなくても使えるの? >>74
6節でFFTの計算とともに使ってるのでフーリエ級数全般に使えるはず >>5の2 Dart版
void main() {
DateTime today = new DateTime.now();
print(
"${today.year.toString()}/${
today.month.toString().padLeft(2,'0')}/${
today.day.toString().padLeft(2,'0')}/第${
((today.day + 6) / 7).floor()}${
{1:'月曜日',2:'火曜日',3:'水曜日',4:'木曜日',5:'金曜日',6:'土曜日',7:'日曜日'}[today.weekday]}/${
today.hour.toString().padLeft(2,'0')}:${
today.minute.toString().padLeft(2,'0')}/"
);
} >>75
やっぱり交代級数限定の話っぽいけど何で今回上手く行ってるのか良く分からない お題
2乗〜6乗
自然数nに対して方程式
n = p^2+q^3+r^4+s^5+t^6
の整数解をひとつ探し出す関数を実装せよ
例
-2 → [1,-2,1,0,0]
-1 → [1,-2,1,1,9]
0 → [1,-1,0,0,0]
1 → [1,0,0,0,0]
2 → [1,1,0,0,0]
100 → [2,0,0,2,2]
2021 → [3382713530574301803635446275486,-563785588429051426890762429768,2252569709434420,5488,750856569811473] 訂正
-2 → [2,-2,1,1,0]
-1 → [0,-1,0,0,0] >>80
ですな
-1,-2は抜いて
じゃ追加で
3→[1,1,1,0,0]
10→[1,2,1,0,0]
1000→[1,-3,1,4,1]
などなど >>81
n<=10^6 を力業で、先頭と最後の101件のみ表示
https://ideone.com/LjkJHe >>83
元々整数のつもりだったのが筆が滑りましたw
お好きな方でという事で
自然数に限定して楽になる事もないと思うけど 元の問題
面白い問題おしえて〜な 37問目
https://rio2016.5ch.net/test/read.cgi/math/1624644393/543
元の問題は7乗まで使って桶だったけど6乗までの解答が出た
https://rio2016.5ch.net/test/read.cgi/math/1624644393/588
あくまでプログラムの話、数学の部分はどうでもいいという方は参考にして下さい
この方法はn-t^5-76843が6630の倍数になるような整数tが取れる事を使います(t:0〜6629の中で探す) >>87
それはまだ数学板では5以下でも可能も5以外では不可能もどっちも証明されてません お題: 端末上に地球を模した円の描画を行い、入力された緯度、経度のおおよその地点に印を付けろ
ただし描画される円の中心は常に日本の東京とし、東京が見えるようにすること
描画される円の大きさは自由とする
入力された座標が東京の裏側の半球上にあって印を描画できない場合は、印を描画しないか、あるいは円(地球)を透過させて印を描画する
地球の半径=6,371 km
東京の経度=139°41′30″
東京の緯度=35°41′22″
*出題者は自分で実装してません >>89
画面の上を地球上のどの方位にするとか、平行投影なのか透視投影なのか画角どうするかとか決めないといけないんでないの? >>89
>>90
画面の上端を北とします
投影方法と画角はよくわからないので自由とします^^; 地形データってどっかから取って来れるの?そこも自作しろと?それとも地形描画なしのツルツルの地球で良い? >>5の2 JavaScript版
let today = new Date()
console.log(
today.getFullYear().toString() + '/' +
today.getMonth().toString().padStart(2,'0') + '/' +
today.getDate().toString().padStart(2,'0') + '/' +
'第' + ( Math.floor( ( today.getDate() + 6 ) / 7 ) ).toString() +
['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'][today.getDay()] + '/' +
today.getHours().toString().padStart(2,'0') + ':' +
today.getMinutes().toString().padStart(2,'0') + '/'
) >>20 Perl5、DPで解けないかなと考えてたけど、すぐには思いつかずnaiveな解法
use List::Util 'max';
my $m;
sub f {
my ($a, $b, $c) = @_;
return () if $m and $m <= $c;
my $aa = $a * $c - $b;
return ($m = $c) if 0 == $aa;
my @s;
if (0 < $aa) {
my $bc = $b * $c;
@s = f($aa, $bc, max(int($bc / $aa), $c + 1));
@s = ($c, @s) if @s;
}
my @t = f($a, $b, max(int($b / $a), $c + 1));
if (@s and @t) {
$s[-1] < $t[-1] ? @s: @t;
} else {
@s ? @s: @t;
}
}
$m = 0; my @a = f(37, 60, 1);
printf "37 / 60 = %s\n", join ' + ', map{"1/$_"} grep{$_} @a;
#$m = 0; my @a = f(3, 1, 1);
実行結果
~ $ perl 20_20_re_expan.pl
37 / 60 = 1/4 + 1/5 + 1/6
なお、この解法だと 3/1 = は時間がかかりすぎて解けない 平面上に円をおくと、円周上に整数点ができることがあるが
それがちょうど47個の円の最小半径は?
ここで前にもあったとおもったが、答わからん お題: (C/C++/Rust限定)
与えられたテキストファイルのエンコーディングを早く正確に判定するプログラムを作れ。
判定内容はASCIIのみ、UTF-8、UTF-16、Shift_JIS、バイナリのいずれかとBOMの有無とする。
ファイル先頭にBOMがある場合はBOMの意味を優先するものとする。
ASCIIではない場合はファイル先頭より256バイト以降は無視するものとする。
テキストファイルがUTF-8かShift_JISか区別できないときはUTF-8の判定を優先するものとする。
判定にかかった時間をミリ秒単位で測定せよ。
UTF-16 BEとEUC-JPはバイナリとみなしてもよい。 昔々グラフィックス画面に直線を描くアルゴリズム調べた時は感動したな。あれは40年ぐらい前か。月日の経つのは早いものぢゃ。 お題
文字列を入力として受け取って
入力された文字列と、入力された文字列を逆順にした文字列を
1文字ずつ交互に結合した文字列を出力してください
入力: abcde
出力: aebdccdbea >>103 Ruby
'abcde'.size.times{$><<s[_1]<<s[~_1]} # => aebdccdbea >>103
Haskell
import Data.List
acbbca x = concat $ transpose [ x , reverse x ]
main = do
putStrLn $ acbbca "Hello World"
putStrLn $ acbbca "たけやぶやけた"
----
HdellrlooW WoolrlledH
たたけけややぶぶややけけたた なんかこういうのはhaskellのlensが得意そうな気がするな
この前Intのリストの奇数だけソートするのを
sortArray xs = xs & partsOf (each . filtered odd) %~ sort
だけで済ましてるのを見た >>103 octave
https://ideone.com/vpOPSb
f = @(s) [s; flip(s)](:)';
f('abcde') >>103 Perl5
@b = reverse @a = split'', 'abcde';
use List::MoreUtils 'zip';
print zip @a, @b;
実行結果
~ $ perl 20_103.pl
aebdccdbea >>103 J
f =: ,@(,. |.)
___ f 'abcde'
aebdccdbea >>104
Rbuy 3.0.2 だと s が未定だと怒られる >>36 octave
https://ideone.com/YRTUpL
function [c, w] = f(y, m, dow)
c = calendar(y, m);
w = {'日' '月' '火' '水' '木' '金' '土'};
if dow == 1
a = (c')(:);
b = [-1 6](1 + (a(1) == 1));
c = reshape(circshift(a, b), flip(size(c)))';
w = circshift(w, -1, 2);
end
end
function g(y, m, dow)
[c, w] = f(y, m, dow);
disp(strjoin(cellfun(@(s) {sprintf('%6s', s)}, w), '')), disp(c)
end >>114 Ruby
$><<%W[「中止の考えはない。強い警戒感を持って に臨む」\n「バブル方式で する。感染拡大の恐れはないと認識している」]*gets.chop >>114 Perl5
$it="うっふ〜ん";
print<<EOF;
「中止の考えはない。強い警戒感を持って${it}に臨む」
「バブル方式で${it}する。感染拡大の恐れはないと認識している」
「コロナに打ち勝った証として${it}する」
「${it}を中止することは一番簡単なこと、楽なことだ。${it}に挑戦するのが国民の役割だ」
「安心安全な${it}に向けて全力で取り組む」
「不要不急かどうかは本人が判断すべきだ」
EOF
実行結果
$ perl 20_114_菅話法.pl
「中止の考えはない。強い警戒感を持ってうっふ〜んに臨む」
「バブル方式でうっふ〜んする。感染拡大の恐れはないと認識している」
「コロナに打ち勝った証としてうっふ〜んする」
「うっふ〜んを中止することは一番簡単なこと、楽なことだ。うっふ〜んに挑戦するのが国民の役割だ」
「安心安全なうっふ〜んに向けて全力で取り組む」
「不要不急かどうかは本人が判断すべきだ」 半月ぐらいお題が出ないので一つ。
お題: テトロミノ
こんなパズルを解く。
https://ja.wikipedia.org/wiki/%E3%83%86%E3%83%88%E3%83%AD%E3%83%9F%E3%83%8E
大きさもピースも任意だが、上記ページにあるやつそのままで良い。(2つあるがどちらか一つで良い)
沢山パターンがあるかも知れないが、最初に見つかった一つを出すだけでも良い。
出力はテキストでも何でも人間が見て分かるようになってれば良い。
この問題については既にあちこちで答えが出ているような枯れた問題だと思うので、なるべく何も見ずに自分で考えて作ること。 お題:15パズルを解くプログラム。
15パズルの盤を16要素の配列で表現し、実際に解く様子を出力せよ。空白は整数のゼロで表現する。
解けないときは「No answer」を出力せよ。可能ならば画像データも出力せよ。
参考資料:
http://www.studio-boiler.com/k/kouryaku/kou.htm 最短でも80手らしい
それくらいだと全部表示してもそこまでうるさくないんだけど簡単な探索法だと2,300超えてしまいそう
全部表示したらうるさい事この上ないんだよな お題:パンくずリストを出力せよ
入力
東京,特許,許可局
出力
<ul class="pankuzu">
<li class="pankuzu_item">東京</li>
<li class="pankuzu_item">特許</li>
<li class="pankuzu_item active">許可局</li>
</ul> >>122
react
const Pankuzu = ({ items }) => (
<ul className="pankuzu">
{items.map((item, i) => (
<li
key={`item-${item}`}
className={"pankuzu_item"}
data-active={i === items.length - 1}
>
{item}
</li>
))}
</ul>
); >>122 Perl5
use HTML::TreeBuilder;
@s = split',','東京,特許,許可局';
@a = map{['li', {class => 'pankuzu_item'}, $_]} @s;
$a[-1][1]{class} .= ' active';
$h = HTML::Element->new_from_lol(['ul', {class => 'pankuzu'}, @a]);
print $h->as_HTML('<>&', ' ', {});
実行結果
~ $ perl 20_122_pankuzu_list.pl
<ul class="pankuzu">
<li class="pankuzu_item">東京</li>
<li class="pankuzu_item">特許</li>
<li class="pankuzu_item active">許可局</li>
</ul> >>127
use HTML::TreeBuilder;
だと色々引き連れて来るので、使う
use HTML::Element;
をuseすれば良かったんだけど、結果は同じだしまいいや… >>122 ocaml
https://ideone.com/lTmi19
let f =
let rec aux acc = function
[] -> "<ul class=\"pankuzu\">\n" ^ acc ^ "</ul>"
| s :: [] -> aux (acc ^ "<li class=\"pankuzu_item active\">" ^ s ^ "</li>\n") []
| s :: ss -> aux (acc ^ "<li class=\"pankuzu_item\">" ^ s ^ "</li>\n") ss
in aux ""
let () = print_endline @@ f ["東京"; "特許"; "許可局"] >>122 bat
:: usage: this.bat 東京,特許,許可局
@echo off &setlocal enabledelayedexpansion
set "OUTPUT=echo ^<ul class="pankuzu"^>"
for %%a in (%*) do set "OUTPUT=!OUTPUT!&echo ^^<li class="pankuzu_item"^^>%%~a^^</li^^>"&set "LastArg=%%~a"
set "OUTPUT=!OUTPUT!&echo ^^</ul^^>"
set OUTPUT=!OUTPUT:"^>%LastArg%= active"^^^>%LastArg%!
%OUTPUT%
:: (%OUTPUT%) >>pankuzu.txt お題
次のように置換した文字列が入力される
ESC → ESCESC
CR → ESCcr
LF → ESClf
元の文字列を復元してください
続く・・・ >>132の続き
例) 入力 → 出力
ESCESCESCESC → ESCESC
ESCESCESCcr → ESCCR
ESCESCESClf → ESCLF
ESCESCESCESCcr → ESCESCcr
ESCESCESCESClf → ESCESClf
ESCcrESCESC → CRESC
ESCcrESCcr → CRCR
ESCcrESClf → CRLF
ESCcrESCESCcr → CRESCcr
ESCcrESCESClf → CRESClf
ESClfESCESC → LFESC
ESClfESCcr → LFCR
ESClfESClf → LFLF
ESClfESCESCcr → LFESCcr
ESClfESCESClf → LFESClf
ESCESCcrESCESC → ESCcrESC
ESCESCcrESCcr → ESCcrCR
ESCESCcrESClf → ESCcrLF
ESCESCcrESCESCcr → ESCcrESCcr
ESCESCcrESCESClf → ESCcrESClf
ESCESClfESCESC → ESClfESC
ESCESClfESCcr → ESClfCR
ESCESClfESClf → ESClfLF
ESCESClfESCESCcr → ESClfESCcr
ESCESClfESCESClf → ESClfESClf >>132 Ruby
def decode( str ) = str.gsub( /ESC(ESC|cr|lf)/, { 'ESCESC' => 'ESC', 'ESCcr' => 'CR', 'ESClf' => 'LF' } ) >>132 Ruby
def decode( str ) = str.gsub( /ESC(ESC|cr|lf)/ ){ _1[3..].upcase } >>132 Perl5
s/ESC(ESC|cr|lf)/\U$1/g;
実行結果
https://ideone.com/2dajdn お題: 円柱の高さ(5〜15cm)と半径(5〜10cm)を指定すると、その円柱の展開図のSVGデータを出力するプログラム。
展開図には一部、0.5〜1cmほどのりしろがあり、印刷・糊付けして実際に組み立てることができるものとする。SVGの用紙はA4サイズ。 >>142
糊代を折ることを考えたら円柱じゃなくて(円に近い)多角柱になると思うけど、それでいいの? >>132
Java
https://paiza.io/projects/H0RSztAvHumk7NcFZBWWnA
"ESCESC"を "ESC" 任意の文字 に変換して
逆の変換すればOK
下記のJSONの文字列のようなエスケープでも
同様のやりかたで復元できる、はず
\ → \\
\r → \\r
\n → \\n 訂正
\ → \\\\
\r → \\r
\n → \\n 訂正2
\\ → \\\\
\r → \\r
\n → \\n お題 転調記号の数
問題
12成分のベクトル
a=[ 5,2,3,4,1,6,1,4,3,2,5,0 ] // 半音上げた調号数
b=[ 0,5,2,3,4,1,6,1,4,3,2,5 ] // 原曲の調号数
c=[ 5,0,5,2,3,4,1,6,1,4,3,2 ] // 半音下げた調号数
をとる
12成分の実ベクトルxに対して
f(x) = min{ a・x, b・x、c・x } (・は内積)
と定める
xが領域
x[i]≧0, Σ_[i:1〜12] x[i]=1
を動く時f(x)の最小値を求めよ
原題は数学板にあるけど長いし音楽知らないとわけわかめになるので略
知りたい人は以下より
https://rio2016.5ch.net/test/read.cgi/math/1629715580/80
面白い問題おしえて〜な 38問目
と
https://rio2016.5ch.net/test/read.cgi/math/1629715580/190
面白い問題おしえて〜な 38問目 x=[1,0,0,0,...]でf(x)は最小値0をとるけど、原題みるとf(x)の最大値を求めるのかな 黒鍵が1オクターブに5個しかないのに
調号が6個必要なのが納得出来ない >>152
嬰へ長調は♯6個とその異名同音調の変ト長調は♭6個でどうあがいても6個必要です
♭1個でキーは5/12上がり♯1個でキーは5/12下がりますがハ長調から見て嬰へ長調=変ト長調はどちらから回っていっても6個必要です
https://ja.m.wikipedia.org/wiki/%E5%AC%B0%E3%83%98%E9%95%B7%E8%AA%BF
>>153
もう少し大きいです
数学板で最初に出た3より大きい例は
https://rio2016.5ch.net/test/read.cgi/math/1629715580/157
面白い問題おしえて〜な 38問目
変ト長調3回、ニ長調4回、変ロ長調4回
0 5 2 3 4 1 6 1 4 3 2 5
_ 4 _ _ _ 3 _ _ _ 4 _ _ = 35 > 33
_ _ 4 _ _ _ 3 _ _ _ 4 _ = 34 > 33
_ _ _ 4 _ _ _ 3 _ _ _ 4 = 35 > 33
つまりこの場合f(0,0,4/11,0,0,0,3/11,0,0,0,4/11,0)=34/11です
ホントの最大値はもう少し大きくなります 答え有理数です
しかしプログラム板のお題なので近似値出れば良しでいいと思います >>148
元の出題
>変ニ長調(♭×5)→ホ長調(♯×4)→へ長調(♭×1)という曲の平均調号数は
そんな変てこな転調があり得るのか‥‥ サビで短3度転調、後半盛り上がって半音上げはポップス曲だとよくある >>148
そのお題はタイトルからして調べないと分からない単語が使われており、全体を通して何を言わんとしているのか分からない。 >>163
音楽知識は不要 (不要なように書き換えてる)
それ以外は簡単な数学用語 (高校レベル) >>162
>サビで短3度転調、後半盛り上がって半音上げはポップス曲だとよくある
気がつきませんでした、なるほど
>後半盛り上がって半音上げ
最後に半音上がるアレ、主和音と同じ高さで導音系の和音を強奏するのが無理があると思っており好みじゃないのです‥‥
https://www.youtube.com/watch?v=ENgNiqc0m3I&t=275s >>152
白鍵に調号をつけるしかない場面があるのです、>>154 のいうとおり ♭ソを基本の音にした音階のときはそうなります‥‥
では 7 個が最大かというと、そうでもなくて、ダブルシャープ(シャープ2個分)、ダブルフラット(フラット2個分)を使って(一時的に)8個以上の楽譜に仕上げる人がいました‥‥ ちなみにこの問題よくよく考えるとアルゴリズムの教科書によく出る超有名問題になってます
問題の名前だけは高校の数学の教科書にも載ってるくらい有名な問題です 3.2222222222222ってなるのかな
3.222221で止まってるけど 最大=>3個とも平均が同じ=>3個の調しか使わない最大が存在する=>12C3全検索 >>171
それです
見つけ方は>>171さんの方法が1番簡単
なんせ何も工夫しなくてもC[12,3]=220通りしかないので全部総当たりで計算する方が早い
それには
5a+ 2b+ 3c+ 4d+ 1e+ 6f+ 1g+ 4h+ 3i+ 2j+ 5k+ 0l
≧
0a+ 5b+ 2c+ 3d+ 4e+ 1f+ 6g+ 1h+ 4i+ 3j+ 2k+ 5l、
5a+ 0b+ 5c+ 2d+ 3e+ 4f+ 1g+ 6h+ 1i+ 4j+ 3k+ 2l
≧
0a+ 5b+ 2c+ 3d+ 4e+ 1f+ 6g+ 1h+ 4i+ 3j+ 2k+ 5l、
a*b+c+d+e+f+g+h+i+j*k+l≧1
の中の
0a+ 5b+ 2c+ 3d+ 4e+ 1f+ 6g+ 1h+ 4i+ 3j+ 2k+ 5l
の最大値探す時に例えばd,f,h成分だけ0でない領域での最大値を見つけるには12元の線形方程式
5a+ 2b+ 3c+ 4d+ 1e+ 6f+ 1g+ 4h+ 3i+ 2j+ 5k+ 0l
=
0a+ 5b+ 2c+ 3d+ 4e+ 1f+ 6g+ 1h+ 4i+ 3j+ 2k+ 5l、
5a+ 0b+ 5c+ 2d+ 3e+ 4f+ 1g+ 6h+ 1i+ 4j+ 3k+ 2l
=
0a+ 5b+ 2c+ 3d+ 4e+ 1f+ 6g+ 1h+ 4i+ 3j+ 2k+ 5l、
a*b+c+d+e+f+g+h+i+j*k+l=1、
a=b=c=e=g=i=j=k=l=0
を解いてどれかの成分が0以下なら捨て、正なら候補に残して全部調べてのパターンを後3つやればいけます
(もちろん有理係数の線形方程式なので解は有理数)
その際線形代数の計算をやってくれるライブラリがあれはそんなに大変な作業にはならないはずです
というかこのタイプの問題“線形計画法”この問題解くためのライブラリ持ってるやつが多いのでその場合は数行で終わってしまいます >>174
理詰めの解答よりこういう力技の解答の方がありがたいです
理詰めはどっかでうっかり間違ってる事も多いので
>>172さんの方針で220通り全数検索するコード組んでみました
https://ideone.com/Vyqp8r
元々用意してた解答は単体法( Simplex algorythm)というやつ使う方法だったんですけど、220個位なら全数検査した方が安全ですね
しかも全部調べるのでベスト10とか出せる
さっきのコードは原曲のままが最小になる場合のベスト10とどちらかに半音ずらした方が最小になる場合のベスト10です お題: 中心(x, y)で半径mの円と、中心(z, w)で半径nの円の当たり判定。 お題: カオス理論で知られるローレンツ・アトラクタを描画せよ。 お題: 厚み0.5cm長さX cmのしなやかなテープを最小のうずまき状にまるめると直径は何cmになるか。X = 20, 30, 50. >>178
「しなやかな」の定義中、中心側の終端の扱いを精緻に定義しなおしてください document.querySelectorAll('.post').forEach( e => {
const nameElement = e.querySelector('.name');
if(nameElement === null) return;
const name = nameElement.innerText;
if(name.indexOf('◆T6xkBnTXz7B0') >= 0 || name.indexOf('◆QZaw55cn4c') >= 0) e.remove();
}); >>176
それって数学的な証明はよくわからないんだけど直感的に考えると、(x, y) から (z, w) の距離が m + n 以下なら当たりで良いのかな?
他のパターンで当たる場合はなさそうだけど、あったとしても今は思いつかないのでとりあえずプログラムはそれで作ろうかと思う。 入力として整数値が与えられたらその中の立っているビットを
等確率でランダムに一つ抜き出した整数値を出力する
3が与えられたら1か2のどちらかを1/2の確率で
17179877640が与えられたら8か256か8192か17179869184のどれかを1/4で >>Ruby
n = 17179877640
bits = []
while n > 0
n ^= b = n & -n
bits << b
end
puts bits.sample お題 繁分数
奇数個の整数がカンマで区切りで与えられる
間に'+'と'/'を順に挿入して計算する、ただし優先順位は後から優先
例) "1,2,3,4,5,6,7" → " 1 + 2 / ( 3 + 4 / ( 5 + 6 / 7 ))) = 233/151 ≒ 1.543046357616
計算結果を出力せよ
例)
入力 : "1,2,3,4,5,6,7"
出力 : 1.543046357616
入力 : "1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2"
出力 : 1.4142135623730951
入力 : "2,1, 1,1, 2,1, 1,1, 1,1, 4,1, 1,1, 1,1, 6,1, 1,1, 1,1 "
出力 : 2.718283582089552
入力 : "0, 4, 1, 1, 3, 4, 5, 9, 7, 16, 9, 25, 11, 36, 13, 49, 15, 64, 17, 81, 19, 100"
出力 : 3.141593311879928 >>186
なぜ、偶数個あるのか?
偶数個は最後に1"を入れてやってみた
(頭悪いからリヴァースして、浮動小数点でやっている)
https://wandbox.org/permlink/jzQZa53lpDSPdJo1 >>187
うーむ、私の >>189 よりシンプルですね >>186 Perl5
use feature qw{signatures say};
no warnings 'experimental';
sub s($a, $b, @a) { @a ? $a + &d($b, @a) : $a + $b }
sub d($a, $b, @a) { @a ? $a / &s($b, @a) : $a / $b }
say &s(/(\d+)/g) for <DATA>;
__DATA__
1,2,3,4,5,6,7
1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
2,1,1,1,2,1,1,1,1,1,4,1,1,1,1,1,6,1,1,1,1,1
0,4,1,1,3,4,5,9,7,16,9,25,11,36,13,49,15,64,17,81,19,100
実行結果
$ perl 20_186_fraction.pl
1.54304635761589
1.4142135623731
2.71828236824984
3.14159316790851 >>186
ruby -ne "/$_.split(?,).map(&:to_f).each_slice(2).reverse_each.reduce{|(s), (a, b)| b / s + a}"
# input
1,2,3,4,5,6,7
1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2
2,1, 1,1, 2,1, 1,1, 1,1, 4,1, 1,1, 1,1, 6,1, 1,1, 1,1,1
0, 4, 1, 1, 3, 4, 5, 9, 7, 16, 9, 25, 11, 36, 13, 49, 15, 64, 17, 81, 19, 100, 1
# output
1.5430463576158941
1.4142135623730951
2.718282368249837
3.141593167908507 >>186 C
>>189
終端処理を間違えていたので御題にあわせて修正
https://ideone.com/4mkYde
233/151 = 1.54304635761589414855
1855077841/1311738121 = 1.41421356237309514547
1457/536 = 2.71828358208955211950
54193766400/17250408000 = 3.14159331187992751921 >>186 J
f =: +`%/
___ f 1,2,3,4,5,6,7
1.54305 >>186 Perl5、>>191だと分母が大きい値になるテストケースで下の桁が例解と違ってくるので、通分を下から再帰的に行って
最後に割り算するようにした。また数値の個数が偶数だった場合には0を補うようにした
use feature qw{signatures say}; no warnings 'experimental';
sub f($a, $b, $c = 0, @r) {
if (@r) {
($c, $e) = f($c, @r);
$b *= $e;
}
($a * $c + $b), $c;
}
for (<DATA>) {
my ($n, $d) = f(/(\d+)/g);
say "$n / $d = ", $n / $d;
}
__DATA__
1,2,3,4,5,6,7
1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
2,1,1,1,2,1,1,1,1,1,4,1,1,1,1,1,6,1,1,1,1,1
0,4,1,1,3,4,5,9,7,16,9,25,11,36,13,49,15,64,17,81,19,100
$ perl 20_186_fraction_2.pl
233 / 151 = 1.54304635761589
1855077841 / 1311738121 = 1.4142135623731
1457 / 536 = 2.71828358208955
54193766400 / 17250408000 = 3.14159331187993 すいません
>>191は例題おかしいので数字合わないですね
気にしないでください
最後の例では最後の項の100抜くか、最後に21を追加してください
100抜いた場合は
4317632 / 1374345 = 3.14159254044654
21追加した場合は
54743776 / 17425485 = 3.1415926730303347
になると思います
>>191の例は
0+4/(1+(1/(3+...(17+81/(19+100/0)))))...)))
になってしまってるんだと思います(違うかも) >>186 ocaml
https://ideone.com/VpQwAG
let f xs =
let rec g = function
[] -> 0, 1
| a :: [] -> a, 1
| a :: b :: [] -> a + b, 1
| a :: b :: cs -> let n, d = g cs in a * n + b * d, n
in let n, d = g xs in Printf.printf "%d / %d = " n d;float n /. float d
>>186 ocaml
https://ideone.com/5D0lHx
let f xs =
let rec g = function
[] -> 0, 1
| x :: [] -> x, 1
| x :: xs -> let n, d = h xs in x * d + n, d
and h = function
[] -> 0, 1
| x :: [] -> x, 1
| x :: xs -> let n, d = g xs in x * d, n
in let n, d = g xs in Printf.printf "%d / %d = " n d;float n /. float d let g xs = Printf.printf "%.16f\n" @@ f xs
let () =
g [];g [1];g [1;2];g [1;2;3];g [1;2;3;4];g [1;2;3;4;5;6];
g [1;2;3;4;5;6;7];
g [1;1;2;1;2;1;2;1;2;1;2;1;2;1;2;1;2;1;2;1;2;1;2;1;2;1;2;1;2;1;2;1;2;1;2;1;2;1;2;1;2;1;2;1;2;1;2;1;2];
g [2;1;1;1;2;1;1;1;1;1;4;1;1;1;1;1;6;1;1;1;1;1];
g [0;4;1;1;3;4;5;9;7;16;9;25;11;36;13;49;15;64;17;81;19;100];
g [0;4;1;1;3;4;5;9;7;16;9;25;11;36;13;49;15;64;17;81;19];
g [0;4;1;1;3;4;5;9;7;16;9;25;11;36;13;49;15;64;17;81;19;100;21]
↓
0 / 1 = 0.0000000000000000
1 / 1 = 1.0000000000000000
3 / 1 = 3.0000000000000000
5 / 3 = 1.6666666666666667
9 / 7 = 1.2857142857142858
59 / 37 = 1.5945945945945945
233 / 151 = 1.5430463576158941
1855077841 / 1311738121 = 1.4142135623730951
4178 / 1537 = 2.7182823682498372
66628546560 / 21208521600 = 3.1415931679085070
12434780160 / 3958113600 = 3.1415925404465401
315324149760 / 100370793600 = 3.1415926730303347 >>197
>[] -> 0, 1
>| x :: [] -> x, 1
>| x :: xs -> let n, d = h xs in x * d + n, d
>>193 を書いた私としてはなんとなくわかってしまうのが‥‥悲しいですね つまり >>193 は言語として冗長だ、という点が悲しい、という意味です、誤解を招かないように補充します お題: 与えられたUTF-8日本語文章から空白と記号を取り除いた後の文字列にNGワードがあるかどうか判定せよ。
NGワード: 「集近閉」「地獄経済」
例文1「集☆近☆閉☆は☆不☆滅」
例文2「地/獄/経/済/は/大/丈/夫」
出力例:「NGワード「集近閉」があります。」
出力例:「OKです。」 >>196
いまレス読み返したらアンカー間違ってるorz
>>196で>>191と書いてあるのは全部>>186宛の自己レスです
191さんすいません
ちなみにやっぱり186の数値
3.141593311879928
は最後の部分を.../(17+81/(19+100/(0))))..として処理した値でした
100/0が∞になって17+81/(19+∞) = 17となって結局17で打ち切った場合の答えになってました
17で打切った場合
3763456 / 1197945 = 3.1415933118799275
で>>186の値になってました お題:: 文字列に対して文字列の範囲を指定すると、その範囲を角カッコで囲って出力するプログラムを作れ
文字列はASCII文字の並びでソートされている前提とする
入力フォーマット
文字列
範囲
入力
abcdefghijklmn
c-g
出力
ab[cdefg]hijklmn お題: ハッシュタグをGoogle検索リンクに変換せよ。
ハッシュタグを含む日本語UTF-8文字列が与えられる。ハッシュタグをHTMLハイパーリンクに変換してHTMLテキストを出力する。
ハッシュタグは「#」か「#」か「♯」で始まるものとします。
ハッシュタグには半角の「_」以外の記号と空白は使えません。
HTMLの特殊文字「&<>」はそれぞれ「&」「<」「>」に変換するものとします。
検索リンクは日本語グーグルを使用します。
入力例「これは #テスト文字列です。 #家族募集中 <本日は雨天なり>」 >>206
出力例「これは <a href="https://google.co.jp/search?hl=ja&source=hp&q=テスト文字列です">#テスト文字列です</a>。 <a href="https://google.co.jp/search?hl=ja&source=hp&q=家族募集中">#家族募集中</a> <本日は雨天なり>」 >>206
$ echo -e 'これは #テスト文字列です。 #家族募集 中 <本日は雨天なり>' |
sed -e 's/&/\&/g' -e 's/</\</g' -e 's/>/\>/g' -e 's![##♯]\(\w*\)!<a href="https://google.co.jp/search?hl=ja\&source=hp\&q=\1">&</a>!g'
これは <a href="https://google.co.jp/search?hl=ja&source=hp&q=テスト文字列です">#テスト文字列です</a>。 <a href="https://google.co.jp/search?hl=ja&source=hp&q=家族募集中">#家族募集中</a> <本日は雨天なり> >>205 octave
https://ideone.com/p4vSPE
f = @(s, r) regexprep(s, ['([' r ']+)'], '[$1]');
f('abcdefghijklmn', 'c-g') >>176 Lua
function f(x, y, m, z, w, n)
return (x - z) ^ 2 + (y - w) <= (m + n) ^ 2
end >>219
間違えました
function f(x, y, m, z, w, n)
return (x - z) ^ 2 + (y - w) ^2<= (m + n) ^ 2
end あ、そーか。2乗のまま比較すればsqrt不要だったな。 >>209
の出力例をみると“テスト文字列です”は文字列、“。”な区切り記号と認識してここで切らないとダメみたいだけど、だとするとunicodeの文字列の中にある“区切り記号”と“文字列を構成する文字”を区別しないといけなくなる
GOには“unicode”というライブラリが用意されてて簡単にできるみたいだけどオレが愛用するHaskellではその手のライブラリが見つからんorz
流石にスクラッチで一から書くのは無理だし
どっかに“コード××〜××までは記号”とか一覧になってるテーブルとかないんかな お題: 次を真似して作れ。
「突然の死ジェネレーター」
https://totuzennosi.sacnoha.com/
ただし、等幅フォントでの表示を想定し、半角・全角の文字幅の違いを尊重すること。 >>225
★や※を全角にするか半角にするかに依存。要はフォントに依存するから無理 Unicodeで半角全角を扱う Ambiguous(曖昧さ)とUncertainty(不確実性)の恐怖
https://qiita.com/Nuits/items/71a69cf32d547c9875bb
ま、しかし、なんとなくいい加減で入力によってはおかしくなるやつならば作れるので、後で時間があったら作ろう。 >>227
> Unicodeで半角全角を扱う場合、まずフォントがEast Asian Widthの規定を正しく守っている必要があります。でも実際にはそうとは限りません。
>
> またそれを取り扱うプラットフォームも適切に実装されている必要がありますが、必ずしもそうとは限りません。
仕様を満たしてないものは仕様通りの挙動にならないかどで仕様を叩いているということで合ってる? >>230
> 2020年、2021年の東京では、東京マラソンの開催、東京国際クルーズターミナルのオープン、
> 東京2020オリンピック・パラリンピック競技大会の開催など、国際的に注目を集めるイベントが
> 多数予定されています。
外国からの入国制限、及び無観客にして解決。 お題: 重力と慣性のないデカルト座標系に長さ3, 4, 5の固くて丈夫な連結された3本の棒B1, B2, B3がある。棒の幅はゼロに近い。
B1, B2, B3は現在x軸上に並んでいて、それぞれの端点の座標はO(0, 0)~E1(3, 0)、E1(3, 0)~E2(7, 0)、E2(7, 0)~E3(12, 0)である。
B1, B2, B3はこの順で端点が連結されており、B1の一端は原点O(0, 0)に連結されている。B3の他方の端は自由である。連結点では-180〜180度曲げることができる。
このような条件でB1, B2, B3を連結点O, E1, E2を中心に回転するとE1, E2, E3は移動するであろう。
さて、点P(x, y)が与えられたとき、どのように回転すればE3がPに重なるであろうか。その回答の一つを求めよ。許容誤差をε=0.01とする。
入力例「P=(0, 12)」「P=(5, 5)」「P=(15, 3)」
出力例「90度、0度、0度」「ありません」 悪"そう"では無いな。説明において要点を整理出来ない者はすべからく頭悪い
問題文はその者の理解度に等しい ちなみに代わりに出題するなら
入力(a,b)に対して方程式
a = 3cos(x) + 4cos(x+y) + 5cos(x+y+z)
a = 3sin(x) + 4sin(x+y) + 5sin(x+y+z)
の解x,y,zをひとつ求め(度数法で与えるとする)
「x度、y度、z度」
の形で出力せよ、解がない場合には
「ありません」
と出力せよ
ただし角度の範囲は-180°〜180°の範囲で与えるとする
かな >>239
ここに居るほとんどの人が分かってないから、解説をお願いします。 >>242
素直に「僕には難しすぎてわからないから詳しく教えてください」って言えないの? 2つの副業と、ベルトコンベアのラインでねじ回しの仕事で疲れてるから許してくれよ。 この技術を応用すればロボットアームを自由自在に動かせそうだね。 お題: CSV形式のテキストデータを検索する grep のようなコマンド(または関数)
CSVの形式は RFC 4180 の通りで文字のエンコーディングは UTF-8、改行は CR/LF。
この辺のページを参考にすると良い。
https://datatracker.ietf.org/doc/html/rfc4180
http://www.kasai.fm/wiki/rfc4180jp
https://blog.tech-monex.com/entry/2021/03/26/160000#2-Definition-of-the-CSV-FormatCSV%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%81%AE%E5%AE%9A%E7%BE%A9
普通の grep コマンドを CSV ファイルに対して行うと1つのデータで改行が入っていた時に何行目の何列目のデータなのかが分からなくなって不便である。
その他、ダブルクォーテーションで括られているか否か、データとしてカンマやダブルクォーテーションを含むか否かで検索する側が正規表現を考慮して作らねばならず面倒臭い。
ということでこういった面倒くささを解消するコマンドを作るのがこのお題。
コマンドという形式ではなく正規表現と検索されるCSVテキスト(あるいはCSVファイル名や読み込みオープンしたファイルデスクリプタ)と検索する時のオプション(大文字小文字を無視など)を渡すと検索結果を返す関数を作成しても良い。
尚、1行目の項目名が入っている事がある行についてはその存在の有無をオプションで渡して指定する方式にして良い。
検索結果はパターンにマッチしたデータについて何行目、何列目だったかが分かるようにしてデータと共に出力する(関数の場合は呼び出し元に返す)。
出力する時にデータを見易くするために改行があったら \n 等にエスケープして1行にしても良い。
CSV読み込みや正規表現について既存のライブラリを使うか否かはご自由に。但し言語や環境に最初から付属していない外部のライブラリを使う場合は何を使ったかが分かるようにコメント等に入れておくこと。 お題として質が低いのよ。
課題だねこれじゃw
宿題や仕事は自分でやってどうぞ てかちょっとガチでやったらそれなりの規模になるからこんな所でやるようなもんじゃない せやな
どんなに長くても30分くらいて完成する程度がやってみようと思える限界やろな
所詮暇つぶしやし というか正確に仕様を満たせというのは実装チャレンジであって僕の考えた最強の解決策を見せっこするためのお題にはならんだろ >>251
https://mevius.5ch.net/test/read.cgi/tech/1624934554/88
> 88 名前:デフォルトの名無しさん (ワッチョイ 12ad-ZF+H)[] 投稿日:2021/09/28(火) 00:00:21.68 ID:qy0bUCok0
> >>81
> CSV用のgrepってあったらいいよな。
> ライブラリ使えば簡単そうだからお題スレに出しておくかな。 >>255
ライブラリ使えば余裕
>>256
俺は人生かけてチャレンジする >>251
ちょっと待ってろ俺が回答してみせる
しばらく修行の旅に出る >>254
ライブラリ使うのもあり
オートマトンを実装するのもあり
Bison使うのもあり
パーザジェネレータから作るのもあり
すごく面白そうじゃん お題に文句つけるのはお前ららしくないよ
淡々と馬車馬のように回答するのがお前らのアイデンティティだろ
初心思い出せよ お題 持久戦
隔たりのない6面のサイコロがN個ありi番目のサイコロのj番目の面には整数Aijが書かれている
高橋君は一個のサイコロを選んで一回振ると言う操作を繰り返す。
ただし2回目以降の操作で、前回の操作で出た目より小さいか同じ目が出てしまったら操作を止める
各回どのサイコロを振るかは前回に出た目を見てから決めることができる
高橋君は出来るだけサイコロを多く振りたいと考えている
操作の行われる期待値が最大化されるような選択が行われたときの操作回数の期待値を求めよ
と言うのが数学板に投下されたけどどう見ても数学の問題でないので全員ガン無視
https://atcoder.jp/contests/past201912-open/tasks/past201912_o 以下自分の計算した例
間違ってるかも
入力
1
[ [ 1,2,3,4,5,6 ] ]
出力
117649 / 46656 ( = 2.5216263717421126 )
入力
3
[ 1,2,3,4,5,6 ]
[ 1,4,9,16,25,36 ]
[ 1,8,27,64,125,216 ]
出力
13070575 / 3779136 ( = 3.4586146145574013 )
入力
3
[ 1,1,1,1,1,1 ]
[ 2,2,2,2,2,2 ]
[ 3,3,3,3,3,3 ]
4 / 1 ( = 4.0 )
出力は別に小数表示でも良いとする
尚最後の例は元サイトの“全部異なる”の制約満たしてないけど検算用、無視して桶 >>272
偏りのないです
元ネタのホムペには他にも何問か有るんですけどコレ以外はあんまり面白いのがない
ちなみに例はN=1,3でこれくらいだと総当たりでも解ける
でも元ネタサイトの制限はN≦30000でこれだと実質総当たりだと解けない
なので元ネタは「いわゆるDPで解ける問題だけどできますか?」が題意のようです
まぁここではN=3くらいでパッパッと解ければいいかと お題:
正整数 N が与えられます
f(x) = 正整数 a, b であって 0 < a / b < 1 かつ b ≦ x を満たす a / b の「値の種類数」
としたとき f(x) = N を満たす x が存在するか判定しなさい
制約:
1 ≦ N ≦ 10^12
入力: N
出力: x が存在するのなら "Yes", 存在しないのなら "No"
入力例 1: 11
出力例 1: Yes (f(6) = 11 です)
入力例 2: 123
出力例 2: No
入力例 3: 303963552391
出力例 3: Yes (f(1000000) = 303963552391 です)
f(x) の例
f(1) = 0
f(2) = 1
f(3) = 3
f(4) = 5
f(5) = 9
... >>274
https://ideone.com/lSUULo
c++
アルゴは"OEIS A015614"より、本人はよくわかってない
余談:単純にオイラーのφを200万やっても2秒くらいだった じゃ簡単なお題を
1.少数(整数部MAX5桁、小数部MAX5桁)を入力し、分数に変換するプログラムを作成しなさい。
2.誕生日と日付AをそれぞれYYYYMMDDの8桁の整数で入力し、日付Aの時点で何歳かを表示するプログラムを作成しなさい。
3.西暦年YYYYを入力して閏年か否かの判定をするプログラムを作成しなさい。 平面3リンクマニュピュレータの逆運動学のプログラミングを完成させなさい。
キーボードで手先の位置を入力すると、関節角が表示されるようにすること。
scanfを使うのと、アームの長さなどは適当に決めていいという条件。 >>277
平面3リンクマニピュレータというものを検索してみたけど、手先の位置だけ与えても各関節の角度は同定できないのでは? >>278
第1関節は原点で固定ですね。
手先の位置・姿勢が(xed, yed, φed)と与えられた(キーボード入力)時の、第3関節の位置が
x2=xed−L3×cosφed
y2=yed−L3×sinφed
と求まり、第3関節がこの場所に来るには、リンク1とリンク2が三角形の2辺になるように第1関節と第2関節の角度を決めるという感じですね。 お題専門用語だらけでググらないと意味わからないようなお題やる気にならん scanfってことはHaskellじゃダメなのか。
休み一日しかないから取り掛かってみるか止めとくか悩むね。 >>277は算数はわかってるんだけどプログラムがわからないんだろな。
そんなあなたにHaskell!!Haskell!! >>277
C++のスレで僕の丸投げ課題だれもやってくれないって拗ねてた奴か
こっちにまで来て人に迷惑かけるなよ >>287
物理なら剛体力学でしょうが力学的要素はないから今回は工学の機構学とかそんな感じ
>>279
>リンク1とリンク2が三角形の2辺
せっかく一つ余分にある自由度を、そんな縛りで消費するのはもったいないと思います、それは力学的配慮ですか? 高校一年生が解く方法と、大学生が解く方法は違うのだろうか? >>277
まぁ、
X=Lcosθ+Mcos(θ+φ)+Ncos(θ+φ+Ψ)
Y=Lsinθ+Msin((θ+φ)+Nsin(θ+φ+Ψ)
みたいな感じで、LMNは適当に決めるとしても、角度のパラメータが3つあるんで、
もう1条件制約をかけないと決まらないケースが多発するだろうなぁ。
アームの長さを適当に決めろというなら、N=0にでもしてしまえば、
要はLとMと(原点と(X,Y)の距離)の三角形で角を求めろっていうだけの問題だから、
余弦定理でcosθは求まるかな。
それはインチキだというなら、
原点と(X,Y)の距離に応じてLの先端部分と(X,Y)までの距離が適当・・・
たとえば、(M+N)の半分になるような位置に位置づけることにして、
あとは、余弦定理で解けそうだけど。
よりコンピュータらしい力技でいくなら、三重ループで0から360度まで適当なステップ
(たとえば、5度おき)に回して、距離が目標位置に一番近くなった時の値の前後
(5度おきにとったなら前後5度分・・10度分だね)を1度とか0.1度とかのステップで
3重ループで回して、一番目標位置に近かったものを答えにする。 腕の長さ自由に決めていいならひとつ捨てて残り2つ同じ長さにすればカバーできる範囲同じで計算も簡単になる
元のお題でそもそもわざわざ関節3つ使う理由がない どうでもいいことを長々と議論するなあ
無視すりゃいいだろw 手先の位置というのが同定できない原因だったけど、位置と角度に変わったので大丈夫では? 関節角度の並びは二つに限られ、第一腕部第二腕部が直線に並ぶ時ひとつ、それ以外は二種類の並びに制限される。 https://imgur.com/a/Y5mxr55
こんな感じでは?
実線と点線の二つの腕の位置が有り得る。
あとは余弦定理を使えば全て解ける。 >>277 は、こいつに出された大学での課題。C/C++ スレで丸投げ指摘されて遁走。 お題: 「平面3リンクマニュピュレータの逆運動学」とは何か。日本語で説明せよ。 ロボット工学本の逆運動学の章に必ず載ってる問題。勿論解法も載ってる。
>>277のアホはその解法のプログラミング(の課題)が出来ず、ここの連中にやらせようとしてる。 作りゃいいと言われてもあまりにも意味わかんない
関節3つつけるのは当然手先の向きとかに制約がないと意味ない
じゃあ無視して関節2つでと言われたら面白くもなんともない ときどき言ってたり、やったりするがいまだ解答不明
平面上に円をおき、その円周上の整数点がちょうどn個となる円の最小半径は?
具体的にn=47でもわからない 全てnに対して円が存在するかどうかはわかってるの?
n=0, n=1の時は円は存在するが最小値は存在しない
n≧2の時は円が存在するなら最小値も存在する 1970年から2369年までの間で
カレンダーの曜日が365(366)日同じパターンで出て来る年をグループ分けして
グループが全部で何個あるか(たぶん即答7個だけど365と366を違うものとするので7以上)と
各グループに何年が属するかを出力するプログラム >>276
とりあえず1だけ。
perl -ne 'print int($_ * 100000) . " / 100000\n"' >>310 bat
@echo off &setlocal enabledelayedexpansion
for /L %%y in (1970,1,2369) do set /a "fL=^!(%%y%%4)^^^!(%%y%%100)|^!(%%y%%400), g=%%y-1, w=(%%y+g/4-g/100+g/400)%%7" &for /f %%i in ("!fL!!w!") do set "p%%i=!p%%i!,%%y"
set n=0
for %%w in (日,月,火,水,木,金,土) do set "w!n!=%%w"&set /a n+=1
set L0=平
set L1=閏
echo 閏有無 1月1日の曜日 : 西暦年
for /L %%a in (0,1,1) do for /L %%b in (0,1,6) do echo !L%%a!年 !w%%b!曜日 : !p%%a%%b:~1!
pause &exit /b 曜日判定は開始年のみで残りは閏年判定とインクリメントだけで良かったね >>316
ぶ、ぶんすうにはなっているとおもうんだ >>306
ちょっとやってみたけど奇数のものは見つけにくい
47ともなると相当大きくなりそう x^4+y^4+z^4=a^4
が成り立つ値
x,y,z,a
を求めよ。 >>310 octave
https://ideone.com/Db3vpP
year = @(y) cell2mat(arrayfun(@(m) {calendar(y, m)'(:)}, 1:12));
years = @(ys) cell2mat(arrayfun(@(y) {year(y)(:)'}, ys)');
ys = 1970:2369;
[c, ~, ic] = unique(years(ys), 'rows');
c, arrayfun(@(uic) {mat2str(ys(ic == uic))}, unique(ic)) >>306
n=2〜10、とりあえず値だけ
1/2、5/(3√2)、1/√2、25/(3√2)、5/2、(25√221)/(11√2)、√(5/2)、65/(3√2)、25/2 "最小"である事を数学的に証明出来なければ最小であるとは言えないと思うのだが最小である証明って出来るの?
証明方法あるなら是非教えて頂きたいのだがちょっとスレチかなぁ? この問題の場合は
可能性を総当たりでつぶしていく方法があるから
計算機科学的にいえば「証明可能」だと思う
現実的な時間で解が求まるかどうかはまた別の話 いやいや連続体濃度の可能性を総当たりできるわけないじゃん 特定の3点を通る円は1個だから
上限があれば有限個の検索で済む [0,1)×[0,1)に中心があり半径が801125/√72=94413.486...の円に入る円の格子点の数はおよそ2.8×10^10個
そこから3つ選んでルーブ回すとループの回数は2.1×10^31回
1秒で10^10回ループ回せたとして10^20秒の桁
何兆年もかかる 総当たりじゃないうまい方法を考えなさい
ってのがこのスレ的な話題なんじゃない? 数学の人には渋い顔されるだろうけど
コンピュータだったらまずは総当たり作ってみてそこから改良してくの全然ありだと思う お題:
(1) 数当てゲームを作成せよ。コンピュータ側は1〜100の自然数をランダムに選び、ユーザ側は、当たるまで繰り返し数を選ぶ。コンピュータは当たれば「当たり!」、外れれば「それより大きいです」か「それより小さいです」を出力する。
(2) そのゲームに、ユーザー側としてAIが介入可能な入出力インターフェースを追加せよ。出力: 数、入力: コンピュータからのメッセージ。
(3) 二分探索アルゴリズムによって、数当てゲームのAIを完成せよ。 X^2 + Y^2 = N の整数解は、Nの素因数分解からわりと簡単に求められる
X = cx +a , Y = cy + b として、拡大縮小+中心移動したとき解個数がどのように変化するのか、わかればいいのだが
N = 2^(n0)・p1^(n1 - 1)・p2^(n2 - 1)・・・・・(pi ≡1 mod 4)と素因数分解されたとすると 解個数は 4 ・ n1 ・ n2 ・・・・・
X^2 + Y^2 = (X + iY)(X - iY)と、 4k+1型素数はたとえば5 = (2+i)(2-i)のように分解できることから最初の式の解も具体的に求められる たとえば >>329の右辺の数 801125 = 5^3×13×17×29 なので
a=1+2i、 b=2+3i、 c=1+4i、 d=2+5iとおくと 5=a~a (~aは複素共役)等になる。
X^2 +Y^2 = 801125^2 の解個数は756=4*7*3*3*3
z=a^i (~a)^(6-i)とおくと、z~z = 5^6 等から複素数の積の計算して解も求まる >>344
それで中心と半径が与えられたときのってる格子点の数が簡単に求められたとしても、“最小のR”を求めるのにそこまで役に立つわけやないやろ
中心が( -a/N, -b/N ), 半径√Rとして格子点が満たすべき方程式は
( Nx + a )^2 + ( Nx + b )^2 = N^2R
だから求める格子点の個数は方程式
u^2 + v^2 = N^2R, ‥@
u ≡ a ( mod N ), v ≡ b ( mod N )‥A
を満たす(u,v)の数になる
となると格子点の個数が例えば47とか抑えられててもN^2Rがの可能性が直ちに抑えられるわけではない、N^2Rがメチャクチャ大きくてもa,bをうまく選べば@、Aを満たす整数解はさほど多くなくなる可能性が出てくる
結局
「Rは小さい(最小値求めてるので)、@,Aを満たす整数解の個数は少ない(問題文で与えられてる条件)」
を科してもNの上限が直ちに決まったりはしない ( Nx + a )^2 + ( Ny + b )^2 = R の解個数は
X^2 + Y^2 = R の解個数以下ということでは? Rを十分大きくとって、X^2 + Y^2 = R の解個数が1万だとしても
( Nx + a )^2 + ( Ny + b )^2 = R で 1万以下のすべての解個数を作りだせるかというと間違ってそうだからな
>>346はそういうことだろ?
9997の解個数を得ようとすれば、X^2 + Y^2 = R の解個数はたとえば100億でないと無理かもしれない >>306
n=47の記録を更新したので載せとく
https://www.wolframalpha.com/input/?i2d=1&i=%28x-9%2F86%29%5E2%2B%28y-19%2F86%29%5E2%3D3929086318625%2F3698 お題
デスクトップにフォルダーA,B,C,D,E,F,G,H,I,J,K,Lがある。
D&Dで一つのフォルダーにまとめる。それぞれのフォルダーの
パス名の組み合わせは何通りあるか数える
(デスクトップはルートフォルダーみたいに表記してよい)
例:
A,Bの場合
1./A,/A/B
2./B,/B/A
A,B,Cの場合
1./A,/A/B,/A/C
2./A,/A/B,/A/B/C
3./A,/A/C,/A/C/B
4./B/A,/B,/B/C
5./B/C/A, B,/B/C
6./B/A,/B,/B/A/C
7./C/A,/C/B,/C
8./C/A,/C/A/B,/C
9./C/B/A,/C/B,/C
できれば、SQLのみを使ったもの >>350
違う
>>346で言ってるのは
問題 円上の格子点の数がちょうど47個である円の半径の最小値を求めよ
においてガウス整数環の因数分解の話を使って
問題 方程式
u^2 + v^2 = N^2R, ‥@
u ≡ a ( mod N ), v ≡ b ( mod N )‥A
を満たす(u,v)の数が47であるRの最小値を求めよ
という問題に還元したとして、“解の個数が47個”という条件を利用してもNの上限を決めることができないということ
なんかの理論なり勘なりでR<10万とか決まってもそれによってNの上限が決まったりはしない
N=一兆くらいで素因子を山のように持っててもa,bの選択によっては結局解の個数が47個という可能性が残るからガウス環の因数分解の理論など使っても“解の最小値”を調べるのに対して役に立たないと言ってる
大体この手の問題は
「なんでもいいから一つ構成する方法探せ」
と
「解の最小値求めよ」
では問題の性格がまるで違ってくる
単に解構成するだけなら色んな方面の色んな知識使って色々なアプローチが出てくるけど、「最小値求めよ」にした途端に本質的に総当たりしか無くなってしまうことが多い
まぁ計算機持ち出す場面って大概それしか方法がないときだからそれはそれでいいんだけど、このスレででかい数字で総当たりしか手がない問題で、とても個人所有のパソコンでは手が出ない領域の問題出されると途端にレス止まってドッチラケになってしまう もとの問題が解けるかは別にして、
任意の自然数a,b,cdに対して
(cx+a)^2 + (cy+b)^2 =d
の解個数を高速に求めるかが大事とおもうが お題: 重力加速度が1、空気抵抗が0.2、ボールの質量が1、ボールのベクトルが(x, y)=(3, 1)だったとき
高さHからボールを落とした場合のボールのバウンド回数を算出しなさい になるんじゃないの?(途中で書き込まれてしまった) >>360
そうそう、収束値を求めるのなら、バウンドしなくなる点の発射点からの距離にしたほうがいいのでは?
つゼノンのアキレスと亀のパラドックス てか空気抵抗が0.2って>>358の公式における何が0.2なん?
床での反射は完全弾性衝突なんやろな
空気抵抗は考えるのに衝突時のロス考えんのはなんだかなぁだけど、そこはともかく“空気抵抗0.2”をどう立式すればいいのか調べてもわからんのだけど >>357
エントロピーを考えさせたいのなら粘性とかの情報が足りないし、
打ち切り誤差を考えさせたいのなら精度の情報が足りない。 バウンド回数をHとgで表せっていう意味ならそれなりの数式は出るだろうけど
Hに関わらず無限大だろうってのが答え GUIでも何でも良いけどGUIはこちらで試す時に面倒。というかGUIだと多分やらないでソース眺めてフーンとなるぐらいかな。
ソースをコンパイル、実行して試せるようなサイトでGUIも出来るような所があれば良いんだけどね。そういう所ある? Pythonとか汎用性の高そうなGUIにしとけばいいかと、どれが一番いいかはしらんが 「Pythonとか汎用性の高そうなGUI」ここまでで大爆笑取れるな GUIライブラリのことだが
PythonでGUIライブラリはどれがおすすめ?
Tkinter
「Tkinter」はPythonに標準的に組み込まれているGUIライブラリです。
シンプルな文法と起動の速さが評価されており、Pythonにおけるもっとも基本的なGUIライブラリとしての立ち位置を築いています。
Kivy
近年、PythonのGUIライブラリの中でもっとも人気が高いものが「Kivy」です。
Kivyは、PythonでGUIのプログラムを作るためのオープンソースのライブラリで、Android、iOS、Linux、MacOS、Windowsなどの多くのOSで動作するため、汎用的に利用することが可能です。
KV言語というGUIのレイアウトを作成する言語が用意されており、直感的な記法で簡単にレイアウトを指定できるのが特徴です。
PyQt
「PyQt」は、Pythonを使ってGUIアプリケーションを作るためのフレームワークの1つです。
多くのソフトが作られており、比較的モダンな設計と、GUIのデザインを美しく作りやすいことが評価されています。
wxPython
「wxPython」は「wxWidgets」という「C++」と書かれたクロスプラットフォームGUIツールキットがあり、wxPythonはそのPythonバージョンです。
wxPythonは洗練されたAPIと豊富なライブラリが特徴であり、安定した動さが評価されています。
https://techplay.jp/column/552 こんなのがあったんだな
【Python】ttk:tkinterと比べた各ウィジェットの外観と機能面の違い
よりオシャレでモダンなGUIアプリを作成するならttkを使うのがお勧めです。
商用向けにGUIアプリの開発を進めている方や、社内向けアプリの場合でもユーザーインターフェースを良くしたい方は必ずチェックしておいてください。
https://office54.net/python/tkinter/tkinter-ttk-difference
Tkinterで使われるttkって?Tkinterとの違いを交えて徹底解説!?
今回はTkinterで使われるttkに関して、Tkinterとの違いを交えて徹底解説いたします。そもそもttkとは何か知りたい、Tkinterとttkの違いを学びたい方へおすすめです。
https://kuroro.blog/python/L9hqzwxZAx0soqSmI8zE/ お題:群論・有限群の分類
正の整数 n を与えたとき n を次数とする有限群のすべてを順次出力せよ。
ただしすでに出力された群の「準同型」は出力してはならない
n 次の有限群の要素は {k|k∈N, 1 <= k <= n} で表現せよ
この作業を「有限群の分類」と称するが、n をどこまで大きくできるか、各自の環境で試みよ
期限:2022年4月1日
準同型の定義は適切な参考書…@を参照さられたい、が、以下に概略を記述する
例えば 2 次の有限群として G1=
1 2
2 1
およびG2=
2 1
1 2
があるが、この二つは
「G1の 1 を 2 に置き換え、G1の 2 を 1 に置き換えて新たなG を作る」
というG1→G の変換 f によって G=G2 となる、すなわち f(G1)=G2
このような変換 f が存在するとき、G1、G2 は準同型であるという
@:「ガロア理論の頂を踏む」石井俊全/ベレ出版 2013年 GUI は皆が知っている、HTML, CSS, JavaScript だけ
それ以外は、ダメ >>380
Win32, Androidが抜けてる >>371
>>1に書いてあるサイトだとブラウザで開くだけで実行されるじゃない。 お題:GUIのカウントチャレンジを作れ
ボタンを押すとタイマーがスタート
もう一度ボタンを押すとタイマーがストップ
タイマーが10秒きっかりだったら「You win!」と表示
それ以外は「You lose!」と表示
現在のタイマーの値は表示しない お題: 与えられたn個の英単語群をすべて連結したクロスワードを作成できるか否かを判定せよ。クロスワードのサイズは自由とする。
入力例1: password, sword, animal, living
出力例1: すべて連結可能です。
入力例2: apple, zoo, grape
出力列2: 連結できない単語「zoo」があります。 >>390
お 前 は 内 野 じ ゃ ね え よ 現実の問題は競プロの問題よりも難しいかも知れない。教科書に書いてないような解決策を要求される。
競プロの問題が欲しいなら、ここよりも競プロへ行ってくれ。ここはそういう場所ではない。 数学の組合せの問題か。まず文字の組合せから。ある単語Xのすべての文字が他の単語にないならその単語Xは連結ではない(自明)。ひとつのセルは二重に交差点になることはできない(自明)。
ある単語Xが連結でなければ、単語X上の任意の文字位置は交差点にはならない。 次はクロスワードの組合せ。有限でサイズ変更可能な二次元配列によりクロスワードの盤を再現する。各要素はアルファベットか黒マスかハテナ(?)である。
文字の組合せにおいて最も接続数の多い単語を最初に盤の真ん中に置く。さらに単語の両端に黒マスを置く。次に接続数の多い単語と既に盤に置かれている単語の交差点を考えるわけだが、
交差点の位置により場合分けすると考えやすい。 そして配置のすべての組合せを再帰により網羅する。交差点が見つからない単語があれば失敗。というわけだ。コーディングに入ろう。 >>385
Kotlin
https://paiza.io/projects/Hq-JXeNo2ZQgGbLORbCJpA
GUI は java.awt ライブラリを使うように書いてある。
当然の事ながら、paiza.io のサイト上では動かない。
動かしたい人は IntelliJ Idea で Kotlin のプロジェクトを作ってソースコピペして実行させるか、
またはコマンドライン環境で kotlinc コマンドでコンパイルして kotlin コマンドで実行する。 交差点になり得るセルの位置を記録して可能ならばマイナス方向にもサイズを拡張すべきことがわかった。 document.querySelectorAll('span.name').forEach(e => {
if(e.innerText.indexOf('蟻人間') >= 0){
e.parentElement.parentElement.style.display = 'none';
}
}); >>378
これか…
ttps://math.jp/wiki/%E6%9C%89%E9%99%90%E7%BE%A4%E3%81%AE%E5%88%86%E9%A1%9E%28%E4%BD%8D%E6%95%B01~100%29
プログラム化する以前に、解法を理解・考えることが難しいお題だな >>404
銀行振込3000円でいいか? メールで連絡よろ。
katayama.hirofumi.mz@gmail.com どうせ
printf使うなstd::cout使え、だろう? 確かにここはstd::pairじゃない方がいい。
他には? ヘッダーオンリー・テンプレート使用はバイナリサイズが大きくなりがちだから避けるべき。それから? std::promiseを使うべき。だがやり方がわからん。 お題: 計算時間が予測できない時間のかかる計算について、複数スレッドを立ち上げていずれかのスレッドで答えがセットできたか、キャンセル操作があれば、スレッドを終了して可能ならば答えを取得する。スレッド開始と終了、答えに対してメッセージを出力せよ。
言語: C++11以降 std::threadとstd::promise使用。 お題で言語まで指定されんの?宿題スレに貼ってくれば もうすぐポッキーの日
[お題] 人口合計で1がらみの数字遊び
URLのページに都道府県別の人口が載っている。
URL: https://ideone.com/msZUeW
今回使用するのは、2020/10のデータ
同じ県は一回のみで、異なる県を 11 県選らぶ。
(単純な選び方は全部で 47C11 = 約174億通り)
選択した11県の人口合計を 111111 (11万1111) で割った時、
余りが 1111 になるのは何通りあるか?
また、その条件で(剰余でなく生の)のべ人口合計は何人か?
※一発正解問題、実行時間2秒程度。
※ちなみに 2015/10データだと 156561 通り(のべ 4656362060856 人) だった。 侍エンジニアリングつーサイトの講師やりませんか?というお誘いが来た。
下準備が結構必要っぽいのに時給は生徒と応対している時のみの2000円/hだそうだ。
結局時給1000円くらいやん。
ふざけとるわ。 生徒と応対して連絡先交換
あとは中抜き回避で青天井 >>417
回答者(>>418)が言うところの"遅い解法"ががほぼ想定解。
https://ideone.com/msZUeW 下部に追加記入
解法については、"部分和問題 数え上げ"でググって調べて
別解としては早い言語なら、さらに遅い"半分全列挙"でも間に合う。
(大雑把に(24*2^24)*2 <1億なので、c++で試したら1秒強だった) >>422見てなんで>>418が遅かったか分かった
無駄な掛算やってたからだった
配列の並び直したら4倍速くなった
https://ideone.com/vwPpAn お題:与えられたテキストの中のURLをすべて置き換える。
https://【...】
→
https://jump.5ch.net/?【...】 >>425
URLとなる文字列の定義も知らねえで糞みたいな問題出すなよダニ野郎 >>427
URLにマッチする正規表現使えばええやろ、チャチャとやれよ。 >>425 Perl5、たまにはお相手して進ぜよう。5chの仕様に従うと↓こうだと思うが…
$uri = 'https://www.google.com/search?client=firefox-b-e&q=%E8%9F%BB%E4%BA%BA%E9%96%93+%E3%83%8F%E3%82%B2';
use URI::Split qw(uri_split uri_join);
@a = uri_split($uri);
$a[1] = 'jump.5ch.net';
$a[2] = '/';
$a[3] = $uri;
print uri_join(@a), "\n"; ”2021”というフォルダがある
"2020"というフォルダもある
:
"1950"というフォルダもある
そしてそれぞれに"01"〜"12"のサブフォルダがあって
そしてそのそれぞれに"01"〜"31"というサブフォルダがあって
更に"00"〜"23"という・・・・
つまり、1時間ごとのフォルダがあって
そこには多くのファイルが詰まっている
そのファイルのタイムスタンプに変化があったら
「どこのファイルが書き換えられたぞ」と検出するプログラムを作りたい
片っ端からタイムスタンプを調べるしかないのか
これはファイルシステムの問題でしょうが
なんとか、前回調べてから変化があったか、短時間で検出できる方法はありませんか
ファイルに変化があったら、フォルダのタイムスタンプを変えてくれればいいんだけどね そういう検出機能はOSかハードウェアかについてなかったか 忘れたが NTFSの USN とは?
USN ジャーナルとは
NTFSのUSN機能とはNTFSボリュームに対しての変更の記録です。
Cドライブ、Dドライブ、Eドライブごとなど、ドライブごとに加えられた変更を記録したものです。
USNとはUpdate Sequence Number Journalの略称です。
主に以下の目的で使用されます。
・FRS(File Replication Service)によるファイル複製時の差分洗い出し。
・スナップショットバックアップ時の差分洗い出し。
・ウィルス対策ソフトによるファイル検査。
・インデックスサービス向け。
http://tooljp.com/qa/what-is-USN-36BE.html Ruby では、文字列の中から、URL を抜き出す関数が非推奨になった。
頻繁に規格が変わるからかな?
正規表現でも多分、何万行も掛かる。
作るのに10年ぐらい掛かるので、誰も作らない
今あるものでも、正しく判定されるかどうか、分からない >>430
5ch のバグで、
そのURL をプログラム板全体で見た時は、&q とつながっているのに、
個別のスレッドで見ると、&;q と、&の直後に、;が入って、
リンクが&までになってしまう >>433
ドライブごとに加えられた変更がログに保存されているとは知りませんでした
データドライブに分けているので、ログから探すのも速いかもしれません
ありがとうございました お題: JSON形式のテキストをXML形式のテキストに変換しなさい ideone って boost は include 出来るのか
codepad はずっと落ちてるな >>440
もう codepad はおしまい、codepad にアップした私のコードも永遠に失われました… 短いもんだから直接打ち込んじゃったんじゃないかな。
そして消滅。 >>442
デスクトップで書いたものはローカルのどこかに残っている(と思う)
ノートで書いたものはノートPCごとどこかにいってしまった…
いや、まあ、最初から書き捨てでしたけど、惜しいと思うものも多少ありますね いま
http://codepad.org/
復活してない?
サンプルURLとして前々スレの過去の回答
プログラミングのお題スレ Part18
http://mevius.5ch.net/test/read.cgi/tech/1594702426/174
>174 名前:デフォルトの名無しさん[] 投稿日:2020/08/04(火) 19:24:17.96 ID:lImhU2CT
> >>173
> あーアホだったw
> タブ消去の仕様だとPythonだと分けわからんことになるなw
> ↓貼り直した
> http://codepad.org/BWRzr8fW
> ※会員未登録の為、一定期間後に自動消去
も表示されたし。
保持しておきたいcodeがあれば今のうちにsaveするか、
Internet archiveに記録しとくのも手だよ。 お題が出なくなったので全く実用性がないと思われる頭の体操的なやつを一つ。
お題: 与えられた数値の配列の 1 になっているビットをカウントする。
例えばC言語で unsigned char の配列とか使って、処理する関数はポインタで渡された所から何要素みたいに指定されるようにする。。
それで例えば 0xde, 0x96 (11011110, 10010110) なら答えは 10。 お題: 日付が与えられるので4月ならtrueを出力しなさい
< 2021/04/01
> true
< 04/01
> true
< 2021/04
> true
< 2021/05/01
> false >>446
最適なコードが環境に大きく依存するからなあ
シフトの速度とか専用命令有無とか
あまり良いお題じゃないし荒れそう 日 21/04/01
米 04/01/21
欧 01/04/21
年2桁で入り乱れたら更にわけわかめ 逆に、年2桁の時は、
その数値で年月日が特定できるか問題があった。
02 12 29 --> 12年02月29日 と 29年02月12日 の2通りがある
02 13 29 --> 13年02月29日はないので、29年02月13日のみ >>452
特定できるかどうかだけならいいが……
反例を間違った 02 12 29 3通りある そういえば食品の賞味期限がどう読んだらいいか分からなかったことがあったなあ。
11/02/13
2013年2月11日なのか、それとも2013年11月2日なのか、まさか2011年2月13日だったりしたらどうしよう、みたいな。
普通に輸入されているものなら日本語ラベルがあるから分かるだろうけど、友達が現地のお土産屋で買ってきた
お菓子みたいなものだとそのまんまだったりする(まあ、アメリカかアメリカ以外かで考えればだいたいは大丈夫
なのかも知れないが)。
日本の元号みたいな独自年号まで使われているのが混在していたら余計に分からないよな。今の日本では
あまりないだろうけど昭和の頃はあったような気がするなあ。 >>446 Ruby
p [0b1110, 0b1010111].reduce(0){|s, n| s + n.digits(2).count(1)}
# => 8 >>446
C
https://paiza.io/projects/YQ8ORfELqUt1xkKqmysViQ
入力を配列に入れてからカウントさせている。(uint32_t 型の配列)
カウント部分は>>456に似てる。しかし最初に引くのは思いつかなかった。 >>448
Perl
https://paiza.io/projects/o4VTdU_kK-S8T4G5HvkIRw
年月日順で年がある場合は必ず4桁でなければならない。
4だけでも4月に判定されるが、まあいいか。 >>446
Haskell
sumCntBits = id
. length
. filter odd
. ( >>= ( takeWhile ( /= 0 ) . iterate ( flip div 2 ) ) )
main = do
print $ sumCntBits [ 0xde, 0x96 ]
print $ sumCntBits [ 0x12345, 0x6789a,0xbcdef ]
----
10
32 >>446 rust
https://ideone.com/9yFeU3
fn main() {
let f = |a: &[u32]| a.iter().map(|n| n.count_ones()).sum::<u32>();
println!("{}", f(&[0xde, 0x96]));
} >>446
Kotlin
https://paiza.io/projects/7hQyycMNf5nuV5HcBg6iQg
普通に作るのは出尽くした感があるのでちょっと変わったやり方にした。
入力から Int の List を作り、それを 1 ビットづつの Boolean のリスト(というか Iterator) にしてから true のみをカウントしている。 >>446 octave
https://ideone.com/BNjv3I
f = @(a) sum(dec2bin(a)(:) - '0');
f([0xde 0x96]) もうすぐ、2022年
[お題] 2022は"x3y1数"(造語)?
以下の二つを満たす正の整数を"x3y1数"と呼ぶ
・各桁の数値が、二種類のみの数字からなる
・上の二数の個数比は 3:1
該当例:1112, 2212, 2022, 32222223, 999999999888
ダメな例:2213(種類), 4444(種類), 33232(個数比), 0222(先頭ゼロ)
整数A,Bが与えられる。A以上B以下の"x3y1数"はいくつあるか?
制約: 0 < A <= B <= 10^18
1) 2923 3311 --> 8
該当は [2999, 3000, 3033, 3111, 3133, 3222, 3233, 3303]
2) 2021 77977796 --> 2022
3) 3000 6666566566566555 --> ?
4) 999999999889 1000000000000110 --> ?
5) 1 1000000000000000000 --> ?
※実行時間:上の5問をクエリーとし全部を2秒程度 お題:自分用double-double演算ライブラリ
最低限、通常のdoubleとの相互変換は可能であること。それに加えて、
1)加減算
2)加減算 + 乗算
3)四則演算
数字が大きいもの程上級者向けです。
演算子のオーバーロードなどは任意とします。 >>466
double の演算を自分で実装するという意味ですか?
sum(double, double)
diff(double, double)
mul(double, double)
div(double, double)
を自分で実装する、という話でいいですか?
あと double のフォーマットは IEEE754 でいいですか? お題: テキストを読み込みそれをクリスマスツリーにして出力しなさい
クリスマスツリーに見えれば形は自由とする
入力
本日は良いお日柄ですね
出力
___本
__日は
_良いお
日柄です
___ね >>470
文字コードは何を仮定すればいいのですか? >>471
UTF-8
日本語の扱いが難しい言語では英語のみの対応も良しとする 二種類のみの数字からなり個数比は 3:1
引数の範囲は 1-10^18 = 1001-9999999999998888(16桁)
以下の範囲に限られる
1000-9998
1000 0001-9999 9988
1000 0000 0011-9999 9999 9888
1000 0000 0000 0111-9999 9999 9999 8888
「二種類のみの数字からなる」を計算式で判定する方法ある? 1([\d&&[^1]])\1{2} 最上位桁が比1
111[\d&&[^1]],11[\d&&[^1]]1,1[\d&&[^1]]11 最上位桁が比3
一般化 (\d)(?!\1)(\d)\2{2}|(\d)\1{2}(?!\1)\d|(\d)\1(?!\1)\d\1|(\d)(?!\1)\d\1{2}
4桁ならこれでもいいけど8桁以上になると複雑化するし
地道に数えるより 4の倍数桁,数字2種,比率1:3 のルールで生成する方が速そう >>463
https://ideone.com/xTDtME
想定解は、事前に4,8,12,16桁の"x3y1"数を全列挙して作っておく。
プログラミング的には、各言語の順列や組合せを使って、作れるだろう。
(想定解例では組合せは2ベキとpopcountから作っている)
「それは、全列挙数が小さいとわかっているからでは..?」に対して
プログラムで出すのなら、雑に最も大きい16桁が4つあるとして計算
10P2 * 16C4 * 4 < 70万 なので、全列挙可能
まじめに計算すると 10P2 * (16C4 + 12C3 + 8C4 + 4C1) * 9 /10 = 167,832
列挙済みならば、クエリー5件程度なら、16.7万*5 チェックで間に合う。
ちゃんとやるなら、ソートして二分探索すれば、数千単位のクエリーに対応できる。
(想定解例では後者でやっている) >>463 c
https://ideone.com/bmYThw
・Ruby版の移植
・組み合わせの列挙方法は丸パクリ
・Ralph William Gosper Jr. 氏に感謝 >>465
惜しい
>>468
IEEE754の倍精度(binary64)を整数演算で実装するのではありません。
binary64を二つ使って、上位53ビットと下位53ビットとで106ビットの浮動小数に見立てたものが
double-double演算です。
Wikipediaの「四倍精度浮動小数点数」の項に少しだけ載ってますです。 > Wikipediaの「四倍精度浮動小数点数」の項に少しだけ載ってますです。
一般的な用語じゃないんだから初めからこれ書いとけよ 128ビットあるのに106ビットしか使わんの?
もったいなくね? >>485
もったいなよ
ただ、既存のdouble計算リソースが使えるという利点がある double-doubleはFMAがFMAとして役立つ数少ない用途だな
積和じゃなくて3個の和のfused命令も欲しくなる お題: 1つの整数から規則性のある複数の整数を生成せよ
生成される整数は再現性がなければならない >>489
function f: Integer -> Integer{
return 0;
} >>489 Ruby
def sequence( seed, number )
srand( seed )
Array.new( number ){ rand(100) }
end
p sequence( 123, 10 ) #=> [66, 92, 98, 17, 83, 57, 86, 97, 96, 47]
p sequence( 123, 10 ) #=> [66, 92, 98, 17, 83, 57, 86, 97, 96, 47] >>486 ocaml
https://ideone.com/NzF5f2
let f =
let rec fib = function
0 -> 0 | 1 -> 1 | n -> fib (n - 1) + fib (n - 2)
and aux acc = function
-1 -> acc | m -> aux (fib m :: acc) (m - 1)
in aux [] >>489 ocaml
https://ideone.com/NzF5f2
let f =
let rec fib = function
0 -> 0 | 1 -> 1 | n -> fib (n - 1) + fib (n - 2)
and aux acc = function
-1 -> acc | m -> aux (fib m :: acc) (m - 1)
in aux [] >>488
Juliaのhypot()でもFMA使ってますです >>494
ただ積と和を1命令にして高速化しただけの積和
の効果だけじゃなくて
融合(fused)の効果が効く用途の話 [お題] 平均が2022な素数数列
5000以下のあい異なる素数で、加算平均がぴったり 2022 の数列を作る。
数列の項数(要素数)を最大化する、最大はいくつか。
最大数と数列を表示する。
※解答例(もちろん4以上がある)
4
[1747, 2099, 2113, 2129]
※実行時間は素数生成を含めて、4秒以内
最大な数列は複数通りあると思うので、一例のみで 答えは595個?
計算機+理詰めで595個っぽいけど 「Log4j」2.17.0にもリモートコード実行の脆弱性 >>497 c++
https://ideone.com/UBbtWd
"素数-2022"で適当に最大化DPすれば、合計0相当の所に答えが……。
個人的には他の復元方法を見たかった。
pythonは遅いのであきらめた(高速化方法を知らない)
>>498
595個でした。手作業でできるレベルなら…… オレがやったのは
p[n]をn番目の素数、
P[n]をn番目までの素数の集合、
s[n]をP[n]の和
a=2022として
まず素数のn元集合で平均が1番小さくなるのはP[n]でその平均値s[n]/nは単調増加だからs[n]/n>aの時元数n以上の解はない
s[596]/596>aは計算機で確認
なので595元集合で解があればそれが最大
s[595]/595<aなのでP[595]はダメ
s[596]-595a = 1205525 - 1203090 = 2435は素数ではないのでP[597]から一個消すのはダメ
s[597]-595a = 1209898 - 1203090 = 6808 はp597=4373以下の素数2459,4349の和で表すことができる
よってP[597]\{2459,4349}の和は595aとなる
完全に全自動で探索するプログラムも作れそうだけど答え出たらもういいかなと手が止まってしまった 何個取り除いたら平均2022にできるか考えると
確か74個だったけな?
JavaScriptで1秒もかかんなかったか 表示時間除いたら1秒かかってないな
探索はほぼ一回でボトムまで到達して
発見された 可能と不可能が極端に分かれている問題なので
事前のブランチカットだけが重要なヘンなお題w
>>352はまだ未解決 千葉興業銀行、4月から副業解禁 県内地銀初
南都銀行、4月から行員の副業制度導入 ウェブ制作など
荘内銀、行員の副業・兼業解禁
フィデアHD、副業・兼業制度を導入
横浜銀行、10月から従業員の副業・兼業解禁
鹿児島銀、副業解禁を検討 九州FGと肥後銀は10月導入
肥後銀行が副業制度導入へ 多様な働き方認める 10月から >>497
haskell
https://ideone.com/GLMXRV
>>501のアルゴリズムを自動化してみた
すげー簡単なところでどハマりして半日かかった
まだ解なしの場合とかの動作チェックとかしてないけどもうどうでもいい ちなみに出力形式は
(最大個数、最大素数の通し番号、最大素数までの間での素数で除外する素数のリスト)
try 67%5
→(5,8,[2,3,5])
は最初の個数8個[2,3,5,7,11,13,17,19]から[2,3,5]を抜いた[7,11,13,17,19]の5個が平均が67/5になる素数のリストの一つ
長さ
6以上はない お題:
xをゼロ以上の浮動小数点数として
2^floor(log2(x))
の計算。ただし、x == 0 の場合はゼロとする。 >>481
>binary64を二つ使って、上位53ビットと下位53ビットとで106ビットの浮動小数に見立てたものが
>double-double演算です。
現在検討中ですが、binary64 中には仮数部に使用できるビット幅は 52 bits しかありません。つまりケチビット表現です
53+53 とのことですが、実際には 53 + 52 = 105 しか格納できないのではないでしょうか? >>510
上位の±1/2ulp相当が下位になります >>509
perlでワンライナー。入力は標準入力からする。
perl -MPOSIX -ne 'chomp;$n=$_?2**floor(log($_)/log(2)):0;print "$n\n"'
でも、こんなので良いの?自分ではほとんど何も考えてないんだが。
(log2()がないからlog(n)/log(2)でやるって所ぐらいしか工夫がない) >>509 C++
環境+コンパイルオプション依存 little endian, double = 64bit, long double = 128bit
double fl2( double x )
{
*( (uint64_t*) &x ) &= 0xFFF0000000000000LLU;
return x;
}
long double fl2( long double x )
{
*( (__uint128_t*) &x ) &= *( (__uint128_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF" );
return x;
} 2進表記した時に先頭のビット以外を0にすればいいだけだがワンライナーで書ける気がしない 先頭のビットというより「(存在するなら)0じゃない一番位の大きいビット」だな ビットいじる方法だと、非正規化数が0に、NaNが無限大になる
そういえば、無限大やNaNはどうすればいいのだろうか Python
でかい値だとうまくいかないやつ
def foo(x):
_c = x * float(2 ** 52 + 1)
_xh = c - (c - x)
_if xh > x: return(xh * 0.5)
_return(xh)
>>516
深く考えてませんでしたw >>512
log2(n)をlog(n)/log(2)で近似した際の「誤差」
(ぴったり整数値になって欲しいのにそれよりも数ulp小さい値になったとか、
数ulp大きくて、ぎりぎりfloor()で切り捨てられる筈の値が1大きくなったとか)
を補償するコードが欲しい。 そこは性能とトレードオフになるしかない気はする
例えばfloor( log 32 / log2 ) = 5が使用上の動作だけど
log 32/log2 =4.9999999999978 × 10^0が返されて答えが4になってしまうのを避けるならおそらく大きすぎる場合は無視していいから
res' = floor( log x / log2 )
if (2^res'* 1.5) < x
// (1.5倍でも届かないなら不当な丸め誤差が出たと判断)
then res = res' + 1
else res = res'
とかちょっと汚い書き方するしかない希ガス なんか変なこと書いた
res' = floor( log x / log2 )
if 2^res' < x
then res = res' + 1
else res = res'
やな
res'の算出で丸め誤差は-1までと仮定して補正する
しかしもちろんlog(x)とか2^nハード的にFPUとかで高速にやってくれてしかも整数演算は誤差なしでやってくれる前提
この辺は高級言語プログラマレベルの話でなんとかなるもんではない
やるならアセンブリ言語レベルでやるしかない >>509 C
https://ideone.com/5kDuzA
非正規化数、NaN、無限大とかはそのまま返すようにした
やり方は>>513と変わらない いまどきのコンパイラなら、frexp()やldexp()をいい塩梅に最適化してくれるのだろうか?
from math import frexp, ldexp
def foo(x):
_m, e = frexp(x)
_if m == 0: return 0.0
_return ldexp(0.5, e) >>509
またPerlでワンライナー。
perl -ne 'chomp;if($_<=0){print"0\n"}else{for(my$i=0;;$i++){if((1<<$i)>$_){print 1<<($i-1),"\n";last}}}'
今度は計算している内容から考えて結果が同じになるようにした。浮動小数点演算をしていない。
また整数値が何ビットであるかも考慮しておらず、Perlの整数が32bitだった場合は2^32以上の値を入力されたら多分うまく動かない。
当然64bitだったら2^64以上の値の入力で多分うまく動かない。 >>522の修正
from math import frexp, ldexp
def foo(x): return 0.0 if x == 0 else ldexp(0.5, frexp(x)[1]) >>509
またまたPerlでワンライナー。
perl -MPOSIX -ne 'chomp;if($_==0.0){print"0\n"}else{print ldexp(0.5,(frexp($_))[1]),"\n"}'
これは>>524の真似(ていうかやってること同じ)。 >>511
それは答えになっていないかと
質問を変えます。下位側の指数部も意味を持つようにインプリメントするべきでしょうか? >>526
先人の実装例だと、
上位 + 下位 = double doubleの数値
という事になってますね(上位側の指数が決まると、下位側の指数も決まる)。
tps://na-inet.jp/na/qd_ja.pdf
勿論、そう実装しないのもあり。 >>527
となると、
>>510
>binary64 中には仮数部に使用できるビット幅は 52 bits しかありません
よって下位側指数部無視なら 53bit + 52 bit = 105bit の実装となりますが?
下位側指数部有意ならば、下位側にもケチビットを適用できますが、今度は仮数部が 106 ビットとはいいきれなくなりますね(数によって変わる) >>527
失礼 pdf が紹介されていることを見落としていました、精査します、紹介ありがとうございます お題: 1より小さい実数を1以上2より下にせよ
< 0.123
> 1.23
< 0.0000123
> 1.23 お題: 質量0.2 kgの直方体の物体が摩擦のある水平な床の上にある。
物体の初速を右向きの0.5 [m/s]とすると、物体は転倒することなく底面が床に接したまま、約x秒後に自然停止した。xより垂直抗力F[N]と動摩擦係数kを求めよ。
重力加速度を 9.8 [m/s^2]とする。 お題(HTML/JavaScript): ユーザがGoogleから訪問した場合は、3秒間ブラウザを停止させるようにせよ。 お題: -1 < n < 1 の実数nを-10 < m < 10の実数m(ただし1桁目が0を除く)に桁上げせよ(>>530の改良)
< 0.123
> 1.23
< -0.00056
> -5.6 >>536
perl
ワンライナー。以下はbashのコマンドラインから実行して試した。
入力は標準入力で一つづつ改行する。
perl -ne 'chomp;$n=$_;while(int(abs($n))<1){$n*=10}print "$n\n";'
やってることは見ての通り殆ど何も考えず10倍し続けるだけ。 もうすぐ22日、今年は "22/2/22"といつもより多め
[お題] 偶数ゾロ目
URLのページに都道府県別の人口が載っている。
URL: https://ideone.com/2w86hj
今回使用するのは、2020/10のデータ
同じ県は一回のみで、異なる県を 22 県選らぶ。
(単純な選び方は全部で NCR(47, 22) = 約14.8兆通り)
整数A,Bが与えられる(1<=A<=B<=1億)
選択した22県の人口合計が A以上B以下となるのは何通りか?
1) 44444444 44444444 --> 214209
2) 22222222 44444444 --> ?
3) 44444444 66666666 --> ?
※上の三問を全部で5秒程度で
想定解はあるが、もっとスマートな方法がありそう
「またか」と思った人、以前の問題とは想定解はかなり違う >>539
旬だと思って出題
https://ideone.com/2w86hj 下部に追加
半分全列挙 + 尺取り法
早い言語でしかできない解答例でした >>543
乙
時間取れなくてやれてないが季節感あるネタ好き お題: RustかGoでバイナリーサーチを実装してください お題: トライ木を使ってサジェスト機能を実装してください
$ prog
> w
world
would
will
wish
辞書は任意の大きさとする
入力は英語、または日本語とする >>545
なんかHaskellってGHCのオプションに-O2とか指定すれば結構早くなった記憶がある
あとListじゃなくVector使うとか お題 バッタの大冒険
a(1),a(2),⋯,a(n) を相異なる正の整数とし、M を n-1個の正の整数からなる集合と
する。また、M は s=a(1)+a(2)+⋯+a(n) を含まない。数直線の 0 の地点にいるバッタが
数直線の正の向きに n 回ジャンプする。 n 回のジャンプの距離は a(1),a(2),⋯,a(n) の並べ替えである。このとき並べ替えをうまく選べば、バッタがM の要素に対応するn-1点に一度も着地しないようにできることを証明せよ。
↑数学オリンピックの問題
もちろん証明はどうでもよろしい
お題は(ジャンプの幅のリスト、禁止点のリスト)から禁止点を交わしていく飛ぶ順を見つけるプログラムを実装せよです
入力
([3,5,8],[5,10])
出力
[8,5,3] #着地するのは8,13,16で禁止点5,10をかわしている
入力
([5,6,8,10,13,15],[2,18,24,29,45])
出力
[15,13,10,8,6,5] #着地するのは15,28,38,46,51で全ての禁止点をかわしている
入力
([3,26,30,32,36,44,53,62,68,82],[36,40,59,79,92,126,178,233,394])
出力
[82,68,62,53,44,36,32,30,26,3] #同文 2番目の例着地するのは
15,28,38,46,52,57
ですた >>549
は数学の問題としても面白いけどココはプログラムのお題スレなのでアルゴリズムそのもの考えるのは嫌な人のためにアルゴリズムひとつ紹介しておきます
以下の探索で線形オーダーで解を見つけられます
自分で考えたい人は無視してください
以下aを最大ジャンプとします
a=a(n)としておく
(A)一回目を最大ジャンプで飛んだとして最初の禁止点に届かないかギリギリ届くとき
一回目のジャンプが最大ジャンプしたと想定して残りのn-1回ジャンプで最初の禁止点を無視したn-2個の禁止点を交わしたジャンプ順b(1)...b(n-1)を作る
この順番でとんて行って最初に最初の禁止点をi回目に超えたとする
解のジャンプとして
b(1),b(2),...,b(i-1),a,b(i),...,b(n)
とすると全ての禁止点をかわしている
(B) 一回目を最大ジャンプで飛んだとすると最初の禁止点を超えて、しかも禁止点以外に着地できるとき
一回目のジャンプが最大ジャンプしたと想定して残りのn-1回ジャンプで最初の禁止点を無視したn-2個の禁止点を交わしたジャンプ順b(1)...b(n-1)を作る
解のジャンプとして
a,b(1),...,b(n-1)
とすると全ての禁止点をかわしている
(C) 一回目を最大ジャンプで飛んだとすると最初の禁止点を超えるが別の禁止点に着地してしまうとき
この状況だとa(1)〜a(n-1)のいずれかのジャンプa(i)でa(i)もa+a(i)のどちらも禁止点でないものが取れる( (∵) 全てのi:1〜n-1でa(i)かa+a(i)のどちらかが禁止点とするとこれだけでn-1個の禁止点全部尽くされてしまうけど、この中には最初の仮定である“一回目aで飛んだら禁止点”はこの中には出てこないので矛盾 )
それをa(n-1)としよう
最小の2回をa(n-1),a(n)と飛んだとしてこの時点で最初の禁止点と最初a(n)だと踏んでしまう禁止点の2点は超えているので残りの禁止点はn-3個以下しか残ってない
そこでa(1)〜a(n-2)をうまく並べ替えれば全部かわすことができる 問題がよくわからなくて解く以前の所で停止。そしてやる気消滅。 説明不足で申し訳ない
問題文は数オリの紹介サイトからそのままコピペしてきたのでわかりにくかったかもしれない
1番最初の例
([3,5,8],[5,10])
だとバッタは最初x=0の地点にいて+3,+5,+8のジャンプでx=16の地点に行こうとしている
しかしx=5,x=10の地点は着地禁止地点で着地できない
飛び方は全部で6通りあるがその中から禁止地点に着地しないものを選んで下さいという問題
3回くらいなら総当たりで答え出せるけどジャンプ10回禁止地点9ヶ所だと全数検索すると10!通り必要になって実用にならない
どうしますかというテーマだけどもちろん数学オリンピックの問題なので中々自分で答え出すのは難しい
でここは数学板ではないので同じ数オリサイトにあった解答を転記して「こんなアルゴリズムが知られているけどアルゴリズムをインプリメントできますか」がお題です お題: C/C++でスレッドセーフなstrtok関数を作れ
設計は各自で考えること 高度IT人材、富士通は最大年収3500万円へ
AI人材の獲得に超本気 NECが新人事制度を9人に適用、富士通は最大年収3500万円へ
【年収3500万円も】富士通、「ジョブ型」人事制度を導入 幹部社員から 高度IT人材
来年度から副業解禁 人材多様化へ―大同生命次期社長
第一生命HD、副業解禁 約1万5000人対象
第一生命HD、副業解禁 1万5000人対象―大手生保初
IHI、国内8000人の副業解禁 重厚長大企業も転機
IHI、社外兼業を解禁 社内副業もルール化 >>554
C言語
https://paiza.io/projects/xS5GP9DAU6KzhDsM6x7M6g
strtok_r() を strtok_r2() の名前にして自分で実装した。
strsep() も paiza.io のCのライブラリには何故かなかったので strsep2() にして自分で実装した。 思い付きでお題考えてみた
検証してないんだけどどう?
お題: ランダムな部屋を移動する最短距離を求める
行列がある
任意の横幅Wと高さHで表現される部屋がランダムに1 <= N <= 5個生成される
この部屋を部屋内の座標からランダムに選択した別の部屋の部屋内の座標まで通路を作る
通路の要素は斜めには生成されず横と縦に生成される
通路はランダムに1つの部屋から0 <= R <= 3生成される
各部屋を各通路で繋げ任意の部屋Aと任意の部屋Bを選択する
このときAからBまでの最短経路を求めよ さらに、閑古鳥をよびよせるか
[お題] 多倍長では無理!?
整数 S, T が与えられる。(1 <= S <= T <= 400万)
S以上T以下の(連続する)整数の最小公倍数(LCM)をもとめる
答えは, 1000000007(10億7)の余りで出力
1) 6 8 --> 168
6,7,8 の最小公倍数、LCM(6, 7)= 42 --> LCM(42, 8)= 168
2) 10 30 --> 89546497
剰余前は、2329089562800
3) 2567890 3456789 --> ?
4) 1 4000000 --> ? √T以下の素数列挙
各数を素因数分解して各素数の指数の最大を求める
10億7の剰余で上の乗算を行う >>562
https://ideone.com/O9PQbN
想定解としては、(他の人同様)
求める最小公倍数を素因数分解した形に作るイメージ
400万以下の"素数及び素数べき乗"は、高々28.3万件。
S以上T以下で、素数べき乗が割り切れるかどうかチェックしている。
(方法は T/素数べき乗 > (S-1)/素数べき乗 ならあると, O(1)判定)
ボトルネックは素数を求める部分なので、手抜きしている。
余談)
・4)を多倍長で計算すると173万桁だった(一分程度ででた)
・10^9+7 ではなく、下9桁を出力だと、4)は 0になる(5^9が範囲にあるから) お題: 文字列が整数だったらINT, 実数だったらFLOATと出力するプログラムを作れ
変換できない場合はINVALIDと出力せよ
123 -> INT
1,234 -> INT
1.23 -> FLOAT
a123 -> INVALID
12abc -> INVALID
1.23.435 -> INVALID >>570 Ruby
f = -> s {
case s
when /\A(?:0|[1-9]\d*)\z|\A(?:[1-9]\d{0,2})(?:,\d{3})*\z/
:INT
when /\A(?:0?|[1-9]\d*)\.\d+\z/
:FLOAT
else
:INVALID
end
}
%w[123 1,234 1.23 a123 12abc 1.23.435 .142857 1. 0 01 1,234,567 1234,567].each{|s|
puts '%s -> %s' % [s, f[s]]
}
# =>
123 -> INT
1,234 -> INT
1.23 -> FLOAT
a123 -> INVALID
12abc -> INVALID
1.23.435 -> INVALID
.142857 -> FLOAT
1. -> INVALID
0 -> INT
01 -> INVALID
1,234,567 -> INT
1234,567 -> INVALID >>570
こう言うのは仕様をちゃんと提示してよ
123.
123.0
12,34
はどうなればいいのか そんな文句みたいな言い方するほどか?
他の問題に比べたらケースちゃんと提示してる方だし
そういうのは想定してないってなんとなくわかるだろ
競プロならちゃんと定義必要だろうけど >>574
> そういうのは想定してないってなんとなくわかるだろ
お題なんだから想定しろよ
でないとそのケースはそうじゃなくてこうすべきとか言う奴が出てきて荒れる元だし 黙って実装して自分なりの仕様を提示するテストケースを追加して提出した>>572の勝利 久々に出題者現れたかと思ったらフルボッコでかわいそう もっと気楽にやれよ
普段ゴミみたいな案件で意を汲み取れず怒られ理不尽な思いしてる底辺コーダーが叩き行為で鬱憤晴らししたいんだろうけどさw
仕様の隙間をどうするかをこういったところで一般共通認識得るのは有意義
その議論を「荒れる」と捉えるのは違うでしょ お題: 文字列が整数だったらINT, 実数だったらFLOATと出力するプログラムを作れ
変換できない場合はINVALIDと出力せよ
version 1.0.1
123 -> INT
1,234 -> INT
1.23 -> FLOAT
a123 -> INVALID
12abc -> INVALID
1.23.435 -> INVALID
.142857 -> FLOAT
1. -> INVALID
0 -> INT
01 -> INVALID
1,234,567 -> INT
1234,567 -> INVALID
123.0 -> FLOAT .142857がOKで1.がNG
なんか違和感
どの言語の流儀?
具体例だけに頼らないで
定義っぽく書けない?
----
[整数部]、[整数部].[小数部]、.[小数部] のいずれかの形
[整数部] : 0123456789の列1文字以上、もしくはこれを3桁ずつ,で区切った形
2桁以上の場合は先頭は0ではない
[小数部] : 0123456789の列1文字以上
....
こんな感じ 0.DDD を .DDD と表記するのは欧米では情報系に限らず日常よく見られること
CSSもperlも昔のrubyも対応してたんじゃなかったかな >>584
> 仕様の隙間をどうするかをこういったところで一般共通認識得るのは有意義
だからその一般認識がないから揉めるって話
既に違和感と言い出す奴とか欧米ガーとか流儀ガーとか言い出してるだろ
エディタの宗教戦争と同じで正解なんてないんだからお題を作った奴が決めないと収拾つかんよ >>590
1から10まで教えてもらえないとなんもできないのかよ
エディタ宗教戦争を例に出してるけどあんなのにガチに捉えてるバカはお前くらいだ お題: 文字列が整数だったらINT, 実数だったらFLOATと出力するプログラムを作れ
変換できない場合はINVALIDと出力せよ
BNFは↓とする
INT: digit+ お題: 文字列が整数だったらINT, 実数だったらFLOATと出力するプログラムを作れ
変換できない場合はINVALIDと出力せよ
BNFは↓とする
version 1.0.2
int: digits
float: digits ('.' digits)?
digits: digit+
digit: [0-9]+ >>591
ガチに捉えるもなにも今でもやってるだろw >>593
カンマとかはなくなってるけど、仕様変更ですか?
あと
digits: [0-9]+
にしてdigitをやめるか
digit: [0-9]
にした方がいいかと思いますよ >>595
お題: 文字列が整数だったらINT, 実数だったらFLOATと出力するプログラムを作れ
変換できない場合はINVALIDと出力せよ
BNFは↓とする
version 1.0.3
int: comma_digit
float: comma_digit '.' digit* | '.' digit*
comma_digit: digit_123 { ( ','? digit_3 ) }*
digit_3: digit digit digit
digit_123: digit digit? digit?
digit: [0-9]
どや?完璧だろこのBNF
これで文句ないな >>596
"1."、"01"、"1234,567" が INVALID になりませんし "." だけでも FLOAT になるのはどうかと思いますが... >>597
お題: 文字列が整数だったらINT, 実数だったらFLOATと出力するプログラムを作れ
変換できない場合はINVALIDと出力せよ
BNFは↓とする
version 1.0.4
int: comma_digit
float: comma_digit '.' digit_09+ | '.' digit_09+
comma_digit: digit_123 { ( ','? digit_3 ) }*
digit_3: digit_09 digit_09 digit_09
digit_123: digit_19 digit_09? digit_09?
digit_19: [1-9]
digit_09: [0-9]
どや? >>598
指摘された箇所すら直せないとかどう見ても向いてないからやめたら?
> "1234,567" が INVALID になりませんし >>600
version 1.0.5
int: comma_digit | normal_digit
float: ( comma_digit | normal_digit ) '.' digit_09+ | '.' digit_09+
comma_digit: digit_123 { ',' digit_3 }*
normal_digit: digit_19 digit_09*
digit_3: digit_09 digit_09 digit_09
digit_123: digit_19 digit_09? digit_09?
digit_19: [1-9]
digit_09: [0-9]
ていうか1234,567にはならんはずだぞ >>600
version 1.0.6
int: comma_digit | normal_digit
float: ( comma_digit | normal_digit ) '.' digit_09+ | '.' digit_09+
comma_digit: digit_123 { ',' digit_3 }*
normal_digit: ( digit_19 digit_09+ ) | digit_09
digit_3: digit_09 digit_09 digit_09
digit_123: digit_19 digit_09? digit_09?
digit_19: [1-9]
digit_09: [0-9]
おら!完璧だろ! >>604
> ていうか1234,567にはならんはずだぞ
しれっと変えといてさすがにそれは恥ずかしいな
>>598> comma_digit: digit_123 { ( ','? digit_3 ) }*
>> 604 > comma_digit: digit_123 { ',' digit_3 }*
>>605
まあ、よしとしてやろう 問題を解かずに出題の形式美に必死になるなんて、このスレ的にどうなのよ? char buf[64];
fgets(buf, 64, stdin);
char *endptr;
strtol(buf, &endptr, 10);
if (*endptr == 0) {
puts("INT");
return;
}
strtod(buf, &endptr);
if (*endptr == 0) {
puts("FLOAT");
return;
}
puts("INVALID"); お題
非負整数xが16進数表記で与えられる。xのビットu~lの範囲を逆順にした値を出力せよ。
[入力]
x u l
[例]
0x80 7 0
=> 0x1 (8bit全体をreverse)
0xABCD 11 4
=> 0xA3DD (真ん中8bitをreverse, 0xBC=0b10111100 -> 0b00111101=0x3D)
0x2 99 1
=> 0x8000000000000000000000000 (2の99乗) >>610 Ruby
f = -> (*a) {_, e, s = a.map(&:to_i); '0x%X' % a[0].hex.digits(2).concat(Array.new(e, 0)).tap{_1[s..e] = _1[s..e].reverse}.reverse.reduce{|s, i| 2 * s + i}}
['0x80 7 0', '0xABCD 11 4', '0x2 99 1'].each{puts '%s -> %s' % [_1, f[*_1.split]]}
# =>
0x80 7 0 -> 0x1
0xABCD 11 4 -> 0xA3DD
0x2 99 1 -> 0x8000000000000000000000000 お題:数字をミラーリングせよ
入力 < 123
出力 > 123321
reverse系メソッドを使わなかったら加点とする >>615 Ruby
$><<(a=gets.scan /./)*'';$><<$a while$a=a.pop
-*- input -*-
123
-*- output -*-
123321 >>615
Java
static String mirror(String src) {
var dest = new char[src.length() * 2];
var a = src.toCharArray();
for (var i = 0; i < a.length; i++) {
dest[i] = a[i];
dest[dest.length - 1 - i] = a[i];
}
return new String(dest);
} >>615
派生お題: 文字列処理を使わずに与えられた整数を回文にせよ。 >>615 octave
https://ideone.com/Aa9KII
f = @(a) a([1:end end:-1:1]);
f('123') 俺も考えてみたけど調べても回分数のシグマ使わない一般式は無いみたいだな >>615 JavaScript
const mirror = (n, c, ...args) => c === null ? (answer => 0 <= n && answer <= Number.MAX_SAFE_INTEGER ? answer : RangeError(`${n} is invalid.`))(args.reduce((s, d) => s * 10 + d, n)) : c == undefined ? mirror(Number.parseInt(n), Number.parseInt(n), ...args) : mirror(n, c < 10 ? null : Math.floor(c / 10), ...args, c % 10);
// test
for (const [n] of [[-1, 'x'], [0, 'o'], [1, 'o'], [12345678, 'o'], [123456789, 'x'], [123.456, 'o (123321)']]) {
const answer = mirror(n);
console[answer instanceof RangeError ? 'error' : 'log'](answer);
} >>615 Perl5
use feature qw{say signatures}; no warnings 'experimental';
sub f($i, @a) { $i and @a ? (f(@a), $i) : $i }
@a = split'',123;
say @a, f(@a);
実行結果
~ $ perl 20_615_mirror.pl
123321 >>615 Perl5 (リスト処理版)
@a = split '', 123;
print @a, map{@a[$#a - $_]} 0..$#a;
実行結果
~ $ perl 20_615_mirror_list.pl
123321 >>615 ocaml
https://ideone.com/FFhxw9
let f s =
let csc c s = Char.escaped c ^ s ^ Char.escaped c in
let rec aux t = function 0 -> t | n -> aux (csc s.[n - 1] t) (n - 1)
in aux "" @@ String.length s
let () = print_endline @@ f "123" >>615 ocaml
https://ideone.com/6YqGis
let f s = s ^ String.init (String.length s) (fun i -> s.[String.length s - 1 - i])
let () = print_endline @@ f "123" gnuWin32を基本使っています。
で行のソートなのですが、各行の末尾から逆向きの文字でソートって出来ませんか
たとえば
aaaaCB
bbbBA
cccccDB
とかあったとき、これを
bbbBA
aaaaCB
cccccDB
としたいのです。
もし難しそうであれば、各行を反転、つまり
abcde
を
edcba
とする方法でもいいです。 >>630
Java
Arrays.sort(a, (left, right) -> {
var l = left.length() - 1;
var r = right.length() - 1;
while (l > -1 && r > -1) {
var c = Character.compare(left.charAt(l), right.charAt(r));
if (c != 0) {
return c;
}
l--;
r--;
}
if (l > -1) {
return 1;
}
if (r > -1) {
return -1;
}
return 0;
}); >>630 Perl5が使える環境であれば…
~ $ cat 20_630_isort.pl
chomp (@a = <>);
sub f {join '', reverse split'', $_[0]}
print "$_\n" for sort{f($a) cmp f($b)} @a;
~ $ cat input.txt
aaaaCB
bbbBA
cccccDB
~ $ perl 20_630_isort.pl < input.txt > output.txt
~ $ cat output.txt
bbbBA
aaaaCB
cccccDB >>630 ruby
https://ideone.com/lQz0m2
f = ->(a) {a.sort_by &:reverse}
p f.(%w(aaaaCB bbbBA cccccDB))
>>630 octave
https://ideone.com/AUCxr3
function i = sorti(varargin), [~, i] = sort(varargin{:}); end
f = @(a) a(sorti(cellfun(@(s) {flip(s)}, a)));
f({'aaaaCB' 'bbbBA' 'cccccDB'}) >>632
しまった、これだとsortの計算量 N・log N に応じた回数、比較のための文字列逆転 sub f の呼出しが起き、
データの行数が多いと遅いな >>630 Perl5、計算量の抑制に配慮したバージョンと実行例
$ cat 20_630_isort2.pl
print $_->[0] for sort{$a->[1] cmp $b->[1]} map{[$_, scalar reverse $_]} <>;
$ cat input.txt
aaaaCB
bbbBA
cccccDB
$ perl 20_630_isort2.pl input.txt > output.txt
$ cat output.txt
bbbBA
aaaaCB
cccccDB >>635
これ各行の行末の改行まで含めてreverseしてsortキーとするので、
もし入力ファイルの最後の行に改行が欠けていて無かったらsort結果がおかしくなる。
そのような万が一の場合に対してもrubstさも持たすならこうか
chomp(@a = <>);
print "$$_[0]\n" for sort{$$a[1] cmp $$b[1]} map{[$_, scalar reverse]} @a; >>630
Linux 等の UNIX 系 OS で rev コマンドと sort コマンドが使える環境ならシェルのコマンドラインからこう入力するとできる。
(入力文字列は input.txt に入っているとして)。
rev input.txt | sort | rev
Windows の環境でやる場合は互換性のあるコマンドを利用するか、または Cygwin や WSL や WSL2 等の UNIX 互換環境の中でコマンドラインから実行できる。 >>610 Perl5
use Bit::Vector;
$v = Bit::Vector->new(101);
for (<DATA>) {
($h, $s, $e) = /0x(\S+) (\S+) (\S+)/;
$v->from_Hex("$h");
$v->Interval_Reverse($e, $s);
($r) = $v->to_Hex() =~ /0+(\w+)/;
print "$_ => 0x$r\n";
}
__DATA__
0x80 7 0
0xABCD 11 4
0x2 99 1
※インデントを見易くするため全角スペースに置換しています
実行結果
$ perl 20_610_rebitfld.pl
0x80 7 0
=> 0x1
0xABCD 11 4
=> 0xA3DD
0x2 99 1
=> 0x8000000000000000000000000 >>638
Linux環境ではrevというのがあるのですね
gnuWin32は全部揃ってないのですね。なんだかなあ
rev以外でもLinuxにあってgnuWin32にはないのがあるのかな
rev、自分で作ろうかな >>630 ocaml
https://ideone.com/zdWLHX
let rev s = String.init (String.length s) (fun i -> s.[String.length s - 1 - i])
let (<<) f g x = f (g x)
let f = List.map (fun (r, s) -> s) << List.sort compare << List.map (fun s -> (rev s, s))
let () = List.iter print_endline @@ f ["aaaaCB"; "bbbBA"; "cccccDB"]; >>640
gnuWin32 用の rev.exe が欲しいなら、書き起こさなくともutil-linux-ng パッケージに入っていると思うが…
util-linux-ng for Windows
http://gnuwin32.sourceforge.net/packages/util-linux-ng.htm
Util-Linux contains miscellaneous utilities:
col: filter reverse line feeds from input
colcrt: filter nroff output for CRT previewing
colrm: remove columns from a file
ddate: converts Gregorian dates to Discordian dates
getopt: parse command options (enhanced)
hexdump: ascii, decimal, hexadecimal, octal dump
line: read one line
rename: rename files
rev: reverse lines of a file or files ←
tailf: follow the growth of a log file
whereis: locate the binary, source, and manual page files for a command
作りたいというなら類似のsampleソースはゴマンと転がっとるし
C reverse string rev.c strrev - Google 検索
https://www.google.com/search?q=C+reverse+string+rev.c+strrev
C program to reverse a string | Programming Simplified
https://www.programmingsimplified.com/c-program-reverse-string
C_69 C Program to Reverse a String | with strrev() and without strrev() function - YouTube
https://www.youtube.com/watch?v=530jWnBMD2M
… 好きにしんしゃい Cygwin などに使われている util-linux パッケージのオリジナルな現行のソースは
GitHub - util-linux/util-linux
https://github.com/util-linux/util-linux
かな。そのうち rev.c のソースは
util-linux/rev.c at master ・ util-linux/util-linux ・ GitHub
https://github.com/util-linux/util-linux/blob/master/text-utils/rev.c
ちな util-linux パッケージは2006年に fork したとき名前に -ng をつけて util-linux-ng になったが
2010年に util-linux に名前を戻している。
cf.)
util-linux - Wikipedia
https://en.wikipedia.org/wiki/Util-linux
ついつい、調べ物をしてしまった…orz >>642
linuxのrevでやってみました。ところが、全角日本語はやはりダメですね
なので、AHK >>642
linuxのrevでやってみました。ところが、全角日本語はやはりダメですね
なので、AHKで自作で作ってみました
rev input.txt | sort | rev
で問題なく動きました >>645
環境変数 LANG の設定の問題とか?
こっちでは日本語での rev できたよ。
CentOS 7 で bash で LANG=ja_JP.UTF-8 の状態。そこに Windows から TeraTerm で ssh ログインして試したらできた。
$ echo $LANG
ja_JP.UTF-8
$ ( echo 見城徹 ; echo 箕輪厚介 ; echo ガーシー ; echo 木原誠二官房副長官 ) | rev
徹城見
介厚輪箕
ーシーガ
官長副房官二誠原木
$ お題
0~2がランダムに8個入力されます
8個の数字を:で結合して出力してください
0が連続する場合は連続する0を::に置換してください
0の連続を::に置換できるのは1回のみです
0の連続が複数存在する場合は長い方を置換してください
長さが同じ場合は先頭の方を置換してください
1個の0は置換してはいけません
例
0, 0, 0, 1, 2, 1, 2, 2 → ::1:2:1:2:2
2, 1, 2, 0, 0, 0, 1, 1 → 2:1:2::1:1
1, 1, 2, 2, 1, 0, 0, 0 → 1:1:2:2:1::
2, 0, 0, 2, 0, 0, 0, 2 → 2:0:0:2::2
1, 0, 0, 1, 2, 0, 0, 2 → 1::1:2:0:0:2
0, 1, 2, 0, 1, 1, 0, 2 → 0:1:2:0:1:1:0:2 >>648 Ruby
f = -> s { x = s.gsub(', ', ?:); y = x.scan(/0(?::0)+/).max&.count(?0) || 0; x.sub(/:?0(:0){#{y - 1}}+:?/, '::') }
[
'0, 0, 0, 1, 2, 1, 2, 2',
'2, 1, 2, 0, 0, 0, 1, 1',
'1, 1, 2, 2, 1, 0, 0, 0',
'2, 0, 0, 2, 0, 0, 0, 2',
'1, 0, 0, 1, 2, 0, 0, 2',
'0, 1, 2, 0, 1, 1, 0, 2'
].each{ |s| puts '%s -> %s' % [s, f[s]] }
# =>
0, 0, 0, 1, 2, 1, 2, 2 -> ::1:2:1:2:2
2, 1, 2, 0, 0, 0, 1, 1 -> 2:1:2::1:1
1, 1, 2, 2, 1, 0, 0, 0 -> 1:1:2:2:1::
2, 0, 0, 2, 0, 0, 0, 2 -> 2:0:0:2::2
1, 0, 0, 1, 2, 0, 0, 2 -> 1::1:2:0:0:2
0, 1, 2, 0, 1, 1, 0, 2 -> 0:1:2:0:1:1:0:2 正規表現のreplace一個で行けそうと思ったけど最長マッチみたいなの無理なのか 拡張正規表現の中にはチューリング完全なものもあるけどね そうか
単純に s/0{$n}/::/;
を連射して増やしていくだけでいいんだな
最後に成功したのを返す感じで >>648 octave
https://ideone.com/3Udpgi
function s = f(a)
c = diff(find([1 diff(a) 1]));
e = cumsum(c);
b = e - c + 1;
n = arrayfun(@(i) a(i), e);
[~, i] = max(c.*(n == 0));
s = arrayfun(@(n) {int2str(n)}, a);
if (1 < c(i))
s(b(i):e(i)) = ':';
end
s = regexprep(strjoin(s, ':'), ':::+', '::');
end 結果同じだけど若干の整理可能だった
n = arrayfun(@(i) a(i), e);
[~, i] = max(c.*(n == 0));
↓
[~, i] = max(c.*(a(e) == 0)); >>648 Perl5
use List::Util 'max';
for (<DATA>) {
%h = map{length($_) => $_} /(,?0(?:,0)+,?)/g;
$n = max keys %h;
chomp($i = $_);
s/$h{$n}/::/ if $n;
s/,/:/g;
print "$i => $_";
}
__DATA__
0,0,0,1,2,1,2,2
2,1,2,0,0,0,1,1
1,1,2,2,1,0,0,0
2,0,0,2,0,0,0,2
1,0,0,1,2,0,0,2
0,1,2,0,1,1,0,2
※見易くするためインデントを全角スペースに置換してあります。
実行結果
$ perl 20_648.pl
0,0,0,1,2,1,2,2 => ::1:2:1:2:2
2,1,2,0,0,0,1,1 => 2:1:2::1:1
1,1,2,2,1,0,0,0 => 1:1:2:2:1::
2,0,0,2,0,0,0,2 => 2:0:0:2::2
1,0,0,1,2,0,0,2 => 1::1:2:0:0:2
0,1,2,0,1,1,0,2 => 0:1:2:0:1:1:0:2 >>648 octave
https://ideone.com/Uyr9cV
・[1, 1, 1, 1, 1, 1, 1, 1]のとき正しくなかったのを修正 全部0の時に :: にならなかったので>>661はちょっと修正した。 お題
1~37からランダムに重複なく7つの数を選び出して小さい順にソートしてください
それを5つ出力してください
例
[2, 4, 9, 13, 20, 29, 36]
[1, 4, 12, 13, 15, 20, 33]
[1, 3, 5, 7, 11, 20, 24]
[3, 7, 8, 21, 27, 33, 34]
[1, 2, 14, 23, 26, 35, 36] >>666 Ruby
[*1..37].sample(7).sort
# => [4, 8, 15, 20, 24, 26, 37] >>668
投稿後一部訂正、n の範囲チェックを追加
負数は弾く
(check-type n (integer 0 *))
上限はシーケンスの長さ
(loop repeat n
↓
(loop (min n (length sequence)) >>666 octave
https://ideone.com/Iml4xq
f = @() sort(randperm(37, 7));
cell2mat(arrayfun(@(~) {f()}, (1:5)')) >>666
Kotlin script
repeat(5) { println((1..37).toList().shuffled().slice(0..6).sorted()) }
実行例
[6, 7, 9, 10, 16, 22, 27]
[2, 8, 9, 11, 16, 32, 33]
[11, 13, 18, 25, 26, 30, 34]
[2, 3, 12, 14, 20, 27, 37]
[7, 13, 14, 19, 27, 30, 35] >>671はこれでも同じだった (toList() 抜き)。
repeat(5) { println((1..37).shuffled().slice(0..6).sorted()) } >>666 Perl5
use List::Util 'shuffle';
@a = 1..37;
$" = ', ';
print "@{[(shuffle@a)[0..6]]}\n"
for 1..5;
実行結果
$ perl 20_666_shuffle1-37x5.pl
3, 2, 10, 25, 9, 23, 27
35, 6, 30, 8, 37, 29, 36
20, 29, 19, 18, 37, 21, 23
12, 30, 29, 7, 3, 31, 26
34, 12, 1, 14, 28, 2, 21 >>666 Perl5、>>673 は sort するの忘れてた…orz
use List::Util 'shuffle';
@a = 1..37;
$" = ', ';
print "@{[sort{$a <=> $b} ((shuffle @a)[0..6])]}\n" for 1..5;
実行結果
$ perl 20_666_shuffle1-37x5.pl
5, 9, 22, 28, 30, 32, 36
1, 2, 7, 21, 23, 26, 36
6, 14, 15, 16, 19, 26, 28
13, 14, 15, 16, 30, 35, 37
1, 3, 10, 20, 27, 29, 30 >>666 ocaml
https://ideone.com/3UpGQV
let seq b e =
let rec aux acc n =
if n < b then acc else aux (n :: acc) (pred n)
in aux [] e
let (<<) f g x = f (g x)
let take n =
let rec aux acc n = function [] -> acc | x :: xs ->
if n <= 0 then acc else aux (x :: acc) (pred n) xs
in List.rev << aux [] n
let shuffle =
List.map snd << List.sort compare << List.map (fun x -> (Random.bits (), x))
let string_of_ints =
Printf.sprintf "[%s]" << String.concat "; " << List.map string_of_int
let f () = string_of_ints @@ List.sort compare @@ take 7 @@ shuffle @@ seq 1 37
let () = Random.self_init ();
List.iter (print_endline << f << ignore) @@ seq 1 5 (1) aとbからなる文字列があるときその中で部分文字列bbaが最初に完成する文字数を求める
ab -> 0
aaa -> 0
bba -> 3
bbba -> 4
babbab -> 5
bbabbaa -> 3
(2) ちょうど50文字のaとbからなる全ての並びの文字列の内
50文字目(最後)にbbaが完成するのは何通りあるか?
長さ3文字で3文字目に完成するのはbbaのひとつだけ
長さ4文字で4文字目に完成するのはabbaとbbbaの二通り >>678 Ruby
(1)
%w[ab aaa bba bbba babbab bbabbaa].each do |s|
i = s =~ /bba\K/
puts '%s -> %d' % [s, i ? i + 3 : 0]
end
# =>
ab -> 0
aaa -> 0
bba -> 3
bbba -> 4
babbab -> 5
bbabbaa -> 3
(2)
f = -> (n, a=[0, 0, 1]) {return a[n] if n<a.size; a<<f[n-1,a]+f[n-2,a]+1;a.last}
p f[49] # => 12586269024 行列の掛け算を実装せよ
二次正方行列 A=((1 -2) (2 3)), B = ((-2 1)(3 -1)) について
AB, BA を求めよ
可能であれば二次正方行列以外の行列についても対応せよ
実装の細かい点については出題者は指定しないので良きに計らって結構。
<お願い>
行列の積において結合則成立の証明を教えてください >>678 c
https://ideone.com/hlf3c3
・(1)(2)ともに自信なし(たぶんお題の意味わかってない) >>680 Ruby Matrixクラス不使用
def product(a, b)
[
[a[0][0] * b[0][0] + a[0][1] * b[1][0], a[0][0] * b[0][1] + a[0][1] * b[1][1]],
[a[1][0] * b[0][0] + a[1][1] * b[1][0], a[1][0] * b[0][1] + a[1][1] * b[1][1]],
]
end
p product([[1, -2], [2, 3]], [[-2, 1], [3, -1]])
# => [[-8, 3], [5, -1]]
# 夏休みの宿題は自分でやりましょう >>682
>二次正方行列以外の行列についても対応せよ >>680 >>683
def product(a, b)
m = a.first.size
c = Array.new(a.size){[]}
a.size.times do |i|
b.first.size.times do |j|
c[j][i] = m.times.map{|k| a[k][i] * b[j][k]}.sum
end
end
c
end
p product([[1, -2], [2, 3]], [[-2, 1], [3, -1]])
# => [[0, 7], [1, -9]]
p product([[-2, 1], [3, -1]], [[1, -2], [2, 3]])
# => [[-8, 3], [5, -1]] NxMのデータをどう定義するか だけの問題だな
毎回悩む 下は後悔してるタイプ
(defparameter *position-IO*
(loop
for input in '(7 8 9
4 5 6
1 2 3)
for pos below 9
collect (cons input pos))) >>679
どういう頭してたらその法則性に気づくん??? >>678
Kotlin script
(1)
listOf("ab","aaa","bba","bbba","babbab","bbabbaa").forEach { print("$it ->"); it.indexOf("bba").let { if (it >= 0) println(it + 3) else println(0) } }
実行時の出力
ab ->0
aaa ->0
bba ->3
bbba ->4
babbab ->5
bbabbaa ->3
(2)
println(1L shl (50 - 3))
実行時の出力
140737488355328 (2)
出題の仕方が間違ってた
最後に唯一のbbaが現れるパターンと書くべきだった
自分の中ではこのことしか考えてなかったから
>>679さんは汲んでくれたようで、早さにも驚いたけど なるほど, 再帰的に構成すればいいのか
aから始まる時: a + x[n-1]
baから始まる時: ba + x[n-2]
bbから始まる時: bb...bba >>686
そういう漸化式は普通に受験で良くでてくる >>688
え?言ってる意味がわからない。どういうこと? >>695
末尾以外にbbaが現れる文字列を除外するってことじゃろう bbaが最後に達成されるんじゃなければ2^47計算するだけのなんの面白みもない問題になるからそこで気付く人は気づくよね ついでに50文字で今度は最後がbbaじゃなくて
bbbのときとbabのときのそれぞれのパターン数を求めるって問題 お題:分割されている顔文字を結合して表示してください
1つの顔文字は半角4字で構成。左右対称。2字ずつ半分に分割されてシャッフルされている
出力する顔文字の順番は自由とする
入力 < ^)(^
出力 > (^^)
入力 < ^)(-(^-)(vv)
出力 > (^^)(--)(vv) お題:ナンプレ(数独)における「縦9マス(列)」「横9マス(行)」「3x3マス」をそれぞれ表示する方法を示してください
便宜的に、ナンプレのマスには左上から右へ、右下に向かい0〜80までの数値を入れます。
0 1 2 3 4 5 6 7 8
...
...............80
左から1列目の9マスは 途中送信してしまった
お題:ナンプレ(数独)における「縦9マス(列)」「横9マス(行)」「3x3マス」のマスをそれぞれ表示する方法を示してください
※便宜的に、ナンプレのマスには左上から右へ、右下に向かい0〜80までの数値を入れます。
0 1 2 3 4 5 6 7 8
...
...............80
例えば左から1列目の9マスは
[0 9 18 27 36 45 54 63 72]
となります。
等差を利用して数字だけを表示するものは不可です。
マスに何の値が入っていても表示できるようにしてください。 >>701 JavaScript
> ['^)(^', '^)(-(^-)(vv)', '<)(>'].map((R => input => Array.from(input.matchAll(/\((.)/g)).reduce((output, [l, r]) => output + l + R(r) + ')', ''))(r => r == '>' ? '<' : r))
[ '(^^)', '(--)(^^)(vv)', '(><)' ] >>701 Ruby
f = -> str do
loop do
str.sub!(/(.)\)(.*)\(\1/, '(\1\1)\2') ||
str.sub!(/\((.)(.+)\1\)/, '(\1\1)\2') ||
(break str)
end
end
%w[ ^)(^ ^)(-(^-)(vv) (-(^-)^)].each do |s|
puts '%s -> %s' % [s, f[s.b]]
end
# =>
^)(^ -> (^^)
^)(-(^-)(vv) -> (^^)(--)(vv)
(-(^-)^) -> (--)(^^) >>703 Ruby
PLACEHOLDER = [*0..80]
field = 9.times.reduce([]) do |s, y|
s << 9.times.map do |x|
PLACEHOLDER[9 * y + x]
end
end
puts field.map{|r| r.map{'%02d' % _1}.join}
# =>
000102030405060708
091011121314151617
181920212223242526
272829303132333435
363738394041424344
454647484950515253
545556575859606162
636465666768697071
727374757677787980 >>703 お題をよく読んでいなかった >>709の続き
row = -> (n, field) {field[n]}
column = -> (n, field) {field.map{_1[n]}}
block = -> (n, field) {9.times.map{n * 3 + n / 3 * 18 + _1 + _1 / 3 * 6}.map{field.flatten[_1]}}
puts row[7, field].join(?,)
# => 63,64,65,66,67,68,69,70,71
puts column[7, field].join($/)
# =>
7
16
25
34
43
52
61
70
79
puts block[7, field].each_slice(3).map{_1.join(?,)}.join($/)
# =>
57,58,59
66,67,68
75,76,77 お題
<user>:<group>の数
<user>:<group>
<user>:<point>の数
<user>:<point>
が入力されます
<group>ごとに<point>を集計して<group>順に
<group>:<point>を出力してください
例)
// 入力
6
UserE:GroupC
UserD:GroupA
UserB:GroupC
UserA:GroupC
UserC:GroupB
UserF:GroupB
6
UserB:3
UserF:2
UserD:5
UserC:13
UserE:11
UserA:7
// 出力
GroupA:5
GroupB:15
GroupC:21 なんで数を入力してるんだ?
後の情報であきらかではないか
まさかグループ名が整数でも良いと考えている? >>712 Ruby
g, p = str.split(/^\d+$/)[1, 2].map{_1.strip.each_line.map{|s| s.chomp.split(?:)}.to_h}
puts g.reduce(Hash.new(0)){|h, (k, v)| h[v] += p[k].to_i; h}.sort.map{_1.join(?:)}
# =>
GroupA:5
GroupB:15
GroupC:21 // >>712 Node.js
import readline from 'node:readline';
const rl = readline.createInterface({input: process.stdin, output: process.stdout});
const all = [/* {user, group, point}, ... */];
let usergroup = false;
rl.on('line', line => {
line = line.trim();
if (line) {
if (/^\d+$/.test(line)) {
usergroup = !usergroup;
} else if (usergroup) {
const {groups} = line.match(/^(?<user>[^:]+):(?<group>[^:]+)$/);
all.push(groups);
} else {
const {groups: {user, point}} = line.match(/^(?<user>[^:]+):(?<point>\d+)$/);
Object.defineProperty(all.find(_ => _.user == user), 'point', {value: Number(point), enumerable: true});
}
} else {
rl.close();
}
});
rl.on('close', () => {
for (const [group, point] of Object.entries(all.reduce((gp, {group, point}) => {gp[group] = (gp[group] ?? 0) + point; return gp;}, {})).sort(([a], [b]) => a < b ? -1 : 1)) {
console.log(`${group}:${point}`);
}
}); >>712 Perl5
use feature qw{say signatures}; no warnings "experimental::signatures";
sub ($n, @a) {
$h{$$_[0]} = $$_[1] for map{[/(\w+)/g]} @_[1..$n];
sub ($m, @) {
$g{$h{$$_[0]}} += $$_[1] for map{[/(\w+)/g]} @_[1..$m];
}->(@a[$n..$#a]);
say "$_:$g{$_}" for sort keys %g;
}->(<>);
※見易くするためインデントを全角スペースに置換してあります。
実行結果:
https://ideone.com/GxsRSY >>712
<group>順にって、何を元にして group の順序を決めるの?
入力された順?それだと例の入力のように GroupC, GroupA, GroupC の順で来ている場合はどうするの? <group>毎という事だと思う
サンプル見るとgroup名か集計したpointの昇順かも知れないけどそこはどうとでもなりそうだし >>713
実際にここでも数字を使っている例が出て来てるからわかると思うけど
競プロなんかではよくあるフォーマットだよ お題:Hello, World!を出力中にプログラムを強制終了せよ
Hello, World!が完全に出力されたらGAME OVERとする >>724 Ruby
Thread.new{'Hello, World!'.each_char{|c| print c; sleep 0.01}; raise 'GAME OVER'}
Thread.new{exit}
# =>
Hello, World! >>725 訂正
Thread.new{'Hello, World!'.each_char{|c| print c; sleep 0.01}; raise 'GAME OVER'}
Thread.new{exit!}
# => H >>724 c
https://ideone.com/k8R7TU
・>>729 どう見ても正常終了です。本当にありがとうございました。
・子プロセスの強制終了を見届けてから自分自身も強制終了 >>724
その強制終了って人間が Ctrl + C を押すなどしてやるという意味?
間に合わずに全部出力し切った場合は GAME OVER 出すということ? >>732
強制終了→exit(0)などでプログラム的に終了させる
GAME OVER→お題の達成失敗 54.144.0.0/12といったどこかで見たことあるような形式の文字列を入力すると
^(?!(54.144.|54.145.|54.146.|54.147.|54.148.|54.149.|54.150.|54.151.|54.152.|54.153.|54.154.|54.155.|54.156.|54.157.|54.158.|54.159.))
といったいい感じの文字列が標準出力に出力されるやつ、誰か作れますか?
例の他にも54.208.0.0/13 54.216.0.0/14 54.192.0.0/12 54.160.0.0/11 54.220.0.0/15といった似た感じの文字列が入力され
やはりいい感じに処理された別の文字列が出力されます
できればライセンスはゼロ条項BSDライセンスでお願いします フワっとした頭の中にしか定義されてない案件なんて誰もこなせないぞ
本人以外は >>734 JavaScript
function _734(ip_range) {
const result = [];
const as = ip_range.split(/\D/).map(_ => Number(_));
const m = as.at(-1);
const q = Math.floor(m / 8);
const r = m % 8;
const e = 8 - r;
const l = as[q].toString(2).padStart(8, '0').slice(0, r);
for (let i = 0, sup = 2 ** e; i < sup; i++) {
as.splice(q, 1, Number.parseInt(l + i.toString(2).padStart(e, '0'), 2));
result.push(as.slice(0, q + 1));
}
return '^(?!(' + result.map(_ => `${_.join('\\.')}${q < 3 ? '\\.' : ''}`).join('|') + '))';
} 割とすぐに出来るもんなんですね
どちらも実用上問題なさそうな、いい感じの実行結果です
>738は最新の実行環境に心当たりがなかったので確認に手間どりましたが
Chromeのコンソールから実行して確認できました
(cscriptで実行しようとしたらat()に対応してなかったので)
いやー勉強になります、ありがとう >>733
マルチスレッドかマルチタスクで "Hello, world!" を出力する処理と、ランダムなタイミングでそれを強制終了させる処理が動くということで良いのか?
そして出力中に停止できなかったら "GAME OVER" が最後に出ると。 >>743
その実装でもいいよ
題意はいかにHello, World!出力中にプログラムを終了させるかだから
sleep挟んでもいい >>733
#!/usr/bin/env sh
cat <<"EOL" | perl -ne '/(Hello, World)(?:[!])/ ? die " $1 got failed." : print'
> foo
> bar
> baz
> Hello, World
> Hello, World
> Hello, World!
> you can't see me, right?
> EOL
foo
bar
baz
Hello, World
Hello, World
Hello, World got failed. at -e line 1, <> line 6. はて?プログラミングのお題を投げて、競技的な興味をもって答えたくなった人が答え
その回答に興味があれば参照して「普段は扱ってないこの言語だとそういうやりかたなのか」
「自分とは違うスマートなやり方があったのか」と思ったりするスレ、という理解でしたが
もしかして投げたときに”お題”という文字が抜けてたのが問題ありましたか?
概ね正解とするに足る実行結果を、実用上問題なさそうと表現したことが拙かったですか?
もしそうなら申し訳ない、次からは気をつけます ついでというかなんというか>734の自分のお題に対する自己回答です(色々と手抜きしてありますが)
#!/usr/bin/ksh
function proc {
typeset A B C D E F N M L I
IFS='.','/' read A B C D E <<XYZ
$1
XYZ
let N="(${E}+8)/8" let M="8-(${E}%8)"
if [ $N -eq 5 ]; then echo -n "${A}.${B}.${C}.${D}"; return; fi
set -A BASE dummy "" "${A}." "${A}.${B}." "${A}.${B}.${C}."
set dummy $A $B $C $D; shift $N; F=$1; let L="$F-1+(1<<$M)"
for I in `seq $F $L`; do echo -n "|${BASE[$N]}${I}."; done; }
if [ $# -eq 0 ]; then echo "need CIDR/s"; exit 65; fi
set -A CIDR dummy $@;
echo -n "^(?!dummy"; for I in `seq 1 $#`; do proc ${CIDR[$I]}; done; echo ")"
exit 0 >>734 Perl5
for (<>) {
print;
@a = /(\d+)/g;
$w = pop @a;
$o = ($w - 1) >> 3;
$m = $w - $o * 8;
$n = 2**(8 - $m);
$l = join '.', @a[0..$o-1];
$l .= '.' if '' ne $l;
$h = $a[$o] & (255 << (8 - $m));
$r = $o < 3 ? '.' : '';
@b = map{$l . ($h + $_) . $r} 0..($n - 1);
print '^(?!(' . join('|', @b) . "))\n";
print "\n";
}
※見易くするためインデントを全角スペースに置換しています。
実行例:
https://ideone.com/VBJMMo >>748
128.0.0.0/1 の結果が変
バグ入りだ、ゴメンチャイ あれ?いいのかな?
仕様を推測して作ったけどちょっと混乱したかも…
寝るわ お題
長方形の1辺の長さのリストと正方形の面積のリストが入力されます
それぞれの正方形の面積について
長方形の1辺の長さのリストから2つを選んで掛け合わせ長方形の面積を計算します
長方形の面積が正方形の面積以上でかつ最小の面積となる組み合わせを探して出力してください
見つからなかった場合はerrorを出力してください
(例)
// 1辺の長さのリスト
[17, 3, 3, 1, 6, 13, 11, 17, 2, 5, 7, 18, 16, 5, 8, 6, 5, 1, 11, 1]
// 正方形の面積のリスト
[390, 240, 37, 396, 198, 99, 242, 53, 329, 202]
// 出力
390:error
240:16,17
37:3,13
396:error
198:11,18
99:6,17
242:16,17
53:3,18
329:error
202:13,16 >>751
a = [17, 3, 3, 1, 6, 13, 11, 17, 2, 5, 7, 18, 16, 5, 8, 6, 5, 1, 11, 1]
b = [390, 240, 37, 396, 198, 99, 242, 53, 329, 202]
c = a.group_by(&:itself).values.map{_1.size > 2 ? _1[0, 2] : _1}.flatten.permutation(2).map{[_1 * _2, [_1, _2].sort]}.uniq.sort.to_h
b.each{|s| puts '%d: %s' % [s, c.find{_1[0] >= s}&.[](1)&.join(?,) || :error]}
# =>
390: error
240: 16,17
37: 3,13
396: error
198: 11,18
99: 6,17
242: 16,17
53: 3,18
329: error
202: 13,16 >>751 ruby
https://ideone.com/hBHe51
def f(as, bs)
c = as.combination(2).map(&:sort).to_a.uniq.map {|x, y| [x * y, x, y]}.sort_by(&:first).each_cons(2)
bs.map do |b|
d = c.find {|e, f| e[0] < b && b <= f[0]}
"#{b}:#{d ? d[1][1..2].join(',') : 'error'}"
end
end
a = [17, 3, 3, 1, 6, 13, 11, 17, 2, 5, 7, 18, 16, 5, 8, 6, 5, 1, 11, 1]
b = [390, 240, 37, 396, 198, 99, 242, 53, 329, 202]
puts f(a, b) >>751
https://ideone.com/2UDrLT
・>>753を若干の整理
・>>752さんのを見て&.を勉強
def f(a, b)
c = a.combination(2).map(&:sort).to_a.uniq.map {|x, y| [x * y, x, y]}.sort
b.map {|b| "#{b}:#{c.find {|e| b <= e[0]}&.[](1..2)&.join(',') || 'error'}"}
end
a = [17, 3, 3, 1, 6, 13, 11, 17, 2, 5, 7, 18, 16, 5, 8, 6, 5, 1, 11, 1]
b = [390, 240, 37, 396, 198, 99, 242, 53, 329, 202]
puts f(a, b) >>751 Perl5
$ls = [17, 3, 3, 1, 6, 13, 11, 17, 2, 5, 7, 18, 16, 5, 8, 6, 5, 1, 11, 1];
$ss = [390, 240, 37, 396, 198, 99, 242, 53, 329, 202];
sub f {2 < @_ ? (f(@_[1..$#_]), map{[$_[0] * $_, $_[0], $_]} @_[1..$#_]) : ()}
@rs = sort{$$a[0] <=> $$b[0]} f @$ls;
for $aa (@$ss) {
@b = grep{$aa <= $$_[0]} @rs;
print @b ? "$aa:$b[0][1],$b[0][2]\n" : "$aa:error\n";
}
実行結果
$ perl 20_751.pl
390:error
240:17,16
37:3,13
396:error
198:18,11
99:17,6
242:17,16
53:3,18
329:error
202:13,16 >>751 octave
https://ideone.com/WGkm27
function c = f(a, b)
u = unique(sort(nchoosek(a, 2), 2), 'rows');
p = prod(u, 2);
c = cell(size(b));
for i = 1:numel(b)
d = min(p(b(i) <= p));
if isempty(d)
c{i} = sprintf('%d:error', b(i));
else
s = strjoin(arrayfun(@(n) {num2str(n)}, u(p == d, :)), ',');
c{i} = sprintf('%d:%s', b(i), s);
end
end
end
a = [17, 3, 3, 1, 6, 13, 11, 17, 2, 5, 7, 18, 16, 5, 8, 6, 5, 1, 11, 1];
b = [390, 240, 37, 396, 198, 99, 242, 53, 329, 202];
cellfun(@disp, f(a, b)) >>751 c
https://ideone.com/Cqx8M3
#include <stdio.h>
void f(int *a, int *b, int na, int nb) {
int i, j, k, found, min, x, y;
for (i = 0; i < nb; i++) {
found = 0;
for (j = 0; j < na; j++)
for (k = 0; k < na; k++)
if (j != k && b[i] <= a[j] * a[k] && (!found || a[j] * a[k] < min))
found = 1, min = a[j] * a[k], x = a[j], y = a[k];
if (!found) printf("%d:error\n", b[i]);
else printf("%d:%d,%d\n", b[i], x, y);
}
}
int main() {
int a[] = {17, 3, 3, 1, 6, 13, 11, 17, 2, 5, 7, 18, 16, 5, 8, 6, 5, 1, 11, 1};
int b[] = {390, 240, 37, 396, 198, 99, 242, 53, 329, 202};
f(a, b, sizeof a / sizeof *a, sizeof b / sizeof *b);
return 0;
} >>751
Kotlin
可能な限り漢字を使ったプログラムにしてみたが、余計にゴチャゴチャしてしまったかな?
https://paiza.io/projects/ay4L7Wchnt6lGUvkh6h21A
240 が 16, 17 ではなく 17, 16 のように出るが、まあよかろう。
(リストの順番で覚えているのでこうなる)。 お題
>>751の問題について
長方形の1辺の長さをソートして縦方向と横方向に並べて交差するところに長方形の面積を入れて表にします
https://downloadx.getuploader.com/g/angel556/90/%E3%81%97%E3%82%83%E3%81%8F%E3%81%A8%E3%82%8A%E6%B3%95.png
この図は50を探すところを描いています
青色の斜めの値の中から正方形の面積以上かつ最小の値を見つけその場所を出発点とします
長方形の面積が正方形の面積よりも大きい場合は表を上にたどり、長方形の面積が正方形の面積よりも小さい場合は表を右にたどります
右方向から上方向に切り替わるところが回答の候補でその中から最小値を探すことで効率よく回答を見つけることができます
しゃくとり虫が動いてるように見えるのでこれをしゃくとり法と呼ぶことにします
>>751の問題をしゃくとり法で解いてください > 右方向から上方向に切り替わるところが回答の候補でその中から最小値を探すことで効率よく回答を見つけることができます
これは間違いかも、これだと55を見つけられない
各自で考えていただければありがたく いや、いいのか!? ダメだ混乱してきたもうパニックですわ 2, 3, 5, 7, 11, 13, 17, 19...... お題
2~19までの素数を生成し掛け算の表を出力してください >>764
Kotlin
https://paiza.io/projects/caNg1GtDFhBF9Rk6AwC52Q
出力をHTMLにするとそれっぽく表示できた。
50は正方形の面積リストの最初に入れたが例の画像と同じような見た目になった。 >>751
ttps://ideone.com/mFYcmC
>>764
ttps://ideone.com/vwjQvN お題:OpenGLで四角形を3つ描画せよ
一番下の四角形が1番大きく赤色
その上にのってる四角形は2番目に大きく緑色
さらにその上にのってる四角形は3番目に大きく青色 お題
フェアフィールドの公式は、西暦1年1月1日から指定した日付までの日数を求めるもので次の式です
日数 = (365 * Y) + (Y / 4) - (Y / 100) + (Y / 400) + (306 * (M + 1) / 10) + D - 428
UNIX時間は、西暦1970年1月1日午前0時0分0秒からの経過秒数です
フェアフィールドの公式を用いてUNIX時間から年月日を求めて出力してください
(例)
1000000000 → 2001-09-09T01:46:40
1234567890 → 2009-02-13T23:31:30 >>772 bat
@echo off &setlocal
call :Conv_uTime2iso 1000000000
call :Conv_uTime2iso 1234567890
pause&exit /b
:Conv_uTime2iso
set /a "GD=(UT=%~1)/86400+719468, h=100+(R=UT%%86400)/3600, n=100+(R%%=3600)/60, s=100+R%%60, y=400*(GD/146097), y+=100*(i=(R=GD%%146097)/36524), y+=(R%%=36524)/1461*4, y+=j=(R%%=1461)/365, R=R%%365+365*(L=(i|j)/4), f=(k=(R*5+2)/153)/10, d=R+101-(306*k+4)/10, m=k+103-f*12, y+=f-L"
echo %y%-%m:~-2%-%d:~-2%T%h:~-2%:%n:~-2%:%s:~-2% //>>772 JavaScript
function _772(epoch) {
/**/epoch = BigInt(epoch);if (epoch < 0n) {throw new RangeError('');}
/**/const lastDateOfMonth = (_ => Object.fromEntries(Array.from([, , , ..._.slice(2), _[0], _[1]].entries()).filter(([, v]) => v)))(Array.from(new Array(12).keys()).map(m => BigInt(new Date(2_022, m + 1, 0, 0, 0 - new Date().getTimezoneOffset()).getDate())));
/**/const FAIRFIELD = fairfield(1_969n, 12n, 31n) + epoch / 86_400n + 1n;
/**/let [Y, M, D] = [1_969n, 13n, 1n];
/**/for (; D <= 58n; D++) {if (FAIRFIELD == fairfield(Y, M, D)) {return {Y: 1_970n, M: 1n + D / 31n, D: D % 31n};}}
/**/for (Y = 1_970n; Y <= Number.MAX_SAFE_INTEGER; Y++) {
/**//**/for (M = 3n, D = 1n; D <= 366n; D++) {
/**//**//**/if (FAIRFIELD == fairfield(Y, M, D)) {
/**//**//**//**/if (D == 366n) {
/**//**//**//**//**/if (isLeapFullYear(Y + 1n)) {
/**//**//**//**//**//**/return {Y: Y + 1n, M: 2n, D: 29n};
/**//**//**//**//**/} else {
/**//**//**//**//**//**/return {Y: Y + 1n, M: 3n, D: 1n};
/**//**//**//**//**/}
/**//**//**//**/} else {
/**//**//**//**//**/for (; lastDateOfMonth[M] <= D; D -= lastDateOfMonth[M++]);
/**//**//**//**//**/if (M <=12n) {
/**//**//**//**//**//**/return {Y, M, D};
/**//**//**//**//**/} else {
/**//**//**//**//**//**/return {Y: Y + 1n, M: M % 12n, D};
/**/}}}}}
/**/function isLeapFullYear(Y) {return Y % 4n == 0n && Y % 100n != 0n || Y % 400n == 0;}
/**/function fairfield(Y, M, D) {return Y * 365n + Y / 4n - Y / 100n + Y / 400n + 306n * (M + 1n) / 10n + D - 428n;}
} 400年で146097日増えるみたいだから適当にバイアス付けて146097で割る予感 フェアフィールドの公式てwikipediaに書かれている出自不明な公式でも何でも無いでっち上げの記事でしょ
式の解説文がこれまた頭悪くて、なのに誰も修正しないという お題
2*2の整数行列がいくつか与えられる。
これらを適当な順番で掛け合わせる(行列積)ことで零行列を作ることが可能かどうか判定せよ。
ただし、同じ行列を2回以上使用してもよい。
例
[[1, 0], [0, 0]], [[0, -1], [1, 0]] =>可能(行列1*行列2*行列1==0)
[[1, 2], [3, 4]], [[0, -3], [2, 4]] =>不可能(正則行列だから) >>781
零因子の発掘ですか、濃ゆいお題ですね… >>783
Kotlin
https://paiza.io/projects/dZhh0NhaeEwnxD45W6V7Ng
Java VM 上で動くから Java と同じで参照している変数を null にして System.gc() するだけ。 >>772
亀レスHaskell
https://ideone.com/y7jYXr
色々考えて結局テーブル作って処理という最後の手段
わざわざ公開するほどのもんでもないけど一区切りつけるため
暦の勉強になった
なんで大の月と小の月の配置はこんなみっともないことになってるんだろ?
歴史家が調べでよくわからんみたいだけど >>772
だめ。その式に当てはめると必ずずれる。 >>788
問題には書かれていないけれどその式は条件によって前処理が必要
・1-2月は前年として扱う。 1年を3-14月として計算
m=1 or 2 の時 y=y-1, m=m+12
>>789
UNIXTIMEにうるう秒なんて無い >>790
日付に変換する過程でうるう秒考慮しないとずれるでしょう >>791
UNIXTIMEは「epocからの実時間の秒数」では無い
実時間から、うるう秒は加減され含まれず、1日は86400秒換算
だからそれを日時に変換しても「うるう秒の時刻を表せない」だけでズレなど発生しない >>790
出題ミスか。
これまでに作られたプログラムはその辺のことを考慮したプログラムになっていたのかな?
だったら分かってたんだからその辺の事を書いておいて欲しかったな。 wikiにはそこまで詳しい解説はなかったけど式みたらわかったけどな
⌊(m+1)/30.6⌋
という項
⌊x/30.6⌋という関数は0,1,2,3,4となる値が
31,30,31,30,31,31,(繰り返し)‥①
と変化してコレを周期153で繰り返す
月の長さは3月から見ると
31,30,31,30,31,31,30,31,30,31,31,28(29)
となってるから①を一月分左に平行移動すれば良いとわかる
からの⌊(m+1)/30.6⌋ >>795
間違えた
⌊m×30.6⌋という関数は0,1,2,3,4,‥の時の値が
31,31,30,31,30
の繰り返し
件の公式のmの項はコレを一月分ずらしてる お題:4回呼び出したらその内の1回が失敗する関数を書け
失敗した場合は「failed」と表示、成功した場合は「ok」と表示せよ >>797 c
https://ideone.com/PIpRmD
void f() {
static int i = 0, j, k = 4;
if (i == 0) j = rand() % k;
puts(i == j ? "failed" : "ok");
i = (i + 1) % k;
} >>797 Ruby
def f
$f_cnt||=0
puts$f_cnt==3||(rand(4)==~-$f_cnt+=1)?:failed: :ok
end >>797
Kotlin
https://paiza.io/projects/QipeLOxxfW3_GNBarDA-8w
Int型1つ分のワークエリアを呼ぶ側から与えてそこでカウントして必ず4回の内1回が失敗になる。
乱数を使うと4回の内1回失敗ではなくなる可能性があるので使っていない。
引数としてInt型の参照を渡しても中身を変えられないのでIntArray(Java なら int[] に相当)で1要素作ってIntArrayの参照を渡している。
クラスでやっても良かったが、わざわざクラス作るほどのことでもないと思ったのでこの方式にした。 お題: あみだ https://imgur.com/6XtTF0E.png
画像のようなマス目の上に直線を引いたあみだを次のように表現することにします。
N: 縦線の本数(列数)
M: 橋が架けられている行数
B: M行N-1列の二次元配列で、橋が架けられていたら1、そうでない場合は0が格納されています。
あらかじめ、あみだの入力には左から0〜N-1までの整数が割り振られていることにします。また、同じ行に橋が二つ連続で隣り合うことは禁止されています。
一応の制約: 2 <= N <= 100, 1 <= M <= 100
あみだに橋が1つも存在しない場合、M=1となり、Bは1行N-1列の大きさで、すべての要素が0の2次元配列になることにします。
お題1: N, M, Bが与えられるので、あみだの出力を求めてください。(入出力のフォーマットは各自で適宜変更してもいいです。)
入力例(画像のもの):
4
4
1 0 1
0 1 0
1 0 0
0 1 0
出力例:
3 0 1 2
お題2: Nとあみだの出力が与えられるので、Mをできるだけ小さくしたあみだを求め、Mと Bの一例 を表示してください。
入力例:
5
2 4 0 1 3
出力例:
3
0 1 0 1
1 0 1 0
0 1 0 0
あみだ関連のお題は過去スレで何回か見かけたがろくに相手にされていなかったのであげてみる。 reduced expressionのまとめられる積を出来るだけまとめたものが必ず最短になるなら簡単なんだけどな reduced expression の長さ自体の計算は簡単だけどこの問題は"reduced expressionの長さを求めよ"ではないからそこまで数学的に単純じゃないよ >>803
お題1
ttps://paiza.io/projects/tUaZay_JvtZRkIaUhjYF7Q
お題2
ttps://paiza.io/projects/1yDZy-Vx-C9Q9Z_Oc03Mtw
お題1とお題2でそれぞれ入力と出力をあわせるようにした
Mをできるだけ小さくって難しいな
これでいいのかわからん アルゴリズムが存在するのは明らかだしひとつ答え見つけるアルゴリズムも簡単
でもreduced expression見つけるアルゴリズムと同程度のアルゴリズムとなると途端に難しくなる
reduced expressionの場合には置換σのreduced expressionを見つけるには
(1) σ = idであるか否か判定する、σ=idなら空列を返して終了
(2) そうでない場合σ(i) > σ(i+1)であるiを見つける、見つけたiに対してτ=σ(i i+1)とおいてτほreduced expression sを求める
(3) (3) s ( i i+1 )を返して終了
でもとまる
ここでミソはreduced expressionの1番右は( i i+1 )と決め打ち出来ること、コレがあるから多項式時間で終わる
しかしアミダの場合1番右の初手をそんなに簡単に決定出来るかが分からん
初手の可能性は転置全部の可換な集合のうち極大であるもの全体のいずれかに最短が入る事は簡単に示せるけど、そのような極大な可換集合をどれとっても必ずうまくいくことの証明がむずかしい
多分出来るんだとは思うけど正直数学板で話題にするような話でプロ板で出すような問題じゃない気がする >>803
最近やっとpythonを学び始めたレベルだから合ってるかわからん
コメントとかもちゃんと書いたほうがいいのだろうか
暇な人添削してくれると嬉しい
お題1
https://ideone.com/uQ0lEu
お題2
https://ideone.com/IvtRj2 お題
プリンタAは1分間に1ページ印刷できます
プリンタBは3分間に1ページ印刷できます
プリンタCは5分間に1ページ印刷できます
プリンタを3台同時に動かして100ページを印刷します
100ページを印刷し終わるのに何分掛かるか求めてください >>815
バグってるぞ
65分だと99枚しか印刷されない >>814 cmd
set /a "p=100, n=15*p/23+!!(15*p%23)" haskell
pages n = sum $ map ( div n ) [ 1,3,5 ]
main = print $ head [ n | n <- [1..], pages n >= 100 ] >>814
aow = 100
power = (1 + 1r/3 + 1r/5)
printf(aow / power) // => 65.21739130434783 >>814 octave
https://ideone.com/BOXjxs
f = @(n) ceil(n * 15 / 23); >>817,820
逆算はページ数によってはダメ
例えば3ページの時、3分4ページが正解だけど
(B=2/3)+(C=2/5) で1繰り上がって2分が出て来る A, B, Cでそれぞれ45/23, 15/23, 9/23ページ印刷すれば45/23分で3ページ印刷し終わるよ 甘えんな
印刷周期を一定と仮定した上で解として取りうる離散値のどれになるかを小数単位で求めるプログラムも書こうよ じゃあ1分に1枚、3枚、5枚のプリンターでの印刷というお題も出すか。 >>814 octave
https://ideone.com/0V6LlD
function m = f(n, m)
if nargin == 1
m = f(n, 0);
elseif sum(idivide(m, [1 3 5])) < n
m = f(n, m + 1);
end
end
>>814 ocaml
https://ideone.com/4iPTJS
let f n =
let rec aux m =
if n <= (m + m / 3 + m / 5) then m else aux (m + 1)
in aux 0 >>829
Java
public static void main(String[] args)
{
var pages = 100;
var s = IntStream.of(1, 3, 5).sum();
System.out.println((pages + s - 1) / s);
} お題
オークA「ぐっふっふ…… 俺は媚薬を盛ってないぜ……」
オークB「ぐふっ…… 媚薬を盛ったやつはAかCのどちらかだぜ…」
オークC「オークBかDは嘘をついているぜ…ぐっふっふっふっ……」
オークD「ぐふふ…媚薬を盛った奴はB,Eの中にはいないぜ……ぐひっ…」
オークE「げひひっ……媚薬を盛ったやつは本当の事を言っているぞ…」
オーク達「ちなみに、お前に媚薬を盛ったのはこの中の一匹で、俺たちの中で一匹が嘘をついているぞ……」
女騎士「くうぅ…誰が嘘をついて誰が私に媚薬を盛ったんだ……!」
オーク達「ぐっふっふ……」
論理演算を用いて答えを求めてください 全てが媚薬を盛って全員が嘘をついている
これで全員の発言と矛盾がないと思う さすがに
> オーク達「ちなみに、お前に媚薬を盛ったのはこの中の一匹で、俺たちの中で一匹が嘘をついているぞ……」
は正しいと仮定しないとなんでもありありになっちゃうだろ さすがに
> オーク達「ちなみに、お前に媚薬を盛ったのはこの中の一匹で、俺たちの中で一匹が嘘をついているぞ……」
コレウソついてるのは一匹“だけ”つて意味だよね?
“少なくとも一匹はウソついてる”
じゃないよね? このタイプの論理問題ってよく見かけるな
初出ってどこなんだろうな >>836
> “少なくとも一匹はウソついてる”
だと、全員嘘つきでもいいからなんでもありになっちゃう気がする オーク達「」が真であることは、
この世界の神である出題者が保証してるわけだな? 出題者が嘘をついていて、オークがそのような発言をしていない可能性もある >>832
Haskell
一ヶ所間違ってたので訂正
あとウソつきはちょうど1人という条件つけたら解一個になった
https://ideone.com/vAXrzD Haskell
ウソつき1人としてループを5×5に
5人しかいないので大して変わらないけど
https://ideone.com/zxaBcf お題
Kの倍数の桁の和
自然数nに対してf(n)をnの10進表示の各桁の和とします
(例 f(1024) = 1+2+4 = 7)
自然数kに対してg(k)を
g(k) = { f(n) | nはkの倍数である自然数 }
とします
入力kに対してg(k)を出力するコードを書いて下さい >>845
g(k)って必ずしも有限集合にならなくない? >>946
orz
訂正
g(k) = min{ f(n) | nはkの倍数である自然数 } お題
プレーヤーの前に閉じた3つのドアがあります
1つのドアの後ろには景品の新車があります
2つのドアの後ろにははずれを意味するヤギがいます
プレーヤーは新車のドアを当てると新車がもらえます
プレーヤーが1つのドアを選択したあとに司会のモンティが残りのドアのうちヤギがいるドアを開けてヤギを見せます
ここでプレーヤーは「最初に選んだドアを残っている開けられていないドアに変更してもよい」と言われます
ここでプレーヤーはドアを変更すべきだろうか?
乱数を使ったシミュレーションで答えを求めてください ドアを変更するかどうかのところはランダムにする必要無くない?
二択なので一方に決めていれば残りが逆側の確率 まぁ
交換戦略「必ず交換する」
非交換戦略「決して交換しない」
確率交換戦略「ある分布に従って確率的に交換するかしないか決める」
で答えが変わる事を確認せよだからな
ある意味最初2つの戦略も最後の戦略の特別な場合 お題N x Nのルービックキューブのパターン数を求めよ モンティ・ホール問題のシミュレートのように見えて実はちょっと違う
モンキーホール問題だったのだ お題 ジュールトムソン効果っぽいものをシミュレーションで再現せよ お題:1~10までの合計を求めよ
*ただしライブラリ、ループ文を使わないこと >>857 cmd
set /a "A=1, B=10, (B-A+1)/2*(A+B)+(B-A+1)%2*(A+B)/2" &rem A≦B >>857
$ dc -e'1 10+5*p'
55
$ 整数とは書いてないな
三角数とか実数とか何か別のものを想定してるかもしれない 高級言語なら大抵暗黙のうちにライブラリは使ってるだろうし内部的にループも使ってるかもしれない
ループの定義も問題になるかと
gotoは?再帰は?列挙は?... >>863
その場合は
> 1~10までの合計
の定義を書かないとね >>866
整数なら
> 1~10までの合計
についてほぼ合意できる定義があると思うけど? 思ってない人は具体的にどう言う定義があるのか書けばいいんじゃね? >>857 octave
https://ideone.com/1JUukk
f = @(a, b) (a + b) * (b - a + 1) / 2; >>857
Kotlin
https://paiza.io/projects/uWXy93c98CoNzF0o2H_wgQ
ループ文は使わず再帰でなんとかした。
(1..10).sum() や (1..10).reduce { a, n -> a + n } でも結果は出るが sum() や reduce() がライブラリにある拡張関数なので没。
10 * 11 / 2 とか 55 を直接出すのはプログラム作る意味がほとんどないような感じがするので止めた。 お題が、正方形や三角形の面積を求めるのと
同程度に簡単な式だしなあ >>861で終了じゃん
最適化して55でも良いけど
中途半端に和の公式使ってるヤツってアホなの? 一垓にそうは言えないのでは
ループを使わないの意味が多くの数でもすぐ答えがでそうな処理を見たいのかもしれない 掛け算割り算だと中途半端でアホで
足し算だと利口だとおっしゃる 和の公式を使うくらいなら55の方が良い
って話
なんで中途半端な最適化をするの? 1^n + 2^n +・・・+(10^25)^n
n=10、 n=-17
の手段選ばすとかは?
25条はぎりふつうループでは困難かとおもえる数値を適当にいまおもいついた = 10+(9+1)+(8+2)+(7+3)+(4+6)+5
= 10+10+ 10+ 10+ 10+ 5
= 10 + (10 * ((10/2)-1))+5
= (10 * ((10/2)-1))+10+5
= x(0.5x-1)+1.5x 1~10の合計
1から10までの合計
じゃなくて
1~10までの合計
っていうのも気になった 1~10までの実数の合計って言ってる奴は有限の値に収束するとでも思っているか 低レベルすぎて草
1以上10以下の実数全体の集合をAとすると
#A = ?_1 ゆえに Σ_{λ∈A}λ は有限の値を取らない なんか足すと一見無限になりそうだけど
ある区間a<bの間にa<c<bとなるcが取れなくなることはありえないよね? >>889
和が存在しないとうならそれが答え
3を含むが3.5を含まないという説得力のある説明が出来るならよろしく >>895
和が発散する説明はすでにしてあるんだが何を言いたいの 発散とか収束とか
意味をわかって使わないと恥ずかしいぞ >>895みたいなこと言う奴が解析の基礎すら理解できてるとすら思えないが >>904
暴言は結構なんで、数学的に反論してくれませんか?
まあ頭が悪くてできないんでしょうけど >>905
何に反論してほしいの?
多分視野が狭くて何を主張されてるのかわかってないと思うんで
一回落ち着いた方がいいぞ
その上で
君が主張を明確にして
それに対して反対意見があれば反論してあげる 1以上10以下の実数の総和が存在しないことなんて
誰でもわかる
和が存在するなんて主張はしてないから勘違いしないように >>906
>1~10までの実数の合計って言ってる奴は有限の値に収束するとでも思っているか
に対してお前は>>895みたいなクソ発言してるわけだがこのクソ発言の妥当性を説明して見ろよ 和が存在しないというならそれが答え
の意味がわからなかったかな?
その次の文は和の存在とは関係ない
君への宿題 >>909
任意のRの開区間に対してその元の和が有限の値になる場合何てないんだから
「和が存在しないというならそれが答え」なんて発言は問題の本質を理解していないバカの発言だろ
人に宿題出す前に算数からやり直せよ プログラミングのお題なんだから1+2+に決まってるだろ。
少数を含めた1から10までに考えられる数値を足すとかできるわけねえだろ。 >>910
問題の本質というなら
解釈の多様性が本質
和の存在は解釈とは無関係
存在しないなら「存在しない」が答えとなるだけの話 >>913
お気持ちで数学を語るのやめてくれませんかね
はなはだ不愉快です
「任意のRの開区間に対してその元の和」に対して有限の値を取らないという以外にどんな有意味なモデルが取り得るんですかね
バカすぎて日本語の意味すら理解できてなさそうだけど 決まってるといくら主張しても
お題に書いてないんだから
どう解釈されても出題者が悪い >>915
お前が数学の話を語りたがってるだけで
私はただ解釈の多様性の話をしてるだけ >>917
実数の開区間の和が有限じゃないことにいちゃもん付けてきたのはオタクでしょ?
有限の値を取らない意外にどんな有意義な解釈が成り立つんですか?
きちんと説明しなさい >>890と同一人物だと思って
トンチンカンな書き込みを繰り返してたのたね
恥ずかしい >>920
>和が存在しないとうならそれが答え
って和が存在する有意義なモデルがあるって言う前提で話してますよね?
もしそうじゃないならこれはどういう意図で行ったんですか?
ちなみに続く3.5云々の意味もよく分かってません もうこりゃ発散とか収束とか言う前に就職の心配したほうがいいな >>924
敗北宣言ですか
これにこりたら今後二度とお気持ちで数学を語るのはやめてください
研究者やエンジニアが迷惑するので 数学を語りたがってるのはお前と>>890だけだって
だから落ち着け おれの主張は>>863だから
もちろん本気で出題者がそう思っているという主張ではなくて
解釈の余地があるという問題提起 問題は出題者の意図を読み取ることが重要
1~10までの整数の和の事だろうなと考えるのが低レベルとは思えない。
常識で考えればそうなる
できればその高レベルのプログラムとやらを説明してほしいものだな。 一応プログラム板なんだからさ
解釈の多様性を多少は意識しようよ
プログラミング言語だったら「動作未定義」
曖昧な仕様書で中国人に発注したら
一番都合の良い解釈をされてとんでもないソフトになるぞ プログラムのお題なんだから、
プログラムで実現できないってのは答えにはならんよ。
国語の問題じゃねえんだから、
プログラムとして成立する答えを出せよ 国語の問題じゃねえんだから
出題者の意図を好意的に汲み取る必要はないんだよ >>930
だからちゃんと仕様出せやってことだろ
>>863は半分ネタだと思うけど、実数だと言うなら実数について「1~10までの合計」を定義しないとお題にならんよ >>932
私は出題者じゃないし実数だなんて主張もしてない
いろんな解釈があるならお題にならん
解釈の余地は可能な限り減らせ >>933
お前にアンカーしてるわけでもないのに絡んでくるとかあたおかすぎる 1から10までの整数の和では無い可能性があるから、
その場合はプログラムでは実現できないって言いたいだけだろ
整数の和として答えてるプログラムを低レベルってどういことやねん。
素直に受け取ればいいものを曲解して不可能に持って行ってるだけだろ 「整数の和として答えてるプログラムを低レベルってどういことやねん。」
だれがそんなことかいた? 仕事では御免だが
解釈の余地を残すことが娯楽では大切だって良く分かる例 お題:1/1+1/2+...+1/nの合計を求め、分母と分子を整数で出力せよ。
*ただしライブラリを使わないこと >>940 Ruby
(1..n).map{ 1r/_1 }.sum gcdとかsumとかprintはライブラリじゃないの? >>944
こっちの方がおもしろいかも
小数第○位って昔は言ったけど今は言わない? >>943
Pythonではprintは組み込み関数だな
他は知らんけど 組み込み関数はライブラリじゃないと
ライブラリと呼ばない言語なら何でもありか C言語上のただのintの乗算でもライブラリが必要な環境もあるわけだけど まあ今時組込とかでもなきゃintの乗算でライブラリ呼び出す環境もあまりないけどそもそも入出力はライブラリ任せだからねぇ >>943
Haskell ?
だとsumやgcdはpreludeで標準関数扱い
基本import〜が必要ない奴は標準扱い >>940
https://ideone.com/zNHUB9
・「ただし」以下は無視した回答
function [n, d] = f(n)
[n, d] = rat(sum(1./(1:n)), 1e-7);
end >>940 octave
https://ideone.com/zNHUB9
・「ただし」以下は無視した回答
function [n, d] = f(n)
[n, d] = rat(sum(1./(1:n)), 1e-7);
end >>940 octave
https://ideone.com/zNHUB9
・「ただし」以下は無視した回答
function [n, d] = f(n)
[n, d] = rat(sum(1./(1:n)), 1e-7);
end >>940 octave
https://ideone.com/zNHUB9
・「ただし」以下は無視した回答
function [n, d] = f(n)
[n, d] = rat(sum(1./(1:n)), 1e-7);
end お題
入力した文字列を以下の4種類に分けた文字列を作成する関数を作成してください
・アルファベット大文字
・アルファベット小文字
・数字
・それ以外の文字 Array.from(input).filter(c=>c.match(/[A-Z]/)).join("")
+ Array.from(input).filter(c=>c.match(/[a-z]/)).join("")
+ Array.from(input).filter(c=>c.match(/[0-9]/)).join("")
+ Array.from(input).filter(c=>c.match(/[^A-Za-z0-9]/)).join("") >>960 octave
https://ideone.com/SHPVub
function c = f(s)
u = isstrprop(s, 'upper');
l = isstrprop(s, 'lower');
d = isstrprop(s, 'digit');
c = {s(u) s(l) s(d) s(~(u | l | d))};
end >>960
Haskell
https://ideone.com/jMHNnq
isUpper = flip elem [ 'A' .. 'Z' ]
isLower = flip elem [ 'a' .. 'z' ]
isNum = flip elem [ '0' .. '9' ]
isOthers = id
. all not
. zipWith ( $ ) [ isUpper, isLower, isNum ]
. repeat
sieve str = [ filter cond str |
cond <- [ isUpper, isLower, isNum, isOthers ] ]
testStr = "foldl1 :: Foldable t => (a -> a -> a) -> t a -> a"
main = mapM_ print $ sieve testStr >>961
俺も正規表現でやりたいけどこっちのほうが5倍速かった…
コンパイル言語に比べたら目くそ鼻くそだがこんだけ違うと考えちゃうな
const str = 'aA0!bB1@cC2#dD3$eE4%'.repeat(500);
let oomoji = [], komoji = [], suuji = [], sonota = [];
for (const c of str) {
let cp;
switch (true) {
case 65 <= cp && cp <= 90:
oomoji.push(c);
break;
case 97 <= cp && cp <= 122:
komoji.push(c);
break;
case 48 <= cp && cp <= 57:
suuji.push(c);
break;
default:
sonota.push(c);
}
}
[oomoji, komoji, suuji, sonota] = [oomoji, komoji, suuji, sonota]
.map(a => a.join``);
// console.table({oomoji, komoji, suuji, sonota}); >>965
5倍じゃなくて3倍だったわ
perf.linkで測ったコード、
let cp = c.codePointAt();
が
let cp;
になってたわ寝ぼけてた >>960
ASCII のみで良い?
それとも Unicode? >>960 Ruby
-> s { s.scan(/[A-Z]+|[a-z]+|\d+|[\W_]+/) } >>960
Kotlin
https://paiza.io/projects/Qfx9ljGCsICVDui8fcn-0A
Unicodeで作った。サロゲートペアの文字もちゃんと扱える。
判別には Java の Character クラスのメソッドを利用している。
これだといわゆる全角の数字は数字扱いになるが漢数字は数字と分類してくれない。
ローマ数字はアルファベット大文字扱い。
日本語の「あ」とかもアルファベットとして扱われるが大文字でも小文字でもないのでそれ以外の文字に追加されるようにした。
コントロールコードは \uXXXX 形式になるようにした。 >>960
PowerShell
function StrClassify($s)
{
"\P{Lu}", "\P{Ll}", "\P{N}", "[\p{Lu}\p{Ll}\p{N}]" |% {$s -creplace $_}
}
StrClassify "Κωνσταντινούπολιςは1453年にİstanbulと改称された。`n"
StrClassify "塩化銅(Ⅱ)は水中で CuCl₂ ⇄ Cu²⁺ + 2Cl⁻ のように電離する。"
[実行結果]
Κİ
ωνσταντινούπολιςstanbul
1453
は年にと改称された。
CCCC
ulul
Ⅱ₂²2
塩化銅()は水中で ⇄ ⁺ + ⁻ のように電離する。 >>944をやってみたらPythonで300くらいでオーバーフローになった
分子と分母をべつべつに計算してp/qだったとすると
int(10^n * p / q ) % 10 が求める答えのはずだが、この計算ができなかった ここで問題変更でp/qの小数点n桁目を求める問題にすればいいか
オーバーフローしないように×10ずつして整数部分は無視していけば整数演算の範囲内にできるか
忘れたがユークリッド互除法みたいな? input.replace(/[^A-Z]/g,"")
+ input.replace(/[^a-z]/g,"")
+ input.replace(/[^0-9]/g,"")
+ input.replace(/[A-Za-z0-9]/g,"") [/[^A-Z]/g, /[^a-z]/g, /[^0-9]/g, /[A-Za-z0-9]/g]
.map(r => input.replace(r,"")).join("") >>944
Haskell
https://ideone.com/2tUIFo
import Data.Ratio
hnn n = flip mod 10 $ truncate $ (* ( 10^n)) $ sum $ map recip [ 1%1..n%1 ]
main = print $ hnn 300 お題
配列データと、同じ長さの確率の配列(合計値1)が与えられた時に、対応する確率で配列からデータを出力せよ
例
aa,bb,cc
0.4,0.5,0.1
→aa 40%, bb 50%, cc 10%で出力 >>983 Ruby
a = %w[aa bb cc]
p = [0.4, 0.5, 0.1]
f = -> (a, p) { r = rand; a[(0..a.size-2).find{ r < p[0.._1].sum } || a.size - 1] }
10.times{ print f[a, p] }
# => aabbccbbaaaaaabbbbbb >>983
Haskell
https://ideone.com/UErkR7
import System.Random
import Data.List
randomDbls :: StdGen -> [ Double ]
randomDbls= randomRs (0,1)
chooseItem is ws r = let
folder a b = a : map ( + a ) b
selecter r ( i, ( f, t ) ) = f <= r && r < t
ts = foldr folder [ ] ws
fs = 0 : ts
ifts = zip is $ zip fs ts
in fst $ head $ filter ( selecter r ) ifts
main = do
rds <- ( return . randomDbls ) =<< getStdGen
print $ map (chooseItem ['A'..'C' ] [0.4,0.5,0.1] ) $ take 100 rds >>983 octave
https://ideone.com/mIKDyu
f = @(a, r) a(rand < cumsum(r))(1); >>983 ocaml
https://ideone.com/aDR0Do
let (<<) f g x = f (g x)
let cumsum =
List.rev << fst << List.fold_left (fun (a, s) f -> s +. f :: a, s +. f) ([], 0.)
let f xs =
let r = Random.float 1. in
fst << List.find ((<) r << snd) << List.combine xs << cumsum >>983
コレでよかった
Haskell
https://ideone.com/WtPXzw
import System.Random
randomDbls :: StdGen -> [ Double ]
randomDbls= randomRs (0,1)
chooseItem (i:is) (w:ws) r | r < w = i
chooseItem (i:is) (w:ws) r = chooseItem is ws ( r - w )
main = do
rds <- ( return . randomDbls ) =<< getStdGen
print $ map (chooseItem ['A'..'C' ] [0.4,0.5,0.1] ) $ take 100 rds https://ideone.com/8utmEg
元からあったコードをちょっといじったんだけど変換ミスがあった お題:1辺がn文字の正四角形を表示せよ
1 <= n <= 8 とする haskell
https://ideone.com/4Kd3el
sqStr n = ""
++ "\x250f" ++ r "\x2501" ++ "\x2513" ++ "\n"
++ r ( "\x2503" ++ r "\x2001" ++ "\x2503" ++ " \n" )
++ "\x2517" ++ r "\x2501" ++ "\x251b" ++ "\n"
where r = concat . replicate ( n-2 )
main = putStr $ sqStr 10 >>994 octave
https://ideone.com/k9cAWw
function s = f(n)
s = repmat('#', n);
s(2:end-1, 2:end-1) = ' ';
end このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 516日 23時間 1分 3秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。