プログラミングのお題スレ Part19
■ このスレッドは過去ログ倉庫に格納されています
>>98 この正規表現を関数にするのか? IFxU2W - Online Perl Interpreter & Debugging Tool - Ideone.com https://ideone.com/IFxU2W $c = 'a'; $l="<"; $r=">"; while(<>){ s/$c/$l$c$r/g; print; } お題 値のペアが複数入力されます 1列目の値でソートしてユニーク化し、2列目の値を出力してください 1列目の値が同じ時、2列目の値はソート後のインデックスが最も小さいもののみを出力してください 入力 c,e b,c c,f b,d a,b c,g 出力 a,b b,c c,e > 1列目の値が同じ時、2列目の値はソート後のインデックスが最も小さいもの〜 と書かれてるがそのソート方法は > 1列目の値でソート としか書かれてない これでは例えば c,e c,f は出現順なのか、はたまた2列目の値も使って昇/降順にするのかわからない >>103 haskell 入力パーサなし import Data.List pairs = [ ('c','e'), ('b','c'), ('c','f'), ('b','d'), ('a','b'), ('c','g') ] f = id . map head . groupBy (\x y -> ( fst x ) == ( fst y ) ) . sort main = mapM_ print $ f pairs 出現順という言葉が使われていないから、出現順ではない。 2列目もソートすべき ソートの仕方は書いていないので、文字列でよい >>103 C++ 入力を競プロぽく改変 https://ideone.com/CUTjOy #include<iostream> #include<map> #include<set> #include<string> #include<vector> #include<algorithm> using namespace std; int main() { int N; cin >> N; map<string, set<string>> xs; for(int i=0; i<N; i++){ string k, v; cin >> k >> v; xs[k].insert(v); } for_each(xs.begin(), xs.end(), [xs](auto& it){ cout << it.first << "," << *(xs.at(it.first).begin()) << endl; }); return 0; } >>103 # # cat input c,e b,c c,f b,d a,b c,g # # cat input | sort | perl -F"," -lane 'print unless $LAST eq $F[0]; $LAST = $F[0]' a,b b,c c,e >>103 bat @(for %%a in ("c,e" "b,c" "c,f" "b,d" "a,b" "c,g") do @echo %%~a)|(cmd /v:on /s /c "for /f "tokens=1,2 delims=," %%b in ('sort') do @(if not "%%b"=="!s!" set "s=%%b" &echo %%b,%%c)")&pause お題: ランダムに生成されるバイナリツリーがある ツリーのルートから見て最も左にあるノードと最も右にあるノードの位置を出力せよ 位置はツリーのルートが原点とする x座標は原点から左に進むとマイナスになり、右に進むとプラスになる y座標は原点から下に進むとプラスになるものとする 生成されるツリーは原点から下に向かって伸びていくものとする 生成されるツリーの最大の高さは8とする 出力例は↓のようになる l = -3, 4 r = 5, 7 >>113 あとツリーの最大の横幅は原点から左右に8ずつで >>103 J a =: /:~ ',' & cutopen @ >cutopen stdin '' f =: >@{. , ','&,@>@{: smoutput f"1 a #~ ~: {. "1 a >>103 Perl5 @a = qw{c,e b,c c,f b,d a,b c,g}; $h{(/(\w)/)[0]} //= $_ for @a; print "$_\n" for map{$h{$_}} sort keys %h; 実行結果 ~ $ perl 19_103.pl a,b b,c c,e >>89 https://ideone.com/lQvahn 投稿があった、O(√)以外の方法もあるみたいなので、両方を載せておこう。 他方は、O(N)解法の最後の方の同じ数をまとめて計算するやり方。 O(√)解法より確実に計算量が多い。 >>98 Kotlin 及び Kotlin script target_char の場合 fun wrap(text: String, target_char: Char, tag_left: Char = '<', tag_right: Char = '>') = text.replace(target_char.toString(), "$tag_left$target_char$tag_right") target_str の場合 fun wrap(text: String, target_str: String, tag_left: Char = '<', tag_right: Char = '>') = text.replace(target_str, "$tag_left$target_str$tag_right") 要するに Java の String クラスの replace() 使ってるので、肝心な部分は何も考えてない。 tag_left, tag_right はデフォルト値として '<', '>' を指定しているので呼び出す側で指定しなければこれになる。 もう少しだけ Kotlin らしくするとしたら拡張関数にするぐらいかな。 fun String.wrap(target_str: String, tag_left: Char = '<', tag_right: Char = '>') = replace(target_str, "$tag_left$target_str$tag_right") これで String クラスのメソッドになるので "abcabc".wrap("bc") が "a<bc>a<bc>" を返すようになる。 >>98 JavaScript const wrap = (text, target_str, tag_left='<', tag_right='>') => text.replace(RegExp(target_str, 'g'), tag_left + target_str + tag_right); [お題] 和が2021の倍数 2021000以下の素数を昇順に並べた数列がある。 [2, 3, 5, ..., 2020979, 2020999] 項目数:150399 この数列より 空でない連続する部分列を P とする。 (全てのPの選び方はNCR(150399+1, 2) = 約113億通りある) Pの和が2021の倍数となるのは何通りあるか。 [8081,8087] [3361, 3371, 3373] [2011, 2017, 2027, 2029] 等が該当するP ※無駄に素数を乱数代わりに使った、一発正解問題 ※実行時間は素数生成を含めて、3秒以内 >>103 Kotlin script pair.csv にその入力を入れておいてから実行する。 以下は kotlinc コマンドで REPL にして直接入力して実行した時のコピー >>> java.io.File("pair.csv").bufferedReader().lineSequence().map { it.split(',') }.sortedBy { it[0] }.fold(mutableListOf<List<String>>()) { a, c -> if (a.size == 0 || a[a.lastIndex][0] != c[0]) a.add(c); a }.forEach { println(it) } [a, b] [b, c] [c, e] >>> 2列目については考慮していないので sortBy が中でやっているソートのアルゴリズムが変われば変わるかも知れない。 a[a.lastIndex][0] の部分は a.last().first() と書いても同じだった。 この方が a.lastIndex 呼ばない分だけ無駄が少ないかも知れない。 (でもコンパイラが中で適当に最適化して同じになるかも知れないのでどうでも良いかな?) お題: 半径dの円にぴったり内接する正n角形を描画せよ。 ぴったり内接とは? ぴったりじゃない内接を教えてください ぴったり内接ってなんだよって言おうとしたらすでに言われててくっそワロタ 量子化誤差を最小化した演算を求めているのでは? 我々は実数を扱えないので。 n角形をなす線分が円の外側に飛び出さないよう注意を与えているのかもしれない。 実数を扱えない以上、注意する必要が有る。 ということを示唆するのかも。 >>133 processing void setup(){ size(400, 400); float d=200; float r=d/2; int n=7; PVector c = new PVector(width/2, height/2); ArrayList<PVector> p = new ArrayList<PVector>(); for(int i=0; i<n+1; i++){ float theta = (TWO_PI*i)/n; PVector t = new PVector(r*cos(theta),r*sin(theta)); t.add(c); p.add(new PVector(t.x, t.y)); } ellipse(c.x, c.y, d, d); for(int i=0, j=1; i<n+1; i++, j++, j%=n){ line(p.get(i).x, p.get(i).y, p.get(j).x, p.get(j).y); } } [お題] MarkdownのParagraph/BlockQuoteをパースしHTMLを生成してください 入出力例(1) paragraph > block quoted paragraph ↑入力 / ↓出力 <p>paragraph</p> <blockquote> <p>block quoted paragraph</p> </blockquote> 入出力例(2) > hoge > > nested piyo1 > > nested piyo2 > fuga ↑入力 / ↓出力 <blockquote> <p>hoge</p> <blockquote> <p>nested piyo1</p> <p>nested piyo2</p> </blockquote> <p>fuga</p> </blockquote> quote に入れるのは"> "の繰り返しのみで桶? >>141 はい、blockquoteは "> > "のように"> "の繰り返しで始まる行としてください。 簡単のために">>"のような入力は考慮不要として下さい。 お題 文字列を数値文字参照に変換してください 入力: 𝚙𝚛𝚘𝚐𝚛𝚊𝚖𝚖𝚒𝚗𝚐 𝚌𝚑𝚊𝚕𝚕𝚎𝚗𝚐𝚎𝚜 出力: 𝚙𝚛𝚘𝚐𝚛𝚊𝚖𝚖𝚒𝚗𝚐 𝚌𝚑𝚊𝚕𝚕𝚎𝚗𝚐𝚎𝚜 >>146 は不正なUnicode文字列の入力を考慮していませんでした 高位サロゲートが低位サロゲートを伴わず単独で現れていると、その直後の文字が抜け落ちます つまり "<\ud83c>" → "<�>" ではなく "<\ud83c>" → "<�" になってしまう 修正版: https://ideone.com/bz8cMe すごいどうでもいいことなんだけど、 ArrayListってどういうデータ構造なの? ArrayなのそれともListなの? おじさんわからないよ。。 >>149 お題 array listを実装してください 次の要項を満たしてください ・add, removeができること ・サイズが可変であること ・序数で要素にアクセスできること ・要素へのアクセスの計算量はO(1)もしくはO(log n)であること >>150 add, remove は任意箇所の挿入と一要素削除で桶? >>150 それがArrayListの要件? ありがとう >>154 >>150 ってただの可変長配列じゃないの? >>150 この問題の要件は >・要素へのアクセスの計算量はO(1)もしくはO(log n)であること だけでいいのかな? コレだけでいいならデータの更新時に常に深さが±1の二分木に納直せば必ず参照の計算量はO(log(n))になるし、毎回ソートして格納し直せば参照の(indexによる)計算量はO(1)になる希ガス データの更新時の制限は全くないでいいのかな? メモリが安くなったとはいえ やはりメモリの制限は必要では? 無尽蔵にあるわけではないので お題: 四方に広がる無限のサイズの方眼紙があって、1マス1マスに一個のアラビア数字を一度だけ記入できる。 方眼紙に記録したデータの一部は「仮想画面」に出力できる。 マス(x, y)に数字dを記入することを「P(x, y, d)」と表すことにする(x, yは任意の整数)。 (a) 3桁の自然数が2つ与えられる。その足し算の筆算を実演するアルゴリズムを出力するプログラムを書け。 (b) 任意の自然数が2つ与えられる。(以下略) 補記。 マス(x, y)にある数字を「P(x, y)」と表すことにする。マス(x, y)に数字がなければP(x, y)==0とする。 また、マス(x, y)に数字がなければE(x, y)==1とし、数字があればE(x, y)==0とする。 お題: ランダムな数列を生成せよ 数列の長さは4 <= len <= 20とし、これもランダムとする >>163 Ruby 3.0 p Array.new(rand(17) + 4){rand * 1e32} >>163 js const rand = (a, b) => Math.floor(Math.random() * (b - a + 1)) + a const range = (n) => [...Array(n).keys()] range(rand(4, 20)).map(Math.random) >>163 Kotlin または Kotlin script 以下は kotlinc コマンドで REPL で実行した時のコピー。 (先頭の >>> はプロンプト) >>> (1..(4..20).random()).map { kotlin.random.Random.nextInt() } res0: kotlin.collections.List<kotlin.Int> = [1712097059, 2034192723, -1232228362, 634194098, 1788814029, -1878195330, -2043751487, 933285281, 1116738696, -934057871, -1657983454, -1761832713, -1836302098, -902578867, -1306790359, 1824207694, 386095401, -389307033, 380242891, -2028767653] >>> 実行結果は何処にも出力しようとしてしていないが REPL なので自動で出力されている。 >>163 Ruby # こんな意味だと解釈した puts ( '%020b' % rand(1<<20) )[ 0, 4+rand(17) ] # ( 2進) '0000'-'00000000000000000000'..'1111'-'11111111111111111111' puts ( '%020d' % rand(1e20) )[ 0, 4+rand(17) ] # (10進) '0000'-'00000000000000000000'..'9999'-'99999999999999999999' お題 アルファベットの開始の文字、アルファベットの終了の文字を 入力としてうけとり下記のように文字列を出力してください 入力: a,k 出力: a ab abc abcd abcde abcdef abcdefg abcdefgh abcdefghi abcdefghij abcdefghijk 意味不明な途中省く sh & perl5 echo "a,k" | perl -lane 'm/(\w),(\w)/; print ($1..$2)' abcdefghijk >>169 Haskell import Data.List consecutiveAlph a z = tail $ inits $ [ a .. z ] main = mapM_ putStrLn $ consecutiveAlph 'a' 'k' ---- a ab abc abcd abcde abcdef abcdefg abcdefgh abcdefghi abcdefghij abcdefghijk >>169 # Ruby3.0 x = ("a".."k") x.inject{ p _1 _1 + _2 } >>169 Perl5 @a = split',', <>; print($a[0]..$_, "\n") for $a[0]..$a[1]; 実行結果 ~ $ echo 'a,k' | perl 19_169_a,k.pl a ab abc abcd abcde abcdef abcdefg abcdefgh abcdefghi abcdefghij abcdefghijk つか、これでよかったわ @a = eval <>; print($a[0]..$_, "\n") for $a[0]..$a[1]; お題 オセロのようなルールでひっくり返しを行う処理を実装せよ 変数のイメージ 0 = 置かれてない場所 1 = 黒 2 = 白 3 = 今のターンで置いた黒 入力:01202113112120 出力:01202222222120 >>177 それやと1が置かれたのか2が置かれたのかわからないのでは? 0123120のとき 1が置かれたとして0111120になるのか 2が置かれたとして0122220になるのか わからない >>177 haskell twosTurn x = let ( pre, ( '3' : post ) ) = span (/='3') x revOne y = let ( pre02 , post02 ) = span ( == '1' ) $ y ++ "0" twos = zipWith const ( repeat '2' ) pre02 in if ( head post02) == '0' then y else take ( length y ) ( twos ++ post02 ) revOne' = reverse . revOne . reverse in ( revOne' pre ) ++ "2" ++ ( revOne post ) sample = "01202113112120" main = print $ twosTurn sample >>177 Ruby board = '01202113112120' puts board puts board.sub( /2(1*)3(1*)2/ ){ "2#{'2'* ($1.size)}2#{'2' * $2.size}2" } >>182 は間違いでした board = '01202113112120' puts board puts board.sub( /2(1*)3/ ){ "2#{'2'* ($1.size)}3" }.sub( /3(1*)2/ ){ "3#{'2'* ($1.size)}2" }.tr( '3', '2' ) 仕様を出来るだけ簡潔にしたかったんだろうけどやり過ぎてモヤる 下位から 第1bit 駒有無 第2 駒種別 第3 now flag として 0:駒無し 1:白, 3:黒 5:白now, 7:黒now と置いてnowの結果を出力の方が良くね この問題の本命は、オセロを作るっていうお題にしたつもりじゃないからw スレに居る人はオセロくらい作ったことある人しかいないと思っているし ゲームのアルゴリズムの一端を文字列処理として見るのも可能っていう点な >>184 お前がそういうお題を新たに出せば良い。 >>184 Ruby board = [0b000,0b011,0b001,0b000,0b001,0b011,0b011,0b101,0b011,0b011,0b001,0b011,0b001,0b000].pack('C*') if board["\x05"] board = board.sub( /\01(\03*)\x05/ ){ "\01#{"\01"* ($1.size)}\x05" }.sub( /\x05(\x03*)\x01/ ){ "\x05#{"\x01"* ($1.size)}\x01" }.tr( "\x05", "\x01" ) else board = board.sub( /\03(\01*)\x07/ ){ "\03#{"\03"* ($1.size)}\x07" }.sub( /\x07(\x01*)\x03/ ){ "\x07#{"\x03"* ($1.size)}\x03" }.tr( "\x07", "\x03" ) end puts board.unpack('C*').map{|b| '0b%03b' % b.ord }.join(',') #=>0b000,0b011,0b001,0b000,0b001,0b001,0b001,0b001,0b001,0b001,0b001,0b011,0b001,0b000 >>169 octave https://ideone.com/li5G9s f = @(b, e) arrayfun(@(e) {b:e}, b:e); f('a', 'k') >>169 Perl5 コマンドラインからこんな風に入力して実行する。(実際に試した shell は bash) perl -ne 'chomp;@d=split/,/;print join("\n", map { join("", $d[0]..$_) } $d[0]..$d[1])."\n";' >>169 Ruby def f(a,b) (a..b).map{|c| [*a..c]*""} end puts f("a","k") お題 N個の時系列データが与えられる。i番目のデータはa_iである i=1〜Nについて、以下の条件を満たすx_iを出力せよ x_i : 直近c個でa_iが最大となるようなcのうち、最大のもの [入力] N a_1 a_2 ... a_N [出力] x_1 x_2 ... x_N (例1) 5 3 1 2 6 6 => 1 1 2 4 5 3 = max(3) 1 = max(1) //今までの中で最小 2 = max(1, 2) //直近2個で最大 6 = max(3, 1, 2, 6) //直近4個で最大 (直近3個でも最大だが、cの値として最大のものを選ぶ) 6 = max(3, 1, 2, 6, 6) //直近5個で最大(最大タイ) (例2) 3 100 10 1 => 1 1 1 上田隆一 シェル芸勉強会問題一覧 https://b.ueda.tech/?page=00684 色々な問題が掲載されている。 問題作りのヒントになるかも >>169 bat @echo off &setlocal set ALL=abcdefghijklmnopqrstuvwxyz call :RANGE a,k pause &exit /b :RANGE setlocal enabledelayedexpansion if "%1" GTR "%2" echo ERROR: Invalid argument&exit /b set STR=!ALL:*%1=%1! if not "%2"=="z" call set STR=%%STR:!ALL:*%2=!=%% :LENGTH set /a n+=1 if not "!STR:~0,-%n%!"=="" goto :LENGTH for /L %%n in (1,1,%n%) do echo !STR:~0,%%n! >>196 完全に全く意味がわからないお題を久々に見た ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる