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

■ このスレッドは過去ログ倉庫に格納されています
2019/07/28(日) 19:39:57.54ID:832c/ukY
プログラミングのお題スレです。

【出題と回答例】
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/

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

※前スレ
プログラミングのお題スレ Part14
http://mevius.5ch.net/test/read.cgi/tech/1558168409/
2019/08/02(金) 20:54:30.15ID:Awh9QXRy
123を入力したときに132が出力されないのはなぜ?
2019/08/02(金) 21:09:12.36ID:ec2C26mu
パーミュテーション作って終わりじゃあないのコレ
2019/08/02(金) 21:52:24.70ID:TUgs2HTj
>>49
ミスだよぉ!
52デフォルトの名無しさん
垢版 |
2019/08/02(金) 22:45:44.46ID:T1FFAKuC
そんなんばっかだなお前
2019/08/03(土) 01:06:14.19ID:0ts56itm
>>48
https://ideone.com/fyfMQH
C++。ご期待通り(?)にパーミテーション回してみたよ。
重いお。
2019/08/03(土) 10:23:36.04ID:t/Tc4Qxr
https://ideone.com/pgG7pT

from itertools import permutations

#string = "123"
string = "5672391"
n = int(string)
print filter(lambda m: m>n, map(lambda x: int("".join(x)), list(permutations(string, len(string)))))
2019/08/03(土) 10:27:27.22ID:9AEx1UEu
なんて早いんだ
2019/08/03(土) 11:19:47.14ID:4CYzcJxv
「大きくできなければ元の数字をそのまま出力せよ」という条件が
ことごとく無視されててワロタ

あと、「133」みたいに同じ数字が複数含まれる場合はどうなるべきなんだろう
2019/08/03(土) 11:39:39.93ID:xpWLAw2C
>>48 Perl5

sub next_permutation {
 defined $_[1] and
  (next_permutation(@_[1..$#_]) or
   ($_[0] lt $_[1]) and
   do {
    for (1..$#_)
{$_[0] lt $_[$_] ? $i = $_ : last}
    @_[0, $i] = @_[$i, 0];
    @_[1..$#_] = reverse @_[1..$#_];
    1 })
 }

#$v = '123';
$v = '5672391';

@a = sort split '', $v;
do {
 $n = join '', @a;
 print "$n " if $n > $v;
} while next_permutation @a;

実行結果
https://ideone.com/qeSGDm

CPANなどにあるPermutation計算モジュールを使用しても良いけど、
言語処理系に標準で含まれるモジュールではなく別途インストールが必要なので、
昔書いたnext_permutation iteratorを使ってみた
2019/08/03(土) 11:43:50.21ID:xpWLAw2C
>>57 ごめんなさい
print "$n " if $n > $v;

print "$n " if $n >= $v;

じゃないと「大きくできなければ元の数字をそのまま出力せよ」を満たさなかった…orz
2019/08/03(土) 11:49:41.56ID:xpWLAw2C
>>58 そうすると逆に
「元の数「より大きくなる」ように再構築せよ」
については、元の数値が余計に出力されるな…ゴメンねもう一工夫要るわ
それにiteratorである必要ないわ
2019/08/03(土) 12:09:48.13ID:xpWLAw2C
>>48 Perl5、iteratorじゃなくpermutationを列挙する方法で書いてみた。これなら題意に合うはず。

sub permu {
 my ($l, $p, @r) = @_;
 defined $p ? map {[$p, @$_]} permu([], @$l, @r) : ([])
 ,
 @r ? permu([@$l, $p], @r) : ()
}

#$v = '123';
#$v = '321';
$v = '5672391';

@a = split '', $v;
@b = grep {$_ > $v} map{join('', @$_)} permu [], @a;

print (@b ? "@b" : $v);


実行結果
https://ideone.com/1Lft75

少しメモリを食ってるだろうけど0.04sで解けた
2019/08/03(土) 16:01:35.10ID:XF8eWPn5
>>48 Squeak/Pharo Smalltalk

| fn res |
fn := [:input |
(Array streamContents: [:ss |
input permutationsDo: [:perm | perm > input ifTrue: [ss nextPut: perm copy]]]
) ifEmpty: [input]
].

fn value: '123'. "=> #('132' '213' '231' '321' '312') "
fn value: '921'. "=> '921' "
{#ms -> [res := fn value: '5672391'] timeToRun. #size -> res size}. "=> {#ms->6 . #size->2438} "
2019/08/03(土) 19:53:41.57ID:0ts56itm
>>48だけど、>>56の要件を見落としていたので入れてみたよ。
https://ideone.com/h2KrQu
C++。
2019/08/04(日) 03:52:38.60ID:vnZdN6SP
>>56で指摘したのに誰も反応してくれないので自分で書く
>>54は、「133」と入れると[313,331,313,331]みたいに結果がダブる
2019/08/04(日) 04:17:02.39ID:vnZdN6SP
>>62
C++のnext_permutationは、辞書順で次に来る順列が返るので、
最初の並びにnext_permutationを繰り返し適用すれば題意を満たす数列が得られる。
あと、自前で桁分割するより他言語のように文字列を使った方が楽だと思う。
2019/08/04(日) 08:30:18.20ID:FnmDNXLj
>>48
@Mathematica

rebuildLargerN[n_]:=n//
  IntegerDigits//
  Permutations//
  Map[FromDigits,#]&//
  Select[#,#>n&]&//
  If[#!={},#,{n}]&;

In[1] := rebuildLargerN[123]
Out[1] = {132, 213, 231, 312, 321}

In[2] := rebuildLargerN[921]
Out[2] = {921}
2019/08/04(日) 11:42:59.33ID:1+0Vj0jh
>>63
オレのPerl5の>>60も桁に重複があると出力はダブるよ。
ダブった出力で良いかあるいは1つに削減して出力するか
仕様は不定なので、ダブる可能性があってもそのまま出した。
ダブらせず1つだけ出力すにはsortしてuniqすればいいんだけど。
@b = grep {$_ > $v} map{join '', @$_} permu [], @a;

%h = map{$_ => 1} sort grep {$_ > $v} map{join '', @$_} permu [], @a;
@b = keys %h;
2019/08/04(日) 13:27:01.79ID:FYuOH6vI
https://ideone.com/mBo1rR
C++.
>>63のダブって表示はならないですね。
文字列だと、自分はいいけど、数字に限定するのが面倒なので、大きな数で処理してます。
文字を許容するんであればお題で書いておけばそのようになるんじゃないですかね??
2019/08/04(日) 13:29:31.62ID:FYuOH6vI
あ、そうだった。文字列だと自分より大きいを表現するのがめんどくさいのでした。
2019/08/05(月) 21:32:05.80ID:OFOHGnJp
>>48
https://ideone.com/1mtrVl
C++。暇だったので、文字列版作った。
でかい数のデバッグが大変だから手抜きだ。
ご査収ください。。。
2019/08/05(月) 22:51:54.50ID:AzW+f4x5
>>48 C++
https://ideone.com/6HQBYE
>>64で説明したかった内容をコードにしてみた

なお、pythonとc++のpermutationは、同じ値が含まれる時の動作が異なる
https://stackoverflow.com/questions/6534430/why-does-pythons-itertools-permutations-contain-duplicates-when-the-original
2019/08/06(火) 14:56:22.80ID:1YPxJa8a
お題@閑話休題。
https://ja.wikipedia.org/wiki/AKS素数判定法
AKSの実装。Prime is in P.
自分は挫折しました。数学解らない。

残骸:https://ideone.com/9e7Tyn
2019/08/06(火) 14:57:44.83ID:1YPxJa8a
>>70
そういえば、ソートする必要ないね。
書いてるときは保証できなかったから思いつきもしなかった。
2019/08/06(火) 18:46:19.50ID:/2t+ALeN
お題: スターリンソートを実装せよ
2019/08/06(火) 19:06:50.12ID:Uq1zh0Vl
>>73
seq 300|sort -R | perl -ne ' if ($. == 1){print ; $hold = $_} elsif ($_ > $hold) { print ; $hold = $_}'
140
145
231
246
248
270
272
281
298
299
300
2019/08/06(火) 20:18:34.06ID:1YPxJa8a
>>73
要素粛清しながら見た目がそろっているというギャグかいな。
2019/08/06(火) 20:54:47.97ID:1YPxJa8a
https://ideone.com/hhy72i
C++。よく生き残った我が精鋭たちよ。
ところで・・・。
2019/08/07(水) 15:33:52.56ID:ts1kCtnm
>>73 Squeak/Pharo Smalltalk

| fn |

fn := [:array |
| memo |
memo := array first.
array reject: [:x | x < memo flag: (memo := x max: memo)]
].

fn value: (1 to: 300) asArray shuffled. "=> #(65 116 195 235 276 280 293 299 300) "
2019/08/08(木) 00:35:30.37ID:X/CTiqlR
>>73
しばらくお題がないとおちつかないな
seq 300|sort -R | perl -ne ' if ($. == 1 or $_ > $hold) { print ; $hold = $_}'
2019/08/08(木) 10:41:16.59ID:Q6oNbeov
>>73

ss = -> a {a.reduce([]){|r, e| r.first.nil? ? [e] : r.last < e ? r + [e] : r}}

p ss[[3,1,4,1,5,9,26,53,58,97,93,238]] # =>
[3, 4, 5, 9, 26, 53, 58, 97, 238]
2019/08/09(金) 00:37:57.26ID:F1quTbHl
>>73 Perl5

use List::Util 'max';
@a = qw{3 1 4 1 5 9 26 53 58 97 93 238};
@b = grep {$n < $_ and $n = max($n, $_)} @a;
print "@b\n";


実行結果
~ $ perl 15_73.pl
3 4 5 9 26 53 58 97 238
2019/08/09(金) 00:53:52.15ID:ZZ2ybqZz
お題: 太陽系の各天体の位置を物理シミュレーションし、64日後の地球の位置を求めよ。
2019/08/09(金) 01:17:32.06ID:JH0KcGUq
俺たちって計算能力でコペルニクスを超えられると思う? NASAのデータがあるから昔よりも楽だと思うけど。
2019/08/09(金) 01:27:37.54ID:F1quTbHl
>>73 Perl5、 >>80 よりこっちの方が若干スマート

$n = -inf;
@a = qw{0 3 1 4 1 5 9 26 53 58 97 93 238};
@b = grep {$n < $_ and ($n = $_), 1} @a;
print "@b\n";


実行結果
~ $ perl 15_73.pl
0 3 4 5 9 26 53 58 97 238
2019/08/09(金) 04:16:04.61ID:eE0IZ4mx
>>83
ちょっとおもしろい
2019/08/09(金) 08:43:53.16ID:Pwzp9noT
>64

地球の位置といってもいろいろあります。
地球の赤道を天球上に投影した、「赤経、赤緯」、太陽の天球上の
通り道を天球上に投影した「黄経、黄緯」がありますし、それも、地球の中心を
原点とした、「地心赤経、赤緯」、「地心黄経、黄緯」および、観測地点を原点とした
「地表赤経、赤緯」、「地表黄経、黄緯」もありますので、どれにするかによって
計算式が違ってきます。
なお、JPLでは、太陽と月、および冥王星までの精密位置計算用のプログラムを
発表しています。
期間がながいものは、−4000(B.C.4001)〜4000(A.D.)まで、計算できるものが
あります。
計算用のデータと、テスト用のFortranプログラムも附属しています。
2019/08/09(金) 12:56:08.85ID:1/DU+veY
Perlって読みにくいんだな
{とか@とか$とか使いまくる言語ってマジ苦手
87デフォルトの名無しさん
垢版 |
2019/08/09(金) 13:03:13.21ID:OfLBByV9
RubyとPHPにケンカ売ってんの?
2019/08/09(金) 13:05:45.59ID:weGJYw8v
grep 内のboolian から最後の , 1 を取り除いたら
最初の0を拾わない
何というカオス
2019/08/09(金) 13:27:04.59ID:F1quTbHl
@b = grep {$n < $_ and {$n = $_}} @a;
こうやりゃいいんだよ
2019/08/09(金) 13:51:55.80ID:3hMObOjl
この方がいいだろ
@b = grep {$n < $_ and ($n = $_, 1)} @a;
2019/08/10(土) 22:54:55.68ID:wV6Kn1Zu
お題:
与えられた数列の要素の中で他と被っていない最小のものを求めよ
被っていない要素が存在しないときは-1を出力すること

例:
1,1,1,1,2,2,2,3,3,4 -> 4
1,2,3,4,5,5,4,3,2,1 -> -1
3,1,4,1,5,9,2,6,5,3,5 -> 2
2019/08/11(日) 00:46:36.68ID:In4DYV8Y
>>91 Perl5

use feature say;
use List::Util min;
for ([1,1,1,1,2,2,2,3,3,4], [1,2,3,4,5,5,4,3,2,1], [3,1,4,1,5,9,2,6,5,3,5]) {
 my %h;
 $h{$_}++ for @$_;
 @s = grep{1 == $h{$_}} keys %h;
 $" = ',';
 say "@$_ -> ", @s ? min @s : -1;
}

実行例
~ $ perl 15_91.pl
1,1,1,1,2,2,2,3,3,4 -> 4
1,2,3,4,5,5,4,3,2,1 -> -1
3,1,4,1,5,9,2,6,5,3,5 -> 2
2019/08/11(日) 01:44:41.14ID:GTeyRs5o
>>91
perl5
http://ideone.com/vj47th
2019/08/11(日) 06:08:19.60ID:0wbGlMwh
>>91 Ruby

f = -> a {a.sort.group_by{|e| a.count(e)}[1]&.min || -1}

[
[1,1,1,1,2,2,2,3,3,4],
[1,2,3,4,5,5,4,3,2,1],
[3,1,4,1,5,9,2,6,5,3,5]
].each{|a| puts '%p => %s' % [a, f[a]]} # =>
[1, 1, 1, 1, 2, 2, 2, 3, 3, 4] => 4
[1, 2, 3, 4, 5, 5, 4, 3, 2, 1] => -1
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] => 2
2019/08/11(日) 06:11:31.27ID:0wbGlMwh
typo

f = -> a {a.uniq.group_by{|e| a.count(e)}[1]&.min || -1}
2019/08/11(日) 12:01:23.99ID:tGfhCIDM
>>91 ruby
[ [1,1,1,1,2,2,2,3,3,4], [1,2,3,4,5,5,4,3,2,1], [3,1,4,1,5,9,2,6,5,3,5] ].each{|ar|
print ar.join(','), " -> "
while (m = ar.min) && ar.count( m ) != 1
ar.delete( m )
end
puts m || -1
}

1,1,1,1,2,2,2,3,3,4 -> 4
1,2,3,4,5,5,4,3,2,1 -> -1
3,1,4,1,5,9,2,6,5,3,5 -> 2
2019/08/11(日) 13:17:24.76ID:In4DYV8Y
>>91 Perl5 >>92 よりもう少しシンプルに

use List::Util min;
for ('1,1,1,1,2,2,2,3,3,4', '1,2,3,4,5,5,4,3,2,1', '3,1,4,1,5,9,2,6,5,3,5') {
 my %h;
 $h{$_}++ for split ',';
 $s = min grep{1 == $h{$_}} keys %h;
 $s //= -1;
 print "$_ -> $s\n";
}

実行結果
~ $ perl 15_91.pl
1,1,1,1,2,2,2,3,3,4 -> 4
1,2,3,4,5,5,4,3,2,1 -> -1
3,1,4,1,5,9,2,6,5,3,5 -> 2
2019/08/11(日) 13:23:49.66ID:NLZMdOh3
お題: 数独を素早く解くプログラム(ソルバー)。
99デフォルトの名無しさん
垢版 |
2019/08/11(日) 16:53:20.83ID:RYQKURZ1
昔々Cで数独解くやつ普通に作ったことあるけど普通に作っても人間の感覚では一瞬にして答えが出ちゃうんだよな。ほとんどEnterキー押したらすぐ出る感じ。
そしてこれといって他にアルゴリズムは思い浮かばない。(誰もが思い付くであろう再起でマスに入れられる数を順番に入れてく方式ね)。

これ以上に「素早く」やる方法なんてあるんだろうか?
2019/08/11(日) 16:59:48.87ID:z7uw92+V
>>91
https://ideone.com/1JCuiv
C++。一応例題は解けたが妖しい処理になった。
2019/08/11(日) 17:06:50.80ID:z7uw92+V
>>91
https://ideone.com/oSQNZM
C++。これでどうじゃ。
バケットソートでいいじゃないか。プンプン。
2019/08/11(日) 17:17:47.99ID:z7uw92+V
#include <map>
template<class Container>
std::int64_t MakeHoge(const Container& D) {
std::map < Container::value_type, std::uint64_t> M;

for (auto& o : D) {
M[o]++;
}
for (auto& o : M) {
if (o.second == 1) {
return o.first;
}
}
return -1;
}

詰めまくってみた。C++。
2019/08/11(日) 17:20:29.72ID:z7uw92+V
#include <map>
template<class Container>
std::intmax_t MakeHoge3(const Container& D) {
std::map < Container::value_type, std::uintmax_t> M;

for (auto& o : D) {
M[o]++;
}
for (auto& o : M) {
if (o.second == 1) {
return o.first;
}
}
return -1;
}
しつこいけど、これ以上は無理ってくらい詰めた。
2019/08/11(日) 17:25:40.33ID:z7uw92+V
どうでもいいのですけど、MITライセンス。知ってますね。
2019/08/11(日) 17:33:34.70ID:NLZMdOh3
名無しにライセンス
2019/08/11(日) 17:43:12.84ID:z7uw92+V
https://ideone.com/Cu9Dix
C++。大オチ。
駄文書きすぎた。
107デフォルトの名無しさん
垢版 |
2019/08/11(日) 18:40:15.26ID:2JPwQqrg
prologのコード見せてよ
2019/08/11(日) 18:56:28.74ID:NLZMdOh3
お題: 論文「数独パズルの難易度判定」(大阪工業大学)を読んで、数独の難易度を判定するプログラムを作れ。
2019/08/11(日) 19:37:12.10ID:EWNjTlvC
>>108
吸う毒難易度判定
初期値の与えられているマスが22以下:難問
22以上:簡単
2019/08/11(日) 19:48:53.81ID:NLZMdOh3
論文無視かよ
2019/08/11(日) 19:52:40.36ID:GTeyRs5o
お題出す前にその論文を簡約してよ
2019/08/12(月) 00:58:03.04ID:DPPVhuFK
>>91 Pharo/Squeak Smalltalk

| fn |
fn := [:arr | (arr asBag sortedElements detect: [:kv | kv value = 1] ifNone: [-1 -> 0]) key].

fn value: #(1 1 1 1 2 2 2 3 3 4). "=> 4 "
fn value: #(1 2 3 4 5 5 4 3 2 1). "=> -1 "
fn value: #(3 1 4 1 5 9 2 6 5 3 5). "=> 2 "
113デフォルトの名無しさん
垢版 |
2019/08/12(月) 05:25:28.42ID:+GFDKMmL
>>91
Kotlin
https://paiza.io/projects/7gZ5wu2acBho-erGVG_X6Q
2019/08/12(月) 21:41:34.96ID:qMi+e5AX
>>91 Perl5 >>97 もう少しスマートに

for ('1,1,1,1,2,2,2,3,3,4', '1,2,3,4,5,5,4,3,2,1', '3,1,4,1,5,9,2,6,5,3,5') {
 my %h;
 $h{$_}++ for eval;
 ($s) = sort grep{1 == $h{$_}} keys %h;
 $s //= -1;
 print "$_ -> $s\n";
}


実行結果
~ $ perl 15_91_3.pl
1,1,1,1,2,2,2,3,3,4 -> 4
1,2,3,4,5,5,4,3,2,1 -> -1
3,1,4,1,5,9,2,6,5,3,5 -> 2
2019/08/13(火) 07:30:43.99ID:kJJDzO2R
>>91
Ruby で

# 数字の配列の配列。改行は削除
nums = <<"EOT".lines( chomp: true ).map{ |str| str.split( "," ).map( &:to_i ) }
1,1,1,1,2,2,2,3,3,4
1,2,3,4,5,5,4,3,2,1
3,1,4,1,5,9,2,6,5,3,5
EOT

results = nums.each_with_object( [ ] ) do |ary, results|
uniq_ary = ary.uniq # 重複排除
uniq_ary.sort! # ソート

res = -1
uniq_ary.each do |num|
if ary.count( num ) == 1
res = num; break
end
end
results.push res
end

p results #=> [4, -1, 2]
116デフォルトの名無しさん
垢版 |
2019/08/14(水) 01:39:36.14ID:G04CimIq
>>91
VB
https://paiza.io/projects/DJNbrsQFWtBDXhtNjmJ9xQ
117デフォルトの名無しさん
垢版 |
2019/08/14(水) 01:45:59.79ID:spdKRMJM
>>116
うわぁ…山中俊次かよ
118115
垢版 |
2019/08/14(水) 03:01:09.16ID:ms62dfnn
>>91
Ruby で、>>115 を修正した

# 数字の配列の配列。改行は削除
nums = <<"EOT".lines( chomp: true ).map{ |str| str.split( "," ).map( &:to_i ) }
1,1,1,1,2,2,2,3,3,4
1,2,3,4,5,5,4,3,2,1
3,1,4,1,5,9,2,6,5,3,5
EOT

def resolve( ary )
# 数字の出現回数を数える。Hash の初期値は、0
hash = ary.each_with_object( Hash.new( 0 ) ) {
|num, hash| hash[ num ] += 1 }

hash_2 = hash.select { |key, val| val == 1 } # 1回のもの
# キーでソートして、最小の数字を返す
number = Hash[ hash_2.sort ].keys.first
number = -1 if number == nil
number
end

p nums.map { |ary| resolve ary } #=> [4, -1, 2]
119115
垢版 |
2019/08/15(木) 05:28:22.88ID:5MxOdPEK
>>118
の、resolve 関数を修正

# キーでソートして、最小の数字を返す
>number = Hash[ hash_2.sort ].keys.first
pair = Hash[ hash_2.sort ].first # [ key, value ]

keys を使うと、ハッシュのキー配列が作られるため、処理が多くなるので、修正します

def resolve( ary )
# 各数字の出現回数を数える。Hash の初期値は、0
hash = ary.each_with_object( Hash.new( 0 ) ) {
|num, hash| hash[ num ] += 1 }

hash_2 = hash.select { |key, val| val == 1 } # 1回のもの
# キーでソートして、最小の数字を返す
pair = Hash[ hash_2.sort ].first # [ key, value ]
if pair == nil
number = -1
else
number = pair[ 0 ] # key
end
number
end
2019/08/16(金) 00:38:41.91ID:eRShYMGh
お題: 任意の2桁の自然数の各桁を、1桁になるまで掛け算する回数の最大回数とその数を示せ

15なら1x5=5と1回
93なら9x3=27, 2x7=14, 1x4=3と3回
2019/08/16(金) 01:31:17.83ID:eRShYMGh
>>120
最後1x4=3じゃなくて1x4=4だった
2019/08/16(金) 04:22:25.57ID:JO1Ik9g1
>>120
common lisp
https://pastebin.com/dAXgwYYX

出力
15=>(5 1)
93=>(4 3)
66=>(8 3)
51=>(5 1)
52=>(0 2)
61=>(6 1)
11=>(1 1)
2019/08/16(金) 04:32:18.49ID:4vR5Al7i
>>120 Ruby 1桁以上に拡張してみた
def colmul( val )
n = 0
while val >= 10
ans = 1
begin
val, c = val.divmod( 10 )
ans *= c
n += 1
end while val >= 10
val *= ans
end
[n, val]
end

[15,93, 77, 123].each{|n|
puts "%5d %3d %d" % [n, *colmul( n )]
}
実行結果
15 1 5
93 3 4
77 4 8
123 2 6
2019/08/16(金) 07:11:52.40ID:idyJWhoT
>>120 Squeak Smalltalk (Pharo では若干の修正が必要)

| fn ans |

fn := [:n |
| count digits |
count := 0.
[(digits := n asString asArray collect: #digitValue) size > 1]
whileTrue: [n := digits reduce: #*. count := count + 1].
count
].

ans := Set with: nil->0.

fn value: 15. "=> 1 "
fn value: 93. "=> 3 "
fn value: 277777788888899. "=> 11 "

(1 to: 9) do: [:i |
(i to: 9) do: [:j |
| kv m |
kv := (m := i * 10 + j) -> (fn value: m).
kv value = ans anyOne value ifTrue: [ans add: kv].
kv value > ans anyOne value ifTrue: [ans removeAll; add: kv]
]
].

^ans asArray "=> {77->4} "
2019/08/16(金) 09:55:22.61ID:w6EX52R7
>>120 python
from operator import mul
def kake(n, ls):
__m = reduce(mul, map(lambda x:int(x), list(str(n)) ) )
__ls.append(m)
__if len(str(m)) == 1:
____return
__kake(m, ls)

test = [0, 1, 9, 11, 15, 51, 52, 61, 66, 77, 93, 123, 277777788888899]
for n in test:
__ls = []
__kake(n, ls)
__print "n="+str(n)+", "+"list="+str(ls)+", "+"len="+str(len(ls))+", "+"last="+str(ls[-1])

実行結果
n=0, list=[0], len=1, last=0
n=1, list=[1], len=1, last=1
n=9, list=[9], len=1, last=9
n=11, list=[1], len=1, last=1
n=15, list=[5], len=1, last=5
n=51, list=[5], len=1, last=5
n=52, list=[10, 0], len=2, last=0
n=61, list=[6], len=1, last=6
n=66, list=[36, 18, 8], len=3, last=8
n=77, list=[49, 36, 18, 8], len=4, last=8
n=93, list=[27, 14, 4], len=3, last=4
n=123, list=[6], len=1, last=6
n=277777788888899, list=[4996238671872L, 438939648, 4478976, 338688, 27648, 2688, 768, 336, 54, 20, 0], len=11, last=0
2019/08/16(金) 10:19:15.90ID:s+gRsoB0
>>120 Ruby

f = -> n {[(1..).find{10 > n = n.divmod(10).reduce(:*)}, n]}

(10..99).group_by{|i| f[i]}.max.tap{|m| m.last.each{|v| puts '%dは%d回で%dになる.' % [v, *m.first]}}

# => 77は4回で8になる.
2019/08/16(金) 11:35:03.96ID:Y33v+D/I
>>120 Perl5

use List::Util reduce;
for (qw{15 93 123 277777788888899}) {
 ($n, $i) = ($_, 0);
 while (1 < length $n) {
  $n = reduce {$a * $b} split '', $n;
  $i++;
 }
 print "$_ -> $i回で $nになる\n";
}

実行結果
~ $ perl 15_120.pl
15 -> 1回で 5になる
93 -> 3回で 4になる
123 -> 1回で 6になる
277777788888899 -> 11回で 0になる
128デフォルトの名無しさん
垢版 |
2019/08/16(金) 11:40:17.74ID:FoYt1ZXR
実用上、意味のないことは寝言という。
2019/08/16(金) 11:52:49.37ID:38QTrPdc
グッスリお休み。
2019/08/16(金) 17:08:53.11ID:/mNc+3sP
>>120
https://ideone.com/uOlN2E
C++. 暇だったので基数いじれるようにした。
ただし、デバッグはしてない。
2019/08/16(金) 19:41:08.88ID:4vR5Al7i
2x7x7x7x7x7x7x8x8x8x8x8x8x9x9=4996238671872
この段階で、掛け算14回じゃなくて1回になるの?
132デフォルトの名無しさん
垢版 |
2019/08/16(金) 21:11:10.70ID:UOmTAtC9
元のお題は2桁の自然数なのでそれよりも桁が多いならその場合のルールも決めないとダメだろうな。
2019/08/16(金) 22:49:37.86ID:WXGx/ZZ4
> 2x7x7x7x7x7x7x8x8x8x8x8x8x9x9=4996238671872
を1回としても14回としても解き方はたいして変わらんからどっちでもいいと思う
とりあえず回答例見たら1回としてるみたいだから1回の方でいいんじゃね
2019/08/17(土) 05:49:01.88ID:He41kTu9
>>120
common lisp
https://pastebin.com/ZcaYiA3N
任意の自然数に拡張した

split-num を実装してて思った
perl の数字と文字を自由に行き来できる cool型マジcool
2019/08/17(土) 05:57:53.54ID:He41kTu9
15=>(5 1)
93=>(4 3)
198=>(4 3)
468=>(8 3)
738=>(6 4)
793=>(4 4)
1748=>(6 3)
2019/08/17(土) 15:01:05.32ID:m7Zf+/1R
>>120 Perl5

use feature current_sub;
use List::Util reduce;
for (qw{15 93 123 277777788888899}) {
 $i = 0;
 $n = sub {
  return shift if 1 == @_;
  $i++, __SUB__->(split'', reduce {$a * $b } @_);
 }->(split'');
 print "$_ -> $i回で $nになる\n";
}

実行結果
~ $ perl 15_120_2.pl
15 -> 1回で 5になる
93 -> 3回で 4になる
123 -> 1回で 6になる
277777788888899 -> 11回で 0になる
2019/08/17(土) 15:58:34.13ID:hkO+8710
お題: オカダンゴムシには進行中に壁にぶつかると左へ、次は右へ(あるいは右へ、次は左へ)と交互に曲がっていく習性がある。この行動は「交替性転向反応」といい、左右に交互に曲がる事で天敵から逃げられる確率を高めているといわれている(ウィキペディアより引用)。

何もない整数平面上にスタート地点(S)とゴール地点(G)が与えられる。仮想ダンゴムシ(@)の周辺に壁(#)をいくつか作って、スタート地点からゴール地点まで誘導せよ。
ただし、ダンゴムシは最初は右向きを向いていて、最初にぶつかったら左に曲がるものとする。
90度曲がって目の前にすぐに壁がある場合は同じ方へもう90度曲がるものとする。壁はいくつ作ってもよい。

例) S=(0, 0), G=(5, 2)
→#={(6, 0)}.
例) S=(1, 2), G=(-1, 1)
→#={(2, 2), (1, 3), (0, 2), (1, 0)}.
2019/08/17(土) 16:18:33.55ID:RHoMoFJP
>>137
ダンゴムシは初手でどこに向いてるの?北?Y+?X+?
2019/08/17(土) 16:19:06.00ID:hkO+8710
ヒント: 最初、スタートとゴールを囲むように壁を仮設する。ぶつからない壁は要らない。
2019/08/17(土) 16:20:08.58ID:hkO+8710
ダンゴムシはx軸方向です。y軸は数学と同じ上向きを仮定してます。
2019/08/17(土) 17:21:32.91ID:RHoMoFJP
Y+がビジュアライズして上になるかはビジュアライザーの挙動次第なのでいいのだけど。
最初はX+向いてるのね。承知。
2019/08/17(土) 17:25:39.14ID:RHoMoFJP
あ、もう一つあるんだ。
最初にダンゴムシが壁にぶつかったときは右と左どっち優先?

////

@#
////
の時。
方向がX+の時に左へターンしたら無限ループする。
逆に、方向がY+の時右にターンしたら無限ループする。

どや?
143デフォルトの名無しさん
垢版 |
2019/08/17(土) 17:28:20.45ID:uIV5R7Aj
> ただし、ダンゴムシは最初は右向きを向いていて、最初にぶつかったら左に曲がるものとする。
2019/08/17(土) 17:29:33.02ID:wzQeNn8E
>>142
>90度曲がって目の前にすぐに壁がある場合は同じ方へもう90度曲がるものとする。
2019/08/17(土) 17:29:46.66ID:RHoMoFJP
すみません。見落としていました。
大変申し訳ありません。
2019/08/17(土) 19:06:19.57ID:c+Xct49t
クソコテの相手すんなよ
2019/08/17(土) 20:39:30.65ID:hkO+8710
世界はクソにあふれている! 何てこった! この状況を! この状況を変えるためには、クソをせずに生きれる仕組みを! 皆様と一緒にクソをせずに生きれる仕組みを、実現して! 行きましょう!
2019/08/17(土) 23:18:56.65ID:+079Z1et
そこでファナモの出番なわけですよ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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