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までクリアできました
Catapult-
Scratcher
100+ posts

Scratchスクリプトクイズ

#3659
おめでとうございます! 正解です。
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) で割った余り) * (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
うわぁぁぁ正解です! 問題出してすぐ取り下げる形になってしまってすみません。
一応自分が解になると思い込んでいたものは、
((join [0x] ((a) mod (999999))) mod (4095)) //A
(([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))
の12ブロックでした。(取り急ぎにつき英語です)
魂胆としては、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の解の時点でだいぶ発想がぶっとんでたので、そこから試行錯誤するの楽しかったです!こちらこそありがとうございました〜
tuneninemuihito
Scratcher
80 posts

Scratchスクリプトクイズ

問題ひさびさに
((1) から (9) までの乱数)
の出力が2個以上入ったリストがあります。
・リストの1番目の項目
・リストの末尾の項目
・リストの1番目と末尾の項目
を返すスクリプトを作成して下さい。
(つまり回答は3スクリプトになります)
目標は出力値のみをリストに入れた状態とします。
制約等
入力リスト長は2~200000です。
入力兼出力のリスト以外のリストは使用できません。
使用可能ブロック
制御系ブロック(黄色とオレンジの中間色)
リスト系ブロック(赤色)
<<> かつ <>>
<<> または <>>
<<> ではない>
(その他演算ブロックや変数ブロック等も使用できません。)
入力は↓みたいに渡されると思ってもらえれば。
(100) 回繰り返す
((1) から (9) までの乱数) を [L v] に追加する
end
ハットブロックはブロック数に含めません。
sakura_neko
Scratcher
89 posts

Scratchスクリプトクイズ

#3666
(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スクリプトクイズ

taitai102 wrote:

偽真ブロックを入れるところに値ブロックを入れていますがそれは?
仕様上偽真ブロックのところにはリストも入り、確か値が1だとtrueを返すようです。
shidaken
Scratcher
53 posts

Scratchスクリプトクイズ

>3669
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スクリプトクイズ

shidaken wrote:

>3669
Pythonなどのプログラミング言語では1以上であればTrue、0であればFalseを返しますが、
Scratchではそもそも真偽値ブロックの中に値ブロックは入りません

値ブロックの中に真偽値ブロックを入れるとTrueなら1、Falseなら0を返す仕様のみです。
それがリストだと入っちゃうんですよね…
ナンデかは知らんが
値ブロックなのにもし<>ならに入るブロック
(item ( v) of [list v] :: list)
(item # of [] in [list v])
shidaken
Scratcher
53 posts

Scratchスクリプトクイズ

確認不足でした、すみません。
inoking
Scratcher
1000+ posts

Scratchスクリプトクイズ

みなさんへ:
投稿する前に情報が正しいか確認をお願いします。
分からなければ無理に投稿する必要はありません。

taitai102 wrote:

偽真ブロックを入れるところに値ブロックを入れていますがそれは?
そもそも、どこの話でしょうか?

用語について:
「偽真」という言い方はしません。
「真偽」です。「左右」を「右左」と言うようなものです。


shidaken wrote:

Pythonなどのプログラミング言語では1以上であればTrue、0であればFalseを返しますが、
不正確です。
一般的なプログラミング言語では、正しくは「0 以外なら True」です。


h_team_x wrote:

仕様上偽真ブロックのところにはリストも入り、確か値が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さん)正解です。
想定回答は全て
<([L v] の () 番目) ではない> まで繰り返す
[L v] の () 番目を削除する
end
でwhileループのようにする回答で各4ブロックです。
真偽値の場所に([リスト]の(値)番目)ブロックを入れる事については、こちらの“In a Boolean Input”の第2例を参照して下さい。
Catapult-
Scratcher
100+ posts

Scratchスクリプトクイズ

出題します。
変数A, Bに数※が入っています。2変数の符号に応じて、下の表に示した数値を出力するスクリプトを作ってください。
B\A|_-_|_0_|_+_|
_-_|_3_|_8_|_8_|
_0_|_3_|_1_|_8_|
_+_|_9_|_3_|_3_|
(AとBが対称ではないことに注意してください)
使用可能ブロックの制限はありません。出力形式も値ブロックでも処理ブロックでも構いません(後者の場合、出力用変数に代入してください)。
想定解は6ブロックです。

※ここでは以下のスクリプトがtrueを返すくらいの意味合いでゆるく定義します。
<((A) + (0)) = (A)>
sakura_neko
Scratcher
89 posts

Scratchスクリプトクイズ

#3675
((((A) / (0))から((B)/(-0))までの乱数)の長さ)
でどうでしょうか。
プロジェクトはこちらです。
Catapult-
Scratcher
100+ posts

Scratchスクリプトクイズ

#3676
正解です!あっさりバレました。想定解は全く同じです。
という2つの仕様の組み合わせでした。特に乱数ブロックに±Infinityを入れた場合の処理は実行結果だけ見ると不思議な挙動をするので面白いですね。

Powered by DjangoBB