Discuss Scratch
- sakura_neko
-
Scratcher
89 posts
Scratchスクリプトクイズ
#3652
Difficult:7/Expert:8ブロックの解答です
Easyの想定解を見て目から鱗が落ちました
最初にmod99, 最後にmod17取りそうまでは思いついたけど間の2ブロックが全然埋まらず…
16進数で同じアイデアを試すと、x, y<=14のもとで16x+y → 480x+30y → x+30y → x+yのような変換ができるのでDifficultクリア(これはN=13までOK)
(2/15)*16^14>2^53だからExpertはこのままではうまくいかないが、先にmod 9999を噛ますことでクリアできる
ところがもっと素直な方法があって、mod 9999を取ったあとに32倍してx, y, z, w<=8のもとで32000x+3200y+320z+32wから各係数が1になるようにmodを取ってもよく、こちらならN=15までクリアできました
Difficult:7/Expert:8ブロックの解答です
Easyの想定解を見て目から鱗が落ちました
最初にmod99, 最後にmod17取りそうまでは思いついたけど間の2ブロックが全然埋まらず…
16進数で同じアイデアを試すと、x, y<=14のもとで16x+y → 480x+30y → x+30y → x+yのような変換ができるのでDifficultクリア(これはN=13までOK)
(2/15)*16^14>2^53だからExpertはこのままではうまくいかないが、先にmod 9999を噛ますことでクリアできる
ところがもっと素直な方法があって、mod 9999を取ったあとに32倍してx, y, z, w<=8のもとで32000x+3200y+320z+32wから各係数が1になるようにmodを取ってもよく、こちらならN=15までクリアできました
- Catapult-
-
Scratcher
100+ posts
Scratchスクリプトクイズ
#3659
おめでとうございます! 正解です。
Difficult、Expertの一つ目は想定解と同様の手法だったのですが、Expertの二つ目の解が凄すぎてまだ理解できていません。
私の絞り込みと探索能力では3桁以上のmodによる解は不可能だと思っていたので驚きです! どうやって見つけるんですかこれ
想定解は、Difficultが
さて、Expertを考えていた後、他にも手法があることに気づいたのでさらに出題です。
ラスボス、というより精度的に限界の Master: N=16 です。想定解は12ブロックですが、正直sakura_nekoさんの4段modを見た後だとそれを下回る解もありそうで楽しみです。すみません、検証していたら想定解が一部成り立たないケースが見つかったのでちょっと待ってください
おめでとうございます! 正解です。
Difficult、Expertの一つ目は想定解と同様の手法だったのですが、Expertの二つ目の解が凄すぎてまだ理解できていません。
私の絞り込みと探索能力では3桁以上のmodによる解は不可能だと思っていたので驚きです! どうやって見つけるんですかこれ
想定解は、Difficultが
set [return v] to ((((([0x] と (a)) を (255) で割った余り) * (26)) を (415) で割った余り) を (25) で割った余り)の7ブロック、Expertが
set [return v] to ((((([0x] と ((a) を (9999) で割った余り)) を (255) で割った余り) * (30)) を (479) で割った余り) を (29) で割った余り)の8ブロックでした。プロジェクト版も更新しています。
さて、Expertを考えていた後、他にも手法があることに気づいたのでさらに出題です。
ラスボス、というより精度的に限界の Master: N=16 です。想定解は12ブロックですが、正直sakura_nekoさんの4段modを見た後だとそれを下回る解もありそうで楽しみです。すみません、検証していたら想定解が一部成り立たないケースが見つかったのでちょっと待ってください
Last edited by Catapult- (June 6, 2026 16:23:33)
- sakura_neko
-
Scratcher
89 posts
Scratchスクリプトクイズ
#3660 すいません、上の投稿した時点でN=16でaが2^53を超えるとなぜか勘違いしてました
上の手法そのまま使ってN=16もできます(32倍→34倍、8ブロック)
https://scratch.mit.edu/projects/1327653379/ も更新しました
returnに代入する中身:
ざっくり説明すると、
aを9999で割った余り=1000x+100y+10z+wとしてx+y+z+wを求めればいいわけですが、x,y,z,w<=8から
x+3400y+340z+34w<33999
x+y+340z+34w<3399
x+y+z+34w<339
x+y+z+w<33
が成り立つので順にmodを取っても成立するって感じです
上の手法そのまま使ってN=16もできます(32倍→34倍、8ブロック)
https://scratch.mit.edu/projects/1327653379/ も更新しました
returnに代入する中身:
(((((((a) を (9999) で割った余り) * (34)) を (33999) で割った余り) を (3399) で割った余り) を (339) で割った余り) を (33) で割った余り)
ざっくり説明すると、
aを9999で割った余り=1000x+100y+10z+wとしてx+y+z+wを求めればいいわけですが、x,y,z,w<=8から
x+3400y+340z+34w<33999
x+y+340z+34w<3399
x+y+z+34w<339
x+y+z+w<33
が成り立つので順にmodを取っても成立するって感じです
Last edited by sakura_neko (June 6, 2026 17:04:26)
- Catapult-
-
Scratcher
100+ posts
Scratchスクリプトクイズ
#3661
うわぁぁぁ正解です! 問題出してすぐ取り下げる形になってしまってすみません。
一応自分が解になると思い込んでいたものは、
魂胆としては、A部で16進数の100α+10β+γ (α, β:0~10, γ:0~12)を作り(以下も16進数表記)、
B部で [(100α+10β+γ)*100.01]%10000 = 1000β+100γ+α にし、
C部で[(1000β+100γ+α)*100.001]%100000 = 10000γ+100α+β にし、
最後に%99して合計を得る、というものだったのですが、誤差により成り立たないケースがあると気づきましたex. a=10
16進数のきれいな値だけなので誤差が出ないと早とちりし検証を怠って出題した私のミスです、すみません。浮動小数点やり直してきます。
そして、modを使ったより洗練された解をすぐさま提出してくださったsakura_nekoさん、ありがとうございます!
うわぁぁぁ正解です! 問題出してすぐ取り下げる形になってしまってすみません。
一応自分が解になると思い込んでいたものは、
((join [0x] ((a) mod (999999))) mod (4095)) //Aの12ブロックでした。(取り急ぎにつき英語です)
(([floor v] of ((A ::grey)* (256.00390625))::operators) mod (65536)) //B
(([floor v] of ((B ::grey)* (256.00024414062))::operators) mod (1048576)) //C
set [return v] to ((C ::grey) mod (255))
魂胆としては、A部で16進数の100α+10β+γ (α, β:0~10, γ:0~12)を作り(以下も16進数表記)、
B部で [(100α+10β+γ)*100.01]%10000 = 1000β+100γ+α にし、
C部で[(1000β+100γ+α)*100.001]%100000 = 10000γ+100α+β にし、
最後に%99して合計を得る、というものだったのですが、誤差により成り立たないケースがあると気づきましたex. a=10
16進数のきれいな値だけなので誤差が出ないと早とちりし検証を怠って出題した私のミスです、すみません。浮動小数点やり直してきます。
そして、modを使ったより洗練された解をすぐさま提出してくださったsakura_nekoさん、ありがとうございます!
Last edited by Catapult- (June 6, 2026 16:55:49)
- sakura_neko
-
Scratcher
89 posts
Scratchスクリプトクイズ
#3662 おお、これまた面白い発想だ…
Easyの解の時点でだいぶ発想がぶっとんでたので、そこから試行錯誤するの楽しかったです!こちらこそありがとうございました〜
Easyの解の時点でだいぶ発想がぶっとんでたので、そこから試行錯誤するの楽しかったです!こちらこそありがとうございました〜
- tuneninemuihito
-
Scratcher
80 posts
Scratchスクリプトクイズ
問題ひさびさに
(つまり回答は3スクリプトになります)
目標は出力値のみをリストに入れた状態とします。
((1) から (9) までの乱数)の出力が2個以上入ったリストがあります。
・リストの1番目の項目を返すスクリプトを作成して下さい。
・リストの末尾の項目
・リストの1番目と末尾の項目
(つまり回答は3スクリプトになります)
目標は出力値のみをリストに入れた状態とします。
制約等
入力リスト長は2~200000です。
入力兼出力のリスト以外のリストは使用できません。使用可能ブロック入力は↓みたいに渡されると思ってもらえれば。
制御系ブロック(黄色とオレンジの中間色)
リスト系ブロック(赤色)<<> かつ <>>(その他演算ブロックや変数ブロック等も使用できません。)
<<> または <>>
<<> ではない>(100) 回繰り返すハットブロックはブロック数に含めません。
((1) から (9) までの乱数) を [L v] に追加する
end
- sakura_neko
-
Scratcher
89 posts
Scratchスクリプトクイズ
#3666
Scratchの標準エディタにないブロックが許されるなら、後ろ2つは
プロジェクトはこちらです。
(199999) 回繰り返すでどうでしょうか。
[L v]の(2)番目を削除する
end
(199999) 回繰り返す
もし([L v]の(2)番目)なら
[L v]の(1)番目を削除する
end
end
(199998) 回繰り返す
もし([L v]の(3)番目)なら
[L v]の(2)番目を削除する
end
end
Scratchの標準エディタにないブロックが許されるなら、後ろ2つは
([L v]の(2)番目:: list) の間繰り返す{
[L v]の(1)番目を削除する
}:: control
([L v]の(3)番目:: list) の間繰り返す{
[L v]の(2)番目を削除する
}:: controlで3ブロックになりますね。プロジェクトはこちらです。
Last edited by sakura_neko (July 26, 2026 18:03:55)
- taitai102
-
Scratcher
20 posts
Scratchスクリプトクイズ
偽真ブロックを入れるところに値ブロックを入れていますがそれは?
Last edited by taitai102 (July 26, 2026 22:46:48)
- h_team_x
-
Scratcher
100+ posts
Scratchスクリプトクイズ
偽真ブロックを入れるところに値ブロックを入れていますがそれは?仕様上偽真ブロックのところにはリストも入り、確か値が1だとtrueを返すようです。
- shidaken
-
Scratcher
53 posts
Scratchスクリプトクイズ
>3669
Pythonなどのプログラミング言語では1以上であればTrue、0であればFalseを返しますが、
Scratchではそもそも真偽値ブロックの中に値ブロックは入りません。
値ブロックの中に真偽値ブロックを入れるとTrueなら1、Falseなら0を返す仕様のみです。
リストなら入るんですね。。。
Pythonなどのプログラミング言語では1以上であればTrue、0であればFalseを返しますが、
Scratchではそもそも真偽値ブロックの中に値ブロックは入りません。
値ブロックの中に真偽値ブロックを入れるとTrueなら1、Falseなら0を返す仕様のみです。
リストなら入るんですね。。。
Last edited by shidaken (July 27, 2026 00:15:03)
- h_team_x
-
Scratcher
100+ posts
Scratchスクリプトクイズ
>3669それがリストだと入っちゃうんですよね…
Pythonなどのプログラミング言語では1以上であればTrue、0であればFalseを返しますが、
Scratchではそもそも真偽値ブロックの中に値ブロックは入りません。
値ブロックの中に真偽値ブロックを入れるとTrueなら1、Falseなら0を返す仕様のみです。
ナンデかは知らんが
値ブロックなのにもし<>ならに入るブロック
(item ( v) of [list v] :: list)
(item # of [] in [list v])
- inoking
-
Scratcher
1000+ posts
Scratchスクリプトクイズ
みなさんへ:
投稿する前に情報が正しいか確認をお願いします。
分からなければ無理に投稿する必要はありません。
用語について:
「偽真」という言い方はしません。
「真偽」です。「左右」を「右左」と言うようなものです。
一般的なプログラミング言語では、正しくは「0 以外なら True」です。
仕様(意図的)かどうかはともかく、真偽値ブロックのところにリストも入るのは事実です。
しかし、「値が1だとtrueを返す」これは間違っています。
1 → true は確かですが、
true になるのはそれだけではありません。
ざっと動作を見たところ「0 以外なら True」の法則に従うようです
(追記:ソースコードをざっと見たところ「文字列の場合は 空白、0、false(大文字小文字問わず)→ False」)。
以上のような値変換は、一般的には「キャスト」と呼ばれるものです。
Scratch の場合については キャストの規則 にまとめられています。
追記:
https://github.com/scratchfoundation/scratch-vm/blob/develop/src/util/cast.js 参照
投稿する前に情報が正しいか確認をお願いします。
分からなければ無理に投稿する必要はありません。
偽真ブロックを入れるところに値ブロックを入れていますがそれは?そもそも、どこの話でしょうか?
用語について:
「偽真」という言い方はしません。
「真偽」です。「左右」を「右左」と言うようなものです。
Pythonなどのプログラミング言語では1以上であればTrue、0であればFalseを返しますが、不正確です。
一般的なプログラミング言語では、正しくは「0 以外なら True」です。
仕様上偽真ブロックのところにはリストも入り、確か値が1だとtrueを返すようです。確認してから投稿してください。
仕様(意図的)かどうかはともかく、真偽値ブロックのところにリストも入るのは事実です。
しかし、「値が1だとtrueを返す」これは間違っています。
1 → true は確かですが、
true になるのはそれだけではありません。
ざっと動作を見たところ「0 以外なら True」の法則に従うようです
(追記:ソースコードをざっと見たところ「文字列の場合は 空白、0、false(大文字小文字問わず)→ False」)。
以上のような値変換は、一般的には「キャスト」と呼ばれるものです。
Scratch の場合については キャストの規則 にまとめられています。
追記:
https://github.com/scratchfoundation/scratch-vm/blob/develop/src/util/cast.js 参照
Last edited by inoking (July 27, 2026 00:28:03)
- tuneninemuihito
-
Scratcher
80 posts
Scratchスクリプトクイズ
#3666の問題の回答等です。
まずこちらが想定回答です。
#3667(sakura_nekoさん)正解です。
想定回答は全て
真偽値の場所に([リスト]の(値)番目)ブロックを入れる事については、こちらの“In a Boolean Input”の第2例を参照して下さい。
まずこちらが想定回答です。
#3667(sakura_nekoさん)正解です。
想定回答は全て
<([L v] の () 番目) ではない> まで繰り返すでwhileループのようにする回答で各4ブロックです。
[L v] の () 番目を削除する
end
真偽値の場所に([リスト]の(値)番目)ブロックを入れる事については、こちらの“In a Boolean Input”の第2例を参照して下さい。
- Catapult-
-
Scratcher
100+ posts
Scratchスクリプトクイズ
出題します。
変数A, Bに数※が入っています。2変数の符号に応じて、下の表に示した数値を出力するスクリプトを作ってください。
(AとBが対称ではないことに注意してください)
使用可能ブロックの制限はありません。出力形式も値ブロックでも処理ブロックでも構いません(後者の場合、出力用変数に代入してください)。
想定解は6ブロックです。
※ここでは以下のスクリプトがtrueを返すくらいの意味合いでゆるく定義します。
変数A, Bに数※が入っています。2変数の符号に応じて、下の表に示した数値を出力するスクリプトを作ってください。
B\A|_-_|_0_|_+_|
_-_|_3_|_8_|_8_|
_0_|_3_|_1_|_8_|
_+_|_9_|_3_|_3_|
使用可能ブロックの制限はありません。出力形式も値ブロックでも処理ブロックでも構いません(後者の場合、出力用変数に代入してください)。
想定解は6ブロックです。
※ここでは以下のスクリプトがtrueを返すくらいの意味合いでゆるく定義します。
<((A) + (0)) = (A)>
- Catapult-
-
Scratcher
100+ posts
Scratchスクリプトクイズ
#3676
正解です!あっさりバレました。想定解は全く同じです。
正解です!あっさりバレました。想定解は全く同じです。
- 乱数ブロックは最大値と最小値を区別するので、Infinitytと-Infinityとでで非対称な結果を返す
- 負のゼロによる除算