X



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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2019/02/03(日) 11:21:53.20ID:72eosYJ+
プログラミングのお題スレです。

【出題と回答例】
1 名前:デフォルトの名無しさん
  お題:お題本文

2 名前:デフォルトの名無しさん
  >>1 使用言語
  回答本文
  結果がある場合はそれも

【ソースコードが長くなったら】 (オンラインでコードを実行できる)
https://ideone.com/
http://codepad.org/
http://compileonline.com/
http://rextester.com/runcode
https://runnable.com/
https://code.hackerearth.com/
http://melpon.org/wandbox
https://paiza.io/

宿題は宿題スレがあるのでそちらへ。

※前スレ
https://mevius.2ch.net/test/read.cgi/tech/1538096947/
0206デフォルトの名無しさん
垢版 |
2019/02/14(木) 21:20:53.44ID:IkVUbwNW
>>204

1つ目の #   は6個で2行3列が全て埋まります

###
###


2つ目の ### は2個で2行3列が全て埋まります

###
###


3つ目の #
     #   は3個で2行3列が全て埋まります

###
###


4つ目の ###
     ### は1個で2行3列が全て埋まります

###
###
0209デフォルトの名無しさん
垢版 |
2019/02/15(金) 02:40:42.39ID:YMyZWZCa
90度回転ありなら
#     #   #     #
 # と #  と  # と # 
で敷きつめられる(=全て埋まる)という意味だろうけど
>>179に抵触するので、これは無しでしょ
0210デフォルトの名無しさん
垢版 |
2019/02/15(金) 06:13:53.42ID:hXoOelh0
>>208
回転を許すっつってんだろ氏ねよ糞無能が
@_
_@
を90度回転させたら
_@
@_
だろうが
市ね糞野郎
0211デフォルトの名無しさん
垢版 |
2019/02/15(金) 08:54:29.71ID:nnYj1Xkq
>>209 ようやくわかった。
a_
_a
_b
b_
などと並んでるものは、全て同じパーツとみなすという意味か。

>>176 のお題をよく見ると、2 x 3 の正解の回答が書かれてる。 斜めは許していないからダメだろ。
また、回転も許していない。
回転を許すなら

■ ■
というパーツも入るがそれは除外されてるから、回転も無しだ。
0212デフォルトの名無しさん
垢版 |
2019/02/15(金) 10:38:13.03ID:NxGjA/1R
>>199のような飛び飛びのパターンまで含めると5x5くらいのサイズなら解けそうでも
10x10くらいの大きさになるとほぼ解けなくなるか?
0213デフォルトの名無しさん
垢版 |
2019/02/15(金) 11:04:50.72ID:bh7l703i
...
d0<-a
a->b
b->c
c->d
c'<-d
b'<-c'
a<-b'
d->a2
d<-a2
a2->b2
....
に対して
任意の英数字から初めて右向きの矢印をnこ進んだ英数字を一瞬で割り出す簡単な計算方法を教えろ
左向きの矢印のときも答えろ
ここで英数字には好きな整数の値を対応させろ
0215デフォルトの名無しさん
垢版 |
2019/02/15(金) 11:21:16.25ID:bh7l703i
新問題
...
g0<-a
a->b
b->c
c->d
c'<-d
b'<-c'
a<-b'
d->e
e->f
f->g
f'<-g
e'<-f'
g->a1
g<-a1
a1->b1
....
に対して
任意の英数字から初めて右向きの矢印をnこ進んだ英数字を一瞬で割り出す簡単な計算方法を教えろ
左向きの矢印のときも教えろ
ここで英数字には好きな整数の値を対応させろ
0218デフォルトの名無しさん
垢版 |
2019/02/15(金) 11:55:27.68ID:bh7l703i
自己解決しました
この問題には答えなくていいです
>>217
これからは英語で書くので許して下さい
0221デフォルトの名無しさん
垢版 |
2019/02/15(金) 12:43:47.27ID:JRF4Gyvi
わけのわからん問題が続くなあ・・・
0223デフォルトの名無しさん
垢版 |
2019/02/16(土) 02:08:44.97ID:3MiMTZ5E
しかしこの問題は回転を考えないと、曲がったパーツは不可能だね。
かなり単純化される。
0224デフォルトの名無しさん
垢版 |
2019/02/16(土) 02:11:07.89ID:vjYPWj7f
なんかスレが新しくなってから湧いてきたPythonのクソみたいなコード連投してる日本語がめちゃくちゃのやつうざい
0226デフォルトの名無しさん
垢版 |
2019/02/16(土) 02:35:08.75ID:zutWNq0P
2行3列で回転無しなら以下の4つが答え

#

###

#
#

###
###

回転ありなら更に以下の2つも

##
#

#
##
0228デフォルトの名無しさん
垢版 |
2019/02/16(土) 09:56:41.50ID:3oducOde
煽りではなく本当に発達障害またはそれに準ずる知的ボーダーを疑うレベルで頭悪いな
0231デフォルトの名無しさん
垢版 |
2019/02/16(土) 15:04:36.49ID:PD6v+6Vh
>>230 Perl5
use feature qw{current_sub say};

sub bblsort {
for (0..@_) {
sub {
if (@_ >= 2) {
__SUB__->(@_[1..$#_]);
($_[1], $_[0]) = ($_[0], $_[1])
if $_[0] > $_[1]
}
}->(@_[$_..$#_]);
}
}

use List::Util shuffle;
@a = shuffle 1..20;
say "1) @a";
bblsort @a;
say "2) @a";

実行結果
~ $ perl 13_230_bblsort.pl
1) 13 6 18 7 15 1 11 8 20 16 14 4 9 10 12 17 2 19 5 3
2) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
0232デフォルトの名無しさん
垢版 |
2019/02/16(土) 16:42:44.41ID:hxDCwUVz
お題:数値Xを4つの方法で整数に丸めよ
(1) 0に向かう
(2) 0から遠ざかる
(3) 正の無限大に向かう
(4) 負の無限大に向かう


X = 0.5
=> 0 1 1 0

X = -1.1
=> -1 -2 -1 -2

X = 3
=> 3 3 3 3
0233デフォルトの名無しさん
垢版 |
2019/02/16(土) 16:47:26.55ID:akVlWGeE
ふたたび、円の内部の整数点を求めるやつ。個数ごとその最小半径を求める。
41個、47個とかが難し目だった気が。
0236デフォルトの名無しさん
垢版 |
2019/02/16(土) 17:27:32.65ID:PD6v+6Vh
>>232 組み込み使っていいんだよね? (面倒になるけど、使わなくても書けるけどサ…)
Perl5

use POSIX qw(floor ceil);
for (0.5, -1.1, 3) {
@a = ("$_ => ",
sprintf('%d', $_), #int($_),
($_ > 0 ? ceil($_) : ceil($_-1)),
ceil($_),
floor($_)
);
print "@a\n";
}


実行結果
~ $ perl 13_232_round.pl
0.5 => 0 1 1 0
-1.1 => -1 -2 -1 -2
3 => 3 3 3 3
0237デフォルトの名無しさん
垢版 |
2019/02/16(土) 17:33:21.11ID:PfkkbXxw
>>230 Ruby
def bs(ary)
  ary.tap do |a|
    (a.size**2).times do
      (a.size - 1).times do |i|
        a[i + 1], a[i] = a[i, 2] if a[i] > a[i + 1]
      end
    end
  end
end
p bs([3, 1, 4, 15, 92]) # => [1, 3, 4, 15, 92]

>>232
sgn = -> n {n <=> 0}
r4 = -> n {n.floor}
r3 = -> n {-r4[-n]}
r2 = -> n {sgn[n] * r3[n.abs]}
r1 = -> n {sgn[n] * r4[n.abs]}

[0.5, -1.1, 3].each{|i| puts 'x = %p => %p %p %p %p' % [i, r1[i], r2[i], r3[i], r4[i]]}
# =>
x = 0.5 => 0 1 1 0
x = -1.1 => -1 -2 -1 -2
x = 3 => 3 3 3 3
0238デフォルトの名無しさん
垢版 |
2019/02/16(土) 17:34:37.44ID:PD6v+6Vh
>>236 これだと
入力が0のとき
>(2) 0から遠ざかる
が-1になっちゃう。

($_ > 0 ? ceil($_) : ceil($_-1)),

↓を

($_ >= 0 ? ceil($_) : ceil($_-1)),

とすべきでしょうね。スマソ
0239デフォルトの名無しさん
垢版 |
2019/02/16(土) 18:34:59.76ID:akVlWGeE
>>234
円周上が正解
0240デフォルトの名無しさん
垢版 |
2019/02/16(土) 22:05:48.79ID:lcFO2eao
>>262 J
f =: (**<.@|),(**>.@|),<.,>.
f 0.5
0 1 1 0

f _1.1
_1 _2 _1 _2

f 3
3 3 3 3
0242デフォルトの名無しさん
垢版 |
2019/02/16(土) 22:38:05.19ID:lcFO2eao
>>240
間違えました
262ではなく>>232でした
0244 ◆QZaw55cn4c
垢版 |
2019/02/17(日) 00:20:40.59ID:TOi2tzGo
>>232 をやろうとおもって、IEEE754 の float/double を直接触る方法を探しているのですが、なにかいい方法はないでしょうか…
0248デフォルトの名無しさん
垢版 |
2019/02/17(日) 08:30:18.08ID:SfPzlMrR
>>233
これ


「Nに対し平面上の円で、その円周上の整数点がちょうどN個となる円の最小半径を求めよ」

例)
x^2 + y^2 = 1の整数点は4つだが、最小半径ではない。
(x-0.5)^2 + (y-0.5)^2 = 0.5の方が小さい。
0249デフォルトの名無しさん
垢版 |
2019/02/17(日) 09:09:13.01ID:SfPzlMrR
>>248
網羅的は、きりがなく一つの予想をたてた。
一つ半径を求めたら、次のような操作で半径を縮めたものと、真の最小半径が一致する予想。

半径rの整数点がNだとして。 rを整数比で縮小して中心をずらす。

たとえば上の例だと、r=1で、r → 2/4 r で、
(2x -1)^2 + (2y -1)^2 = 2r
両辺4倍して中心ずらした式
0250デフォルトの名無しさん
垢版 |
2019/02/17(日) 14:03:58.61ID:SfPzlMrR
整数比かけるので有理数半径ならすべて作り出せるから当たり前か
無駄なく高速に半径縮められる手法が大事か
0251デフォルトの名無しさん
垢版 |
2019/02/17(日) 14:06:36.33ID:SfPzlMrR
あと半径は間違いで、半径でなく右辺、半径^2 だった
0252デフォルトの名無しさん
垢版 |
2019/02/17(日) 19:56:30.00ID:qArvPplr
お題
パンケーキソートを実装する
0253デフォルトの名無しさん
垢版 |
2019/02/18(月) 22:45:57.31ID:Gp2d+oGP
>>252 Perl5 (効率の良いアルゴリズムではないけれど、まずは…)

use List::Util shuffle;

@a = shuffle 1..20;
print "shuffled) @a\n";

sub flip {
($m, $n) = @_;
@a[0..$m] = reverse @a[0..$m];
@a[0..$n] = reverse @a[0..$n];
}

for $i (reverse 1..$#a) {
 $k = undef;
 for (0..$i) {
  $k = $_ if (!defined($k) or $a[$k] < $a[$_])
 }
 flip($k, $i) if $k < $i;
}

print "sorted ) @a\n";


実行例
~ $ perl 13_252_clumsy_pancake_sort.pl
shuffled) 18 6 2 13 16 1 12 15 10 4 17 20 9 7 19 14 5 11 3 8
sorted ) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
0254デフォルトの名無しさん
垢版 |
2019/02/19(火) 22:19:54.18ID:sIqHxZ1N
; Common Lisp

(defun flip (seq n)
 (concatenate (type-of seq) (nreverse (subseq seq 0 (1+ n))) (subseq seq (1+ n))))

(defun pancake-sort (seq predicate)
 (loop for s = seq
   then (if j (flip (flip (flip (flip s (1- j)) (1- i)) i) j) s)
   for i from 1 to (1- (length seq))
   for j = (position (elt s i) s :end i :test predicate)
   finally (return s)))
0255デフォルトの名無しさん
垢版 |
2019/02/19(火) 22:25:14.24ID:flzwRht/
お題:1から8までのカードを混ぜ、2枚そこから引いた時1枚目*10+2枚目が素数になる確率を求める。
ただし、
1. 小数第3位で四捨五入した後に回答すること。
2. 数学的な証明は禁止。
3. 各カードは9-その数字の数だけ存在する。 (例:1ならば8枚存在する)
4. 各カードが出る確率はまだ引かれていないカードの枚数に比例する。
0257デフォルトの名無しさん
垢版 |
2019/02/20(水) 00:55:56.83ID:SyQ4jkRO
>>255 Perl5
$R = 0.0;
@s = map{($_) x (9-$_)} 1..8; #say "@s";
$t = @s; #say $t;
for (qw{11 13 17 23 31 37 41 43 47 53 61 67 71 73 83}) {
 @o = split'';
 my %h;
 $h{$_}++ for @s;
 my $r = $h{$o[0]}-- / $t;
 $r *= $h{$o[1]}-- / ($t - 1);
 $R += $r;
}
printf "%3.2f\n", $R;

実行結果
~ $ perl 13_255.pl
0.31
0258さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/02/20(水) 00:58:27.33ID:5PEVWiZL
お題: URLで場所を指定された、インターネット上のテキストファイルをダウンロードするプログラム。
0259デフォルトの名無しさん
垢版 |
2019/02/20(水) 01:16:40.92ID:SyQ4jkRO
>>258 Perl5
require LWP::UserAgent;
$ua = LWP::UserAgent->new;
$ua->agent('Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)');
use HTTP::Cookies;
$ua->cookie_jar(HTTP::Cookies->new(file => 'lwp-cookies.txt', autosave => 1));
$url = 'http://ftp.iij.ad.jp/pub/linux/centos/7.6.1810/isos/x86_64/0_README.txt';
$file = './0_README.txt';
$res = $ua->mirror($url, $file);
print $res->status_line, "\n";

実行例
~ $ perl 13_258.pl
200 OK


(※こういうのは、別に今急に考えたわけじゃなく、日常的に作って使っているのですぐ投稿できました)
0264デフォルトの名無しさん
垢版 |
2019/02/20(水) 02:51:47.69ID:qYIek1dL
>>255
;; Common Lisp

(let ((prime (list 2)))
 (defun primep (n)
  (loop for i from (1+ (car prime)) upto n
      unless (find-if (lambda (j) (zerop (mod i j))) prime :from-end t)
      do (push i prime))
  (find n prime)))

(defun nearest (i j)
 (/ (floor (+ (* i (expt 10 j)) 0.5)) (expt 10 j)))

(loop with cards = (loop for i from 1 to 8 nconc (make-list (- 9 i) :initial-element i))
    and n = 0 and p = 0
    for one in cards
    do (loop for two in (remove one cards :count 1)
         do (incf n)
         if (primep (+ (* 10 one) two)) do (incf p))
    finally (format t "~,3F~%" (nearest (* (/ p n)) 3)))
0267デフォルトの名無しさん
垢版 |
2019/02/20(水) 03:43:59.14ID:J4bEIWoi
>>265
できるかなあ?どういう制限しているかにもよるぞ。
0268デフォルトの名無しさん
垢版 |
2019/02/20(水) 05:32:07.81ID:B2QSVSiS
PowerShell にも、curl, wget ある

get-alias (gal)

curl -> Invoke-WebRequest
wget -> Invoke-WebRequest

と言うことは、Ruby からも、そのコマンドを呼べる
0269268
垢版 |
2019/02/20(水) 09:30:07.43ID:B2QSVSiS
なんと、コマンドプロンプトで、
where curl と入力すると、
C:\Windows\System32\curl.exe

PowerShell の、curl, wget は、Invoke-WebRequest のエイリアスだけど、
curl.exe は、本物のcurl !
0271デフォルトの名無しさん
垢版 |
2019/02/20(水) 09:52:59.12ID:PF1BNO4k
>>258 >>265 なんだ下心があったのか。

pythonista stash は以下のコマンドが使える。

help(StaSh) v0.7.1
alias, cat, cd, clear, cowsay, cp, crypt, curl, cut, dropbox_setup, du, easy_config, echo, edit, exit, fg, find, ftpserver, gci, gh, git, grep, head, httpserver,
jobs, kill, latte, ls, mail, man, mc, md5sum, mkdir, monkeylord, more, mount, mv, openin, pbcopy,
pbpaste, ping, Usage, pip, printenv, printhex, ptinstaller, pwd, py-tree, python, python3, quicklook, rm, rmdir, scp, selfupdate, sha1sum, sha256sum,
sort, source, sqlite, ssh, ssh-keygen, stashconf, tail, tar, telnet, totd, touch, umount, uniq, unzip, version,
wc, webviewer, wget, whatis, which, wol, xargs, zip

ftpserver や、httpserverは簡易的なサーバーになる。
ssh やscp 、tar zip などは使い道多そう。
webviewer てpython の下でブラウザが立ち上がってるみたいなんだがどんな使い道があるんだろう?

なお、標準python用のシェルは、xonsh と言うのがあるらしい。 xonsh では、標準的なshellコマンドと並行してpython スクリプトも実行できるから強力。
stash ではそれはできない。
0272268
垢版 |
2019/02/20(水) 10:31:11.68ID:B2QSVSiS
WSH はわからないけど、Ruby では、

require 'nokogiri'

html = `curl http://www.example.com/`
# curl は書き込めないので、全角に変換した

doc = Nokogiri::HTML( html )

elements = doc.css( "h1" )
puts elements.first.content #=> Example Domain
0274デフォルトの名無しさん
垢版 |
2019/02/20(水) 13:03:16.05ID:agArr1lp
>>269
なんかね。UNIX系OSで昔からよく使われてたコマンドを移植したようで、tarとか他にも色々あったと思った。
0280デフォルトの名無しさん
垢版 |
2019/02/21(木) 19:06:17.90ID:TUYpSwcQ
>>279 JavaScript
const arr = ['apple', 'banana', 'orange', 'mango'];
const last = ' and ' + arr.pop();
console.log(arr.join`, ` + last);
//=> apple, banana, orange and mango
0282デフォルトの名無しさん
垢版 |
2019/02/21(木) 19:27:21.23ID:2zdYL4u2
>>279
Haskell

main = putStrLn.concat.concat $ [map addCanma (init lst),["and,"],[last lst]]

addCanma s = s ++ ","

lst = ["apple","banana","orange","mango"]



output:
apple,banana,orange,and,mango
0283デフォルトの名無しさん
垢版 |
2019/02/21(木) 19:31:58.30ID:lqQG1Hmj
題意は
list = ["red","green","black","white"]
print(", ".join(list[:-1]),"and",list[-1])
# red, green, black and white
だろ
0285デフォルトの名無しさん
垢版 |
2019/02/21(木) 19:51:21.05ID:2zdYL4u2
>>283
あ、そうか。
不恰好だけどこれで一応対応。

(putStrLn.concat.concat) [init $ map addCanma $ init lst,[last $ init lst],[" and "],[last lst]]

スマートな解答も考えてみるよ。
0287デフォルトの名無しさん
垢版 |
2019/02/21(木) 20:20:50.88ID:2zdYL4u2
スマートかは兎も角、一応マシな形に。
空リストや要素数1にも対応。

Haskell

main = putStrLn $ last2 lst

last2::[String] -> String
last2 [] = []
last2 [x] = x
last2 [x,y] = concat [x," and ", y]
last2 (x:xs) = x ++ "," ++ last2 xs

lst = map show [0..5]


output:
0,1,2,3,4 and 5
0288デフォルトの名無しさん
垢版 |
2019/02/21(木) 20:59:38.40ID:lqQG1Hmj
>>286
list = [str(x) for x in range(1,5)]
とか
map(lambda x : str(x), list)
でもおk

要素数が1個以下の場合はifで分離するだけなので略
0289デフォルトの名無しさん
垢版 |
2019/02/21(木) 21:09:47.73ID:y3+CYNZ6
>>279 Common Lisp
(format t "~{~@{~A~^~#,1^, ~}~^ and ~A~}~%" (list 1 2 3 4))
https://ideone.com/6DcwO9
0290デフォルトの名無しさん
垢版 |
2019/02/21(木) 21:21:18.07ID:lqQG1Hmj
intとstrが混在してる場合でも大丈夫で入力数が1以下ならそのまま返すワンライナー

python
print("".join(reversed(" ,".join(reversed([str(x) for x in list])).replace(",","dna ",1))))

JS+正規表現
console.log(list.join(", ").replace(/(.*),(.*?)+/,"$1 and $2"))

冷静に考えるとこの正規表現を使い回せばどの言語でもワンライナーなのでは
0291さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/02/21(木) 21:21:18.26ID:PQQkN+7n
ラティス、再び。

お題: >>99 の場合分けのラティス構造を使って、複数の入力文字列について、共通部分をまとめ、1つの文字列に凝縮せよ。

(例)
ああい
ああ
あう
→あ{{あ{い/}}/う}
0292デフォルトの名無しさん
垢版 |
2019/02/21(木) 21:30:40.21ID:lqQG1Hmj
よく考えたらreversedなんか使わんでも
print((" ,".join([str(x) for x in list][::-1]).replace(",","dna ",1))[::-1])
でいけるか。join削減できるし
0293さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/02/21(木) 21:32:52.15ID:3Jj6vI7v
出力文字列の長さは最短でなければならない。
場合分けの順序は問わないが、場合分けの項目について、ソートすることが望ましい。
0297デフォルトの名無しさん
垢版 |
2019/02/21(木) 22:55:49.76ID:2zdYL4u2
>>279
>>292

Haskellでもワンライナー出来たけど、読みやすいとは思えない。(横長だし)
発想としては(要素数2以上なら)最後以外の要素(文字列)の頭に','追加して、全部結合して(大きな文字列にして)最後に頭の','を省く。

main = putStrLn.tail.concat $ if length lst < 2 then lst else [(concat.(map (\x -> ',':x)).init) lst," and ",last lst]

lst = map show [0..5]

個人的に >>287 の方が発想も読みやすさも好みの書き方。
(読み難くなるなら関数分ける派)

pythonのはワンライナーでも比較的読みやすくて、ちょっと羨ましい。
0298デフォルトの名無しさん
垢版 |
2019/02/21(木) 22:59:16.06ID:2zdYL4u2
>>297
弄ってるうちに要素一以下だとバグ出てた。

正しいコードはこっち。

putStrLn.concat $ if length lst < 2 then lst else [(tail.concat.(map (\x -> ',':x)).init) lst," and ",last lst]
0299デフォルトの名無しさん
垢版 |
2019/02/21(木) 23:36:37.11ID:un6uIa3F
>>282 Perl5

sub f {
 my $a = shift;
 @_ ? (@_ > 1 ? "$a, " : "$a and ").f(@_) : $a
}

use feature say;

say f(qw[red green black white]);
say f(qw[apple banana]);
say f(qw[one]);


実行結果
~ $ perl 13_279_and.pl
red, green, black and white
apple and banana
one
0301デフォルトの名無しさん
垢版 |
2019/02/22(金) 00:07:27.55ID:wSgiM5bY
>>299
アンカー間違えた >>279 宛だった…orz


>>279 もう一丁 Perl5

sub g {
 my $z = ' and '.pop @_ if @_ > 1;
 join(', ', @_).$z;
}

use feature say;
say g(qw[red green black white]);
say g(qw[apple banana]);
say g(qw[one]);

実行結果
~ $ perl 13_279_and_2.pl
red, green, black and white
apple and banana
one
0305デフォルトの名無しさん
垢版 |
2019/02/22(金) 06:09:02.19ID:HhIJRo4K
>>279
Smalltalk (Pharo 7)

#('apple' 'banana' 'orange' 'mango') asCommaStringAnd
==> 'apple, banana, orange and mango'

#('apple' 'banana') asCommaStringAnd
==> 'apple and banana'

#('apple') asCommaStringAnd
==> 'apple'
■ このスレッドは過去ログ倉庫に格納されています

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