フィボナッチ分布バリデーター


8

関連: こんにちは世界!!! フィボナッチ分布

特定の入力が次の仕様を満たす場合はTrueを返し、そうでない場合はFalseを返すプログラムを作成します。

  • 入力内の数字(0〜9)の数がフィボナッチ数と一致します。
  • 入力内の非数値文字の数!(0-9)は、数値文字の数の直前のフィボナッチ数と一致します。

追加ルール:

  • プログラムは、OEISに従って適切なフィボナッチ数列を使用する必要があります。つまり、フィボナッチ数列は 0, 1, 1, 2, ...
  • 数値または非数値のカウントが1の場合、以下が発生する必要があります。
    • 数値1:0 または 1の非数値カウントはTrueとして処理する必要があります-他のすべてはFalseです。
    • 非数値1:1 または 2の数値カウントはTrueとして処理する必要があります-他のすべてはFalseです。
  • 入力は任意に取得できますが、プログラムは任意のテキストを処理できる必要があります。
  • True / Falseは大文字と小文字を区別せず、1/0またはT / Fで置き換えることができます。
  • 最大2つのフィボナッチ数のみをハードコーディングできます。
  • 出力が可能にのみ FALSE TRUE /または1/0またはT / Fなります。生成された追加のテキストまたは目に見えるエラーは受け入れられません。

IOの例をいくつか挙げます
Shubanker 2014年

@Subhanker Trueのケースの例については、リンクされた質問を参照してください。
Iszi

関連ウィキペディアの記事:en.wikipedia.org/wiki/...
ジャスティン

T / FまたはT / nilも受け入れられますか?
John Dvorak

2
ええと、あなたは挑戦を変えました。ここで、フィボナッチ数列は0から始まり、0の特定のケースを与えると言っています。
ジャスティン

回答:


4

Golfscript、36

:?1 2{.@+.?,<}do?,=@{.48<\58<^},,@=*

説明:

  • :?入力をに保存します?
  • 1 2{.@+.?,<}do入力の長さに達するまで、最後の2つのフィボナッチ数を計算します。ブロックは「トップを複製し、3番目の値をトップに回転させ、それらを追加し、トップを複製し、入力を取得し、長さを取得し、比較する」と読み取ります。
  • ?,= 最後に計算されたフィボナッチ数を入力の長さと比較します。
  • @ 入力を上に持ってくる
  • {.48<\58<^},数字のみを除外します。ブロックは、「ASCII値は48 XOR未満で58未満ですか?」と読み取ります。
  • ,@= フィルタリングされた文字列の長さを下位のフィボナッチ数(桁数)と比較します
  • * 2つの比較をマージして、単一のブール値を提供します。

ライブデモ:http : //golfscript.apphb.com/?c=OyIvMDU5OiIKOj8xIDJ7LkArLj8sPH1kbz8sPUB7LjQ4PFw1ODxefSwsQD0q


4

Javascript、 92 88 86文字

t=prompt()
for(b=c=1;c<t[l='length'];c=a+b)a=b,b=c
alert(c==t[l]&b==t.match(/\d/g)[l])

最初の3つのフィボナッチ数をハードコーディングしたことを気にしないでください。


複数行のテキストを処理しますか?
ジャスティン

@Quincunx Chromeでは、プロンプト入力に改行を入力することはできませんが、コピー/貼り付けできます。Firefoxをテストしていません。
John Dvorak

私は毎日何か新しいことを学ぶと思います。
ジャスティン

OEISによると、最初の3つのフィボナッチ数は0、1、1です。いずれにしても、最初の2つをハードコーディングするだけで十分です-なぜ3つしたのですか?
Iszi

@Isziあなたは正しい- a初期化の必要はありませんでした。なぜ私は1、2、3から始めるのですか。最初のチャレンジのポスターが1直前のポスターとして受け入れられませんでした1
John Dvorak、

3

Pythonの- 128 125

import re
def v(s):
 l=len(re.sub("\d","",s));L=len(s)-l;a,b=1,2
 while a<L:
    if a==l and b==L:
     print 1;return
    b,a=a+b,b
 print 0

最初のいくつかのフィボナッチ数をハードコーディングしても問題ないことを本当に願っています


余計なスペースはありませんか?
John Dvorak

@JanDvorakこれらの4つのスペースはすべてタブなので、4つのスペースごとに1文字としてカウントされます。タブとスペースを入れ替えることができました。
Justin

数値のハードコーディングについてもう少し明確にすべきだったようです。もちろんシーケンスを準備する必要がありますが、最初の2つだけで十分です。
Iszi

2

Perl、92

$_=join"",<>;@_=1;$d=s/\d//g;push@_,$t=$_[-1]+$_[-2]while$t<$d;print$t==$d&$_[-2]==y///c?1:0

使用法:

cat fib-test 
print "Hello world%s"%("!"*int(3.141592653589793238462643383279502884197169399375105820))

perl -e '$_=join"",<>;@_=1;$d=s/\d//g;push@_,$t=$_[-1]+$_[-2]while$t<$d;print$t==$d&$_[-2]==y///c?1:0' fib-test
1

2

Python 3

(105文字)

スクリプトファイル名はコマンドラインを介してプログラムに渡されます

import sys
a=[0]*2
for b in open(sys.argv[1]).read():a['/'<b<':']+=1
a,b=a
while a>0:a,b=b-a,a
print(b==1)

(87文字)

スクリプトは 's'という名前のファイルに書き込む必要があります

a=[0]*2
for b in open('s').read():a['/'<b<':']+=1
a,b=a
while a>0:a,b=b-a,a
print(b==1)

2

Java- 147 145

boolean v(String s){int l=s.replaceAll("\\d","").length(),L=s.length()-l,a=1,b=2,c;while(a<L){if(a==l&&b==L)return 0<1;c=b;b+=a;a=c;}return 0>1;}

これはJavaに悪いことではないと思います。

編集:偽と真を提案 0>1してくれたChris Hayesに感謝し0<1ます。


4
限り、私たちが使っているよう1==0な文字を節約するために、あなたが使用できる0<1の代わりにtrue、と0>1のためにfalse
Chris Hayes、

1

APL、34文字/バイト*

{n←+/⍵∘.=⍞∊⎕D⋄n≡+\∘⌽⍣{≥/+/⊃⍺n}⍵}⍳2

標準入力で入力文字列を想定し、必要に応じて0または1を出力します。⎕IO0に設定する必要があります(デフォルトは実装依存です)。

未ゴルフ

s←⍞                ⍝ read input string
d←s∊⎕D             ⍝ vector with 1 for each digit, 0 for each non-digit in s
n←+/0 1∘.=d        ⍝ 2-vector with number of non-digits and number of digits in s
f←+\∘⌽             ⍝ a function that computes a fibonacci step (f 2 3 → 3 5)
t←f⍣{≥/+/⊃⍺n}0 1   ⍝ apply f repeatedly, starting with 0 1, until we get two fibonacci
                   ⍝   terms whose sum is ≥ the length of the input string (sum of n)
n≡t                ⍝ return 1 if the fibonacci terms match the no. of digits and non-digits

      {n←+/⍵∘.=⍞∊⎕D⋄n≡+\∘⌽⍣{≥/+/⊃⍺n}⍵}⍳2
%~n01234
1
      {n←+/⍵∘.=⍞∊⎕D⋄n≡+\∘⌽⍣{≥/+/⊃⍺n}⍵}⍳2
x'48656C6C6F20776F726C642121'||'!'
1
      {n←+/⍵∘.=⍞∊⎕D⋄n≡+\∘⌽⍣{≥/+/⊃⍺n}⍵}⍳2
[72 101 108 108 111 32 119 111 114 108 100 33 {.}2*]''+
1
      {n←+/⍵∘.=⍞∊⎕D⋄n≡+\∘⌽⍣{≥/+/⊃⍺n}⍵}⍳2
What?12345
0

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*:APLは、APLシンボルを上位128バイトの値にマップする独自の(レガシー)シングルバイト文字セットで記述できます。したがって、スコアリングの目的で、ASCII文字とAPL記号のみを使用する N文字のプログラムは、Nバイトの長さと見なすことができます。


0

Ruby、85

d=-(n=(i=$<.read).gsub(/\d/,'').size)+i.size
a=b=1;while b<d;b=a+a=b end;p b==d&&a==n

入力を、STDINまたはファイル名の引数として受け取ります。

出力は"true"または"false"です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.