Trình xác nhận phân phối Fibonacci


8

Liên quan: Xin chào thế giới !!! Phân phối Fibonacci

Tạo một chương trình trả về True nếu đầu vào đã cho đáp ứng các thông số kỹ thuật sau và Sai khác:

  • Số lượng ký tự số (0-9) trong đầu vào khớp với số Fibonacci.
  • Số lượng ký tự không phải là số! (0-9) trong đầu vào khớp với số Fibonacci ngay trước số lượng ký tự số.

Quy tắc bổ sung:

  • Chương trình của bạn phải sử dụng chuỗi Fibonacci phù hợp, theo OEIS - nghĩa là, chuỗi Fibonacci phải bắt đầu bằng 0, 1, 1, 2, ...
  • Nếu số lượng hoặc số không là số, thì phải xảy ra các trường hợp sau:
    • Số 1: Số không phải là số 0 hoặc 1 phải được xử lý là True - tất cả các số khác Sai.
    • Non-Numerics 1: Numerics đếm 1 hoặc 2 nên được xử lý là True - tất cả các số khác Sai.
  • Đầu vào có thể được lấy theo cách bạn muốn, nhưng chương trình phải có khả năng xử lý bất kỳ văn bản tùy ý nào.
  • Đúng / Sai không phân biệt chữ hoa chữ thường và có thể được thay thế bằng 1/0 hoặc T / F.
  • Bạn chỉ có thể mã cứng tối đa hai số Fibonacci.
  • Đầu ra chỉ có thể là Đúng / Sai hoặc 1/0 hoặc T / F. Bất kỳ văn bản bổ sung hoặc lỗi hiển thị được tạo ra là không thể chấp nhận.

cho một số ví dụ IO
Shubanker

@Subhanker Xem câu hỏi được liên kết cho một số ví dụ Đúng trường hợp.
Iszi

Bài viết trên wikipedia có liên quan: en.wikipedia.org/wiki/ Kẻ
Justin

T / F hay T / nil có được chấp nhận không?
John Dvorak

2
Ugh, bạn đã thay đổi thử thách. Bây giờ bạn nói rằng chuỗi Wikipedia bắt đầu từ 0 và đưa ra các trường hợp cụ thể cho 0. Câu hỏi khác mà bạn liên kết với cấm 0, vì vậy tôi giả sử như vậy.
Justin

Câu trả lời:


4

Golf, 36

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

Giải trình:

  • :?lưu trữ đầu vào vào ?.
  • 1 2{.@+.?,<}dotính hai số cuối cùng cho đến khi nó đạt đến độ dài đầu vào. Khối đọc: "nhân đôi đỉnh, xoay giá trị thứ ba lên trên cùng, thêm chúng, nhân đôi đỉnh, lấy đầu vào, lấy độ dài của nó, so sánh".
  • ?,= so sánh số lượng tính toán cuối cùng với chiều dài đầu vào.
  • @ đưa đầu vào lên hàng đầu
  • {.48<\58<^},chỉ lọc các chữ số. Khối đọc "là giá trị ASCII dưới 48 XOR dưới 58?"
  • ,@= so sánh độ dài chuỗi được lọc với số lượng thấp hơn (số chữ số)
  • * hợp nhất hai so sánh để cung cấp một giá trị boolean duy nhất.

Bản demo trực tiếp: http://golfscript.apphb.com/?c=OyIvMDU5OiIKOj8xIDJ7LkArLj8sPH1kbz8sPUB7LjQ4PFw1ODxefSwsQD0q


4

Javascript, 92 88 86 ký tự

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

Tôi hy vọng bạn không phiền tôi đã mã hóa ba số Fibonacci đầu tiên.


Nó xử lý nhiều dòng văn bản?
Justin

@Quincunx Chrome cho phép bạn sao chép / dán nhưng không nhập dòng mới vào đầu vào nhanh chóng; chưa thử nghiệm firefox.
John Dvorak

Đoán tôi học được một cái gì đó mới mỗi ngày.
Justin

Theo OEIS, ba số Fibonacci đầu tiên là 0, 1, 1. Trong mọi trường hợp, bạn chỉ cần mã hóa hai số đầu tiên - tại sao bạn lại làm ba?
Iszi

@Iszi bạn đúng - akhông cần khởi tạo. Về lý do tại sao tôi bắt đầu ở 1,2,3 - áp phích của thử thách ban đầu không chấp nhận 1như trước ngay lập tức 1.
John Dvorak

3

Con trăn - 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

Thực sự hy vọng không có vấn đề gì với việc mã hóa vài số đầu tiên của Wikipedia


Không có ... quá nhiều khoảng trắng sao?
John Dvorak

@JanDvorak bốn không gian đó đều là các tab, vì vậy chúng được tính là 1 char trên bốn khoảng trắng. Tôi có thể thay thế các tab và không gian, làm điều đó ngay bây giờ.
Justin

Có vẻ như tôi nên rõ ràng hơn một chút về việc mã hóa các con số. Tất nhiên bạn sẽ cần phải đánh dấu trình tự, nhưng bạn chỉ cần hai cái đầu tiên để thực hiện.
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

Sử dụng:

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

Con trăn 3

(105 ký tự)

Tên tệp script được truyền đến chương trình thông qua dòng lệnh

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 ký tự)

Tập lệnh phải được viết trong tệp có tên '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;}

Tôi muốn nói rằng điều này không tệ cho Java.

Chỉnh sửa : Cảm ơn Chris Hayes đã gợi ý 0>1 cho sai và 0<1đúng.


4
Miễn là chúng tôi đang sử dụng 1==0để lưu vào các ký tự, bạn có thể sử dụng 0<1thay thế true0>1cho false.
Chris Hayes

1

APL, 34 ký tự / byte *

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

Yêu cầu chuỗi đầu vào trên đầu vào tiêu chuẩn và in 0 hoặc 1 theo yêu cầu. ⎕IOphải được đặt thành 0 (mặc định là phụ thuộc vào việc triển khai.)

Ung dung

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

Ví dụ

      {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 có thể được viết bằng bộ ký tự byte đơn (di sản) riêng để ánh xạ các ký hiệu APL đến các giá trị 128 byte trên. Do đó, với mục đích ghi điểm, một chương trình gồm các ký tự N chỉ sử dụng các ký tự ASCII và các ký hiệu APL có thể được coi là dài N byte.


0

Hồng ngọc, 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

Đưa đầu vào vào STDINhoặc làm đối số tên tệp.

Sản lượng là một trong hai "true"hoặc "false".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.