Validator distribusi Fibonacci

8

Terkait: Halo dunia !!! Distribusi fibonacci

Buat program yang mengembalikan True jika input yang diberikan memenuhi spesifikasi berikut, dan False sebaliknya:

  • Hitungan karakter numerik (0-9) pada input cocok dengan angka Fibonacci.
  • Hitungan karakter non-numerik! (0-9) pada input cocok dengan angka Fibonacci segera sebelum hitungan karakter numerik.

Aturan tambahan:

  • Program Anda harus menggunakan urutan Fibonacci yang tepat, per OEIS - artinya, urutan Fibonacci harus dimulai dengan 0, 1, 1, 2, ...
  • Jika jumlah numerik atau non-numerik adalah 1, berikut ini harus terjadi:
    • Numerik 1: Hitungan non-numerik 0 atau 1 harus ditangani sebagai Benar - semua yang lain Salah.
    • Non-Numerik 1: Hitungan angka 1 atau 2 harus ditangani sebagai Benar - semua yang lain Salah.
  • Input dapat diambil sesuka Anda, tetapi program harus mampu menangani teks arbitrer apa pun.
  • Benar / Salah tidak peka terhadap huruf besar-kecil, dan dapat diganti dengan 1/0 atau T / F.
  • Anda hanya dapat melakukan hard-code hingga dua angka Fibonacci.
  • Output mungkin hanya Benar / Salah atau 1/0 atau T / F. Teks tambahan atau kesalahan yang terlihat yang dihasilkan tidak dapat diterima.
Iszi
sumber
berikan beberapa contoh IO
Shubanker
@ Subhanker Lihat pertanyaan terkait untuk beberapa contoh True case.
Iszi
Artikel wikipedia yang relevan: en.wikipedia.org/wiki/…
Justin
Apakah T / F atau T / nihil juga dapat diterima?
John Dvorak
2
Ugh, kamu mengubah tantangan. Sekarang Anda mengatakan bahwa urutan fibonacci dimulai pada 0 dan memberikan kasus khusus untuk 0. Pertanyaan lain yang Anda tautkan untuk melarang 0, jadi saya berasumsi sama.
Justin

Jawaban:

4

Golfscript, 36

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

Penjelasan:

  • :?menyimpan input ke ?.
  • 1 2{.@+.?,<}domenghitung dua angka fibonacci terakhir sampai menyentuh panjang input. Blok itu berbunyi: "duplikat atas, putar nilai ketiga ke atas, tambahkan, duplikat atas, dapatkan input, dapatkan panjangnya, bandingkan".
  • ?,= membandingkan angka fibonacci yang dihitung terakhir dengan panjang input.
  • @ membawa input ke atas
  • {.48<\58<^},memfilter hanya digit. Blok bertuliskan "apakah nilai ASCII di bawah 48 XOR di bawah 58?"
  • ,@= membandingkan panjang string yang difilter ke angka fibonacci yang lebih rendah (hitungan digit)
  • * menggabungkan kedua perbandingan untuk memberikan nilai boolean tunggal.

Demo langsung: http://golfscript.apphb.com/?c=OyIvMDU5OiIKOj8xIDJ7LkArLj8sPH1kbz8sPUB7LjQ4PFw1ODxefSwsQD0q

John Dvorak
sumber
4

Javascript, 92 88 86 karakter

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])

Saya harap Anda tidak keberatan saya telah membuat kode keras untuk tiga angka Fibonacci pertama.

John Dvorak
sumber
Apakah ini menangani beberapa baris teks?
Justin
@Quincunx Chrome memungkinkan Anda menyalin / menempel tetapi tidak mengetik baris baru ke input prompt; belum menguji firefox.
John Dvorak
Kira saya belajar sesuatu yang baru setiap hari.
Justin
Menurut OEIS, tiga angka Fibonacci pertama adalah 0, 1, 1. Dalam hal apa pun, Anda hanya perlu melakukan hard-code pada dua yang pertama - mengapa Anda melakukan tiga?
Iszi
@ Iszi Anda benar - atidak perlu inisialisasi. Adapun mengapa saya mulai dari 1,2,3 - poster tantangan awal tidak menerima 1segera seperti sebelumnya 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

Sangat berharap tidak ada masalah dengan pengodean angka-angka fibonacci pertama

Justin
sumber
Bukankah ada ... spasi terlalu banyak?
John Dvorak
@JanDvorak keempat ruang semua tab, jadi mereka dihitung sebagai 1 karakter per empat ruang. Saya bisa mengganti tab dan spasi, melakukannya sekarang.
Justin
Sepertinya saya seharusnya lebih jelas tentang pengodean angka-angka. Tentu saja Anda harus menentukan urutan, tetapi Anda hanya perlu dua yang pertama untuk melakukannya.
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

Pemakaian:

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
Dom Hastings
sumber
2

Python 3

(105 karakter)

Nama file skrip diteruskan ke program melalui baris perintah

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 karakter)

Script harus ditulis dalam file dengan nama '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)
AMK
sumber
2

Jawa - 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;}

Saya akan mengatakan ini tidak buruk untuk Jawa.

Sunting : Terima kasih kepada Chris Hayes karena menyarankan 0>1 untuk yang salah dan yang 0<1benar.

Justin
sumber
4
Selama kami menggunakan 1==0untuk menghemat karakter, Anda dapat menggunakannya 0<1sebagai pengganti true, dan 0>1untuk false.
Chris Hayes
1

APL, 34 karakter / byte *

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

Mengharapkan string input pada input standar dan mencetak 0 atau 1 sesuai kebutuhan. ⎕IOharus ditetapkan ke 0 (standarnya tergantung pada implementasi.)

Tidak disatukan

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

Contohnya

      {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 dapat ditulis dalam charset byte tunggal (lama) yang memetakan simbol APL ke nilai 128 byte atas. Oleh karena itu, untuk tujuan penilaian, program karakter N yang hanya menggunakan karakter ASCII dan simbol APL dapat dianggap sebagai panjang N byte.

Tobia
sumber
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

Mengambil input baik pada STDINatau sebagai argumen nama file.

Outputnya adalah "true"atau "false".

Darren Stone
sumber