Discuss Scratch
- Discussion Forums
- » 日本語
- » Scratchスクリプトクイズ
- yukku
-
Scratcher
1000+ posts
Scratchスクリプトクイズ
日本語フォーラムのみなさん, お久しぶりです
>> #3418
9 Blocksの解法です.
仕組みとしては99個の0と十分多くの10 (ステージの対角線は長さ600なので501個あれば十分だが, 余分に入っている) をリストに入れておいて
今思えば
>> #3418
9 Blocksの解法です.
仕組みとしては99個の0と十分多くの10 (ステージの対角線は長さ600なので501個あれば十分だが, 余分に入っている) をリストに入れておいて
([list v]の([マウスのポインター v]までの距離)番目)を見れば(リストのアクセスは小数点以下切り捨てなので)距離が丁度100のとき以外はうまくいき, 変数を使って距離の数値を微小量減らして100が対象外になるようにしました
今思えば
もし<[100だけが入ってるリスト v]に([マウスのポインター v]までの距離)が含まれる::list>ならでもブロック数は変わらないのでこっちのほうがわかりやすかったかもしれません
でなければ
([list v]の([マウスのポインター v]までの距離)番目)歩動かす
- ito-noizi
-
Scratcher
100+ posts
Scratchスクリプトクイズ
日本語フォーラムのみなさん, お久しぶりです正解です!
>> #3418
9 Blocksの解法です.
仕組みとしては99個の0と十分多くの10 (ステージの対角線は長さ600なので501個あれば十分だが, 余分に入っている) をリストに入れておいて([list v]の([マウスのポインター v]までの距離)番目)を見れば(リストのアクセスは小数点以下切り捨てなので)距離が丁度100のとき以外はうまくいき, 変数を使って距離の数値を微小量減らして100が対象外になるようにしました
今思えばもし<[100だけが入ってるリスト v]に([マウスのポインター v]までの距離)が含まれる::list>ならでもブロック数は変わらないのでこっちのほうがわかりやすかったかもしれません
でなければ
([list v]の([マウスのポインター v]までの距離)番目)歩動かす
100より大きいの処理にちょっと笑っちゃいました。
この方法とはまったく別の9blocksで判定する方法があります。
上のDouble型の仕様を使ったものよりもある意味で、さらにトリッキーな方法です。
ぜひ、その方法も考えてみてください。
- ito-noizi
-
Scratcher
100+ posts
Scratchスクリプトクイズ
#3418
9 blocksの想定解を発表します。
作成者は @Syorirewan です。

https://scratch.mit.edu/projects/1160531053/
Scratchのfor each文には、ループを行うかどうかの判定を毎回ループごとに動的に計算するという、特殊な仕様があります。
たとえば、マウスポインターまでの距離が100以下の場合、もちろんfor each文は繰り返し処理を実行しません。
そのため、「10歩動かす」という命令が実行されることはありません。
※なお、for each文の繰り返し回数の仕様はrepeat文とは異なっていて、切り上げで処理されるようです。
一方、マウスポインターまでの距離が100より大きい場合は、for each文が実行されます。
例えば距離が「105」の場合を見てみましょう。
for each文の内部仕様を活かした、ぱっと見意味の分からない実装になっています。
これを利用するとforever文も気持ち悪い感じで書けます。

こんな感じです。このほかにもタイマーを利用したりしてもいいみたいです。
9 blocksの想定解を発表します。
作成者は @Syorirewan です。

https://scratch.mit.edu/projects/1160531053/
Scratchのfor each文には、ループを行うかどうかの判定を毎回ループごとに動的に計算するという、特殊な仕様があります。
たとえば、マウスポインターまでの距離が100以下の場合、もちろんfor each文は繰り返し処理を実行しません。
そのため、「10歩動かす」という命令が実行されることはありません。
※なお、for each文の繰り返し回数の仕様はrepeat文とは異なっていて、切り上げで処理されるようです。
一方、マウスポインターまでの距離が100より大きい場合は、for each文が実行されます。
例えば距離が「105」の場合を見てみましょう。
- (距離 - 100)の結果は「5」となり、for each文は「5の要素を変数に入れて繰り返す」動作を行います。
- 最初に変数に「1」が代入され、「10歩動かす」が1回実行されます。
- すると次のループでは、変数の中身が「1」になっており、今度は「1の要素を変数に入れて繰り返す」というループになります。
- しかし、すでに1回ループを終えているため、ここでfor each文は終了します。
for each文の内部仕様を活かした、ぱっと見意味の分からない実装になっています。
これを利用するとforever文も気持ち悪い感じで書けます。

こんな感じです。このほかにもタイマーを利用したりしてもいいみたいです。
- abee
-
Scratcher
1000+ posts
Scratchスクリプトクイズ
「( )の要素を[ ]に入れて繰り返す」は通常の方法では使うことができないブロックなので、それを想定解とすることはスクリプトクイズの趣旨からちょっと外れると思います。
- ie_523
-
Scratcher
100+ posts
Scratchスクリプトクイズ
すいません、めちゃくちゃ返信遅れました。
こちらの問題についてです。
こちらの問題についてです。
想定解ですx座標を((5)*(<[右 v]キーが押された>-<[左 v]キーが押された>))ずつ変えるなんてどうでしょう。wikiへのリンクが少しバグってます。
y座標を((5)*(<[上 v]キーが押された>-<[下 v]キーが押された>))ずつ変える
では普通にこうですかね。挙動が少々違うので不正解です。なめらかに動きません。when [Rightarrow v] key pressed
change x by (数値)when [Leftarrow v] key pressedですか?
change x by (数値)
Last edited by ie_523 (April 29, 2025 01:51:30)
#3447May 2, 2025 01:45:29
- yama918
-
Scratcher
29 posts
Scratchスクリプトクイズ
出題していいのか分からないけど
<[infinity] < []>↑ここになにかを入れてtrueになるようにしてください
#3448May 2, 2025 01:57:49
- yuito2013
-
Scratcher
500+ posts
Scratchスクリプトクイズ
⬆️
<[Infinity] < (((0) / (0)) * ((1) / (0)))>//つまり⬇️
<[Infinity] < ([NaN] * [Infinity])>
Last edited by yuito2013 (May 2, 2025 23:18:29)
#3449May 2, 2025 06:10:14
#3450May 2, 2025 06:17:11
#3451May 2, 2025 07:03:16
#3452May 2, 2025 07:24:30
- inoking
-
Scratcher
1000+ posts
Scratchスクリプトクイズ
文字列比較の話ではないです。<(Infinity::operators) < (j::operators)>これが原理。
結局、文字列比較になっているのだとは思いますが。
後ほどソースコードを確認します。
#3453May 2, 2025 07:35:47
- yama918
-
Scratcher
29 posts
Scratchスクリプトクイズ
#3453、#3451
想定解です
#3450、#3452
想定解ではないですけど、その方法でもいけるんですね。知りませんでした
想定解です
#3450、#3452
想定解ではないですけど、その方法でもいけるんですね。知りませんでした
#3454May 2, 2025 16:44:07
- inoking
-
Scratcher
1000+ posts
Scratchスクリプトクイズ
赤丸で囲んでいますが、そこに文字列は入りません。<[infinity] < (([infinity]) / (0))>
変数のことでしたら正確に記載をお願いします。
set [変数 v] to ((1) / (0))//Infinity
<[infinity] < ((変数) / (0))>
なお、
<[Infinity] < ((変数) / (0))>とした場合、これは偽になります(次の投稿を参照)。
Last edited by inoking (May 2, 2025 17:13:46)
#3455May 2, 2025 17:08:33
- inoking
-
Scratcher
1000+ posts
Scratchスクリプトクイズ
本題です。
まず、ゼロ除算などによって得られる無限大は「infinity」ではなく「Infinity」です。
Scratch の記述言語、JavaScript では「Infinity」は特別な意味をもちます(小文字ならただの文字列)。
他に、「NaN」も特別な意味をもちます。
これらは例えば以下のようにして生成できます。
このお題 の意図は「Infinity」のことだと思います。
以下、「Infinity」について検証します。
https://github.com/scratchfoundation/scratch-vm/blob/develop/src/blocks/scratch3_operators.js#L52-L58
compare についてはこちら:
「Infinity」 と比較して負の値を返すのは、文字列比較の場合のみです。
つまり、#3454 での想定どおりでした。
まず、ゼロ除算などによって得られる無限大は「infinity」ではなく「Infinity」です。
Scratch の記述言語、JavaScript では「Infinity」は特別な意味をもちます(小文字ならただの文字列)。
他に、「NaN」も特別な意味をもちます。
これらは例えば以下のようにして生成できます。
((1) / (0)) //Infinity
((0) / (0)) //NaN
((-1) / (0)) //-Infinity
このお題 の意図は「Infinity」のことだと思います。
以下、「Infinity」について検証します。
(() / ())
<[] < []>のソースコードは以下です。
https://github.com/scratchfoundation/scratch-vm/blob/develop/src/blocks/scratch3_operators.js#L52-L58
divide (args) { return Cast.toNumber(args.NUM1) / Cast.toNumber(args.NUM2); } lt (args) { return Cast.compare(args.OPERAND1, args.OPERAND2) < 0; }
今、念のためソースコードをあたりました。
比較のソースコード実体は以下ですが
入力のどちらかが数字に変換できない場合、文字列比較をするようになっています。
https://github.com/LLK/scratch-vm/tree/develop/src/util/cast.js#L121static compare (v1, v2) {
let n1 = Number(v1);
let n2 = Number(v2);
if (n1 === 0 && Cast.isWhiteSpace(v1)) {
n1 = NaN;
} else if (n2 === 0 && Cast.isWhiteSpace(v2)) {
n2 = NaN;
}
if (isNaN(n1) || isNaN(n2)) {
// At least one argument can't be converted to a number.
// Scratch compares strings as case insensitive.
const s1 = String(v1).toLowerCase();
const s2 = String(v2).toLowerCase();
if (s1 < s2) {
return -1;
} else if (s1 > s2) {
return 1;
}
return 0;
}
// Handle the special case of Infinity
if (
(n1 === Infinity && n2 === Infinity) ||
(n1 === -Infinity && n2 === -Infinity)
)
{
return 0;
}
// Compare as numbers.
return n1 - n2;
}
<[] < []>が真となるためには compare が負の値を返す必要があります。
「Infinity」 と比較して負の値を返すのは、文字列比較の場合のみです。
つまり、#3454 での想定どおりでした。
Last edited by inoking (May 2, 2025 17:09:33)
#3456May 3, 2025 03:26:08
#3457May 3, 2025 04:14:02
- inoking
-
Scratcher
1000+ posts
Scratchスクリプトクイズ
直接入力することはできませんが、コピー&ペーストで入力することはできますそういう技がありましたね、、
ただ、わざわざカッコで囲んで赤丸表示にしているので何らかの意図があったのでしょう。
どちらにしても小文字の「infinity」の話をしても仕方ないですね。。
- numberblockgoogl
-
Scratcher
28 posts
Scratchスクリプトクイズ
when green flag clicked
move (can) steps
ask [someone translate this?] and wait
- Higuma_san
-
Scratcher
47 posts
Scratchスクリプトクイズ
問題です。
実行すると
ただし、使用してよいブロックは
想定解は6ブロックです。
実行すると
もし <(変数)<(0)> ならと同じ結果になるプログラムを、できるだけ少ないブロック数で作成してください。
[変数 v]を(0)にする
end
ただし、使用してよいブロックは
(() + ())
(() - ())
(() * ())
(() / ())
(() を ()で割った余り)
(()の[絶対値 v]::operators)//「絶対値」の所は他のものに変更しても良いが、「平方根」のみ禁止とする
(変数)
[変数 v] を []にするのみとします。
想定解は6ブロックです。
- puluma
-
Scratcher
42 posts
Scratchスクリプトクイズ
[変数 v] を ((([abs v] of (変数)::operators) + (変数)) / (2))にする(すみません、絶対値がabsになってます)
こんな感じでしょうか?