井戸のカタツムリ

バックグラウンド

このようなものになる共通の謎があります:

カタツムリは30フィートの井戸の底にあります。毎日カタツムリは3フィートアップすることができます。彼らが寝る夜に、彼らは2フィート下に滑り落ちる。カタツムリが井戸から出るのに何日かかるのですか?

直感的な答えは

30日間、カタツムリが1日1フィートで30日間上って上に到達するため、

実際には答えは

28日間、カタツムリが空気中で27フィート(27日後)になると、28日目に残りの3フィートを上に上るだけです。

チャレンジ

This チャレンジ generalizes this riddle. Given three positive
integers as input, representing the total height, the climb height,
and the fall height, return the number of days it will take to
climb out of the well.

カタツムリが井戸から登ることができない場合は、0を返したり、偽の値を返したり、例外をスローすることがあります。ソリューションが存在する場合にのみ、停止するコードを記述することもできます。

必要に応じて、滝の高さを負の整数として取ることができます。

テストケース

(30,  3,  2) -> 28
(84, 17, 15) -> 35
(79, 15,  9) -> 12
(29, 17,  4) -> 2
(13, 18,  8) -> 1
( 5,  5, 10) -> 1
( 7,  7,  7) -> 1
(69,  3,  8) -> None
(81, 14, 14) -> None

スコアリング

This is ,
so the shortest answer in each language wins.

ベストアンサー

Gray Snail, 1206 bytes for numeric
I/O, 149 bytes for unary I/O

楽しみのために。最初のプログラムの構成:

  • 数字をドットに変換する451バイト
  • 121バイト、コア機能(分離されたバージョンは以下に書かれています)
  • ドットを数値に変換する634バイト

数値の入出力を行います。 入力はそれぞれ AB
C です。他の(近い) O(1)の回答と比較して、コードは
O(n)の複雑さを持っています。しかし、多数の場合、あなたの記憶を最初に食べるかもしれません。

解決策が見つからない場合はハングします。

INPUT p
POP Z r .!
f
POP Z o .
q
POP Z p [p]
GOTO [Z]
0
POP Z n .
GOTO w
1
POP Z n ..
GOTO w
2
POP Z n ...
GOTO w
3
POP Z n ....
GOTO w
4
POP Z n .....
GOTO w
5
POP Z n ......
GOTO w
6
POP Z n .......
GOTO w
7
POP Z n ........
GOTO w
8
POP Z n .........
GOTO w
9
POP Z n ..........
GOTO w
w
POP Z o .[o][o][o][o][o][o][o][o][o][o][n]
GOTO [r] [p] 
GOTO q
!
POP Z A .[o]
INPUT p
POP Z r [email protected]
GOTO f
@
POP Z B .[o]
INPUT p
POP Z r .#
GOTO f
#
POP Z C .[o]
POP H N .[B]
U
POP Z A [A]
POP Z B [B]
GOTO D [A] 
GOTO $ [B] 
GOTO U
$
POP Z A .[A][C]
POP Z H ..[H]
POP Z B .[N]
GOTO U
D
POP Z r .
POP Z M .
POP Z N ...........
POP Z z .[N]
POP Z V .[H]
+
GOTO l[V] [H] 
POP Z H [H]
POP Z z [z]
GOTO ( [z] 
GOTO +
(
GOTO ) [H] 
POP Z z .[N]
POP Z M ..[M]
POP Z V .[H]
GOTO +
)
POP Z r .0[r]
POP Z M ..[M]
POP Z H .[M]
POP Z M .
POP Z V .[H]
POP Z z .[N]
GOTO +
l
POP Z r .0[r]
GOTO -
l.
POP Z r .1[r]
GOTO -
l..
POP Z r .2[r]
GOTO -
l...
POP Z r .3[r]
GOTO -
l....
POP Z r .4[r]
GOTO -
l.....
POP Z r .5[r]
GOTO -
l......
POP Z r .6[r]
GOTO -
l.......
POP Z r .7[r]
GOTO -
l........
POP Z r .8[r]
GOTO -
l.........
POP Z r .9[r]
GOTO -
-
GOTO/[M] 
POP Z H .[M]
POP Z M .
POP Z V .[H]
POP Z z .[N]
GOTO +
/
OUTPUT [r]

f is a (maybe) recursive function to convert
integers into dots. Argument is saved in [p] and
output in [o].

U is a function testing S1>=S2,
storing parameter in B, A while saving
A-B into A.

D から始まるコードは、ドットを数値に変換するスタブです。

根底にある原則は私のCの答えと同じです(不可能な解決策のために偽の出力を取り除く)。

スタンドアロン版、149に 156 </デル> <�デル> 157 </デル>
<�デル> 167 </デル> <�デル> 170 </デル> <�デル>
230 </デル>バイトのみI単項をサポート/ O

入力はドットでなければなりません。 10..........

INPUT A
INPUT B
INPUT C
POP N H .
GOTO U
$
POP N A .[A][C]
POP Z H ..[H]
U
POP Z A [A]
POP Z N ..[N]
GOTO D [A] 
GOTO $ .[B] [N]
GOTO U
D
OUTPUT .[H]

U calculates A=A-B, and jumps to
D when A<=0. Otherwise $
assigns A+C to A and call
U.

解決策が見つからない場合はハングします。

Tricks: abuse the “compiler”‘s ability to
interpret empty string. You can rip off conditions in
GOTO statement to make unconditioned jumps and the
same trick works for POP.

Remark: I may golf it more by 3 bytes but by
doing so, mine and WheatWizard’s answer would have the exact same
logic. The result is probably the shortest GraySnail solution and
I’m trying to prove it.

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です