Discuss Scratch

moyasi_official
Scratcher
100+ posts

Scratchスクリプトクイズ

出題します。
 [ v] を []にする

[ v] を (0)ずつ変える

repeat until <>
end

((1) から (10)までの乱数)
を使わずに乱数(指定はない)を作ってください。
e1bfd762321e409cee4a
Scratcher
100+ posts

Scratchスクリプトクイズ

#3639
回答します。
線形合同法です。
== 事前準備 ==
0x0のコスチューム、大きさ Infinity % 座標 (1, 0)
== プログラム ==
x座標を((((((3.14159265)*(x座標::motion)::operators)+(min::custom)::operators)を(max::custom)で割った余り::operators)-(((min::custom)の[絶対値 v]::operators)/(2)))*(A::custom))にする::motion
((1)+<(min::custom)に(-)が含まれる>) // Aにこれを入れる
3.14159265 のところは小数ならなんでもいいです。

Edit: 見切れを修正、前提条件修正
Edit: ミス修正 修正前は A のところが 2 でした

Last edited by e1bfd762321e409cee4a (Jan. 24, 2026 09:22:20)

moyasi_official
Scratcher
100+ posts

Scratchスクリプトクイズ

#3640
できるだけプロジェクト化してください。でないと結果がわかりにくいので。
e1bfd762321e409cee4a
Scratcher
100+ posts

Scratchスクリプトクイズ

#3641
https://scratch.mit.edu/projects/1270413882/ です。
追記 : ミスが修正済みのやつです。

Last edited by e1bfd762321e409cee4a (Jan. 24, 2026 09:18:24)

inoking
Scratcher
1000+ posts

Scratchスクリプトクイズ

moyasi_official wrote:

#3640
できるだけプロジェクト化してください。でないと結果がわかりにくいので。
そのようなルールはありません。

今回のように1行で書けるものなら
プロジェクト化したほうが逆に見に行くのが手間になります。

※確認は確かにプロジェクト化されているほうが楽ですが、確認まで必要な人の数は限られています。
moyasi_official
Scratcher
100+ posts

Scratchスクリプトクイズ

#3642
あっていますが私とはやり方が違います。私はmin maxは関係ありません。これです。

Last edited by moyasi_official (Jan. 24, 2026 09:57:44)

newmomizi_txt
Scratcher
1000+ posts

Scratchスクリプトクイズ

#3644
これは1フレームの長さを測っているだけで、乱数とは呼べないでしょう。端末の処理性能だけに完全に依存しています。

1/30秒≒0.033秒 (計算の都合上0.32になることもある) を下回ることはありませんし、上限に関しては存在しません。
abee
Scratcher
1000+ posts

Scratchスクリプトクイズ

#3642
実際に試してみましたが、偏りが大きくて乱数と言えないように思います。
また、minとmaxで指定した範囲外の値を返す場合もあります。
あと、問題があいまいなのでなんともいえませんが、Scratchの乱数ブロックは範囲を整数で入れれば整数が返り、小数を入れれば小数が返ります。

Last edited by abee (Jan. 24, 2026 10:07:32)

Catapult-
Scratcher
100+ posts

Scratchスクリプトクイズ

#3639
set [tmp v] to (join [0] [.])
delete all of [list v]
repeat (10)
add (length of [list v] :: list) to [list v]
end
repeat (16)
set [tmp v] to (join (tmp) (item [any] of [list v] :: list))
end
if <(join (min) (max)) contains [.]?> then
set [return v] to ((min) + (((max) - (min)) * (tmp)))
else
set [return v] to ((min) + ([floor v] of ((((max) - (min)) + [1]) * (tmp))))
end
追記:制約を無視していたのでこの投稿は意味をなしません。無視してくださって構いません。制約が割と緩いので変数部分をリストを使った操作に置き換えて同様の趣旨の解答が可能だと思います。

Last edited by Catapult- (Jan. 24, 2026 12:36:08)

Grandpiano2
Scratcher
11 posts

Scratchスクリプトクイズ

こんなことしか思いつきませんでした。
https://scratch.mit.edu/projects/1270495250/
gccxnondx
Scratcher
100+ posts

Scratchスクリプトクイズ

それだと使える範囲が-420~420(240+180)までのため、範囲の指定ができない乱数になっています。
また、
[どこかの場所]へ行く
が、すでにランダム性があるので求めているものとは違う気がします。(本人がいないのでわからないですが…)
chutaro5978
Scratcher
100+ posts

Scratchスクリプトクイズ

乱数か怪しいところですが、これでどうですか?

Last edited by chutaro5978 (Jan. 24, 2026 23:19:04)

Grandpiano2
Scratcher
11 posts

Scratchスクリプトクイズ

#3649
このような感じでしょうか?
https://scratch.mit.edu/projects/1277423837/

Last edited by Grandpiano2 (Feb. 11, 2026 13:00:04)

Catapult-
Scratcher
100+ posts

Scratchスクリプトクイズ

みなさん、クイズやってますか〜〜?
この問題を眺めていたら新たな最短解を見つけたので改題として出題します。ageも兼ねて…

変数 a があり、0, 1, 2のみからなるN文字以下の文字列が入っています。a各桁の数字の合計を変数 return に入れるプログラムを作ってください。
ただし、変数または演算ブロックのみを使用可能とします。繰り返しブロックや定義、リストなどを使用することはできません。
また、(N+1)文字以上の文字列をプログラムに埋め込むことも禁止とします※
難易度 Easy: N=8 Difficult: N=12 Expert: N=14
※N文字以下の文字列を異なる場所に複数埋め込むことや、ブロックの出力が(N+1)文字以上になることは許容しますが、ブロックの入力部分1つに(N+1)文字以上の文字列が入力された状態のプログラムを不可とします。
(元の問題から変更した点を赤字で示しています)

「旗が押された」ブロックのような実行開始ブロックをカウントしない場合、想定解答は Easy: 6ブロック Difficult: 87ブロック Expert: 8ブロック です。
なおコードゴルフ的な楽しみ方を想定してはいますが、想定解答のEasyですら出るか微妙なくらいには難しいと思うので、何か少しでも解を思いついたら出し惜しみせずどんどん提出してみてください!

追記: 想定解のブロック数と難易度を更新(変更部分は斜字)
追記2: 問題文中の表現を一部明瞭なものに変更(変更部分は斜字)

Last edited by Catapult- (June 5, 2026 08:43:25)

taitai102
Scratcher
20 posts

Scratchスクリプトクイズ

すみません、少し僕には分かりづらいので、わかりやすくしてくれませんか?…
sakura_neko
Scratcher
89 posts

Scratchスクリプトクイズ

#3652 考える時間を稼ぐためageのためにとりあえず(前の問題と同じ手法で、最短じゃないけど素直な)解答を

これでEasy:78/Difficult:1112ブロックです

普通に読み落とし…

Last edited by sakura_neko (June 2, 2026 12:08:40)

Catapult-
Scratcher
100+ posts

Scratchスクリプトクイズ

#3653
変数aに「02211012」のような0,1,2だけから成る8桁の数字(Difficutでは12桁)が入っていて、その各桁の数字の合計(この例の場合、0+2+2+1+1+0+1+2=9)を求めるプログラムを作るという問題です。答えの数字は変数returnに入れる必要があります。
ただし、「変数」カテゴリと「演算」カテゴリのブロックのみが使用可能で、aより多い文字数の文字列をプログラム中に入力してはいけません
(あんまりわかりやすい言い換えになってないかも…)
Catapult-
Scratcher
100+ posts

Scratchスクリプトクイズ

#3654
returnへの代入もブロック数に含めるので、それぞれ8,12ブロックですね。
そこだけ修正すれば正解です! 原作者様、早い…!

あと、解答を吟味していたらDifficultの想定解が7ブロックになりました。
Catapult-
Scratcher
100+ posts

Scratchスクリプトクイズ

Difficultの当初の想定解を活かしたいと思ったので難易度 Expert: N=14 を追加しました。想定解は8ブロックです。
Catapult-
Scratcher
100+ posts

Scratchスクリプトクイズ

みなさん苦戦しているのかあまり解答が出ないようですので、まずEasyの想定解を発表します。
set [return v] to (((((a) を (99) で割った余り) * (18)) を (179) で割った余り) を (17) で割った余り)
の6ブロックです。(プロジェクトはこちら)

少し解説すると、まずsakura_nekoさんの解と同じ方法で0~2の8桁を0~8の2桁に変換できます。これをk=10α+β (α,β =0,1,2, … ,8)とすると、
18k = 180α+18β ≡ α+18β (<179) (mod179)
α+18β ≡ α+β (<17) (mod17) より確かに成り立つことがわかります。

さて、これを踏まえてDifficult, Expertにも挑戦してみてください。
ちなみにこの解はそのまま改題元の問題の解としても使えます。

Powered by DjangoBB