Fibonacci-Verteilungsvalidator

8

Verwandte: Hallo Welt !!! Fibonacci-Verteilung

Erstellen Sie ein Programm, das True zurückgibt, wenn eine bestimmte Eingabe die folgenden Spezifikationen erfüllt, andernfalls False:

  • Die Anzahl der numerischen Zeichen (0-9) in der Eingabe entspricht einer Fibonacci-Zahl.
  • Die Anzahl der nicht numerischen Zeichen! (0-9) in der Eingabe entspricht der Fibonacci-Zahl unmittelbar vor der Anzahl der numerischen Zeichen.

Zusätzliche Regeln:

  • Ihr Programm muss die richtige Fibonacci-Sequenz gemäß OEIS verwenden - das heißt, die Fibonacci-Sequenz muss mit beginnen 0, 1, 1, 2, ...
  • Wenn die Anzahl der numerischen oder nicht numerischen Werte 1 beträgt, muss Folgendes auftreten:
    • Numerik 1: Eine nicht numerische Zählung von 0 oder 1 sollte als wahr behandelt werden - alle anderen als falsch.
    • Nicht-Numerik 1: Die Zahl 1 oder 2 sollte als Wahr behandelt werden - alle anderen als Falsch.
  • Die Eingabe kann nach Belieben erfolgen, das Programm muss jedoch in der Lage sein, beliebigen Text zu verarbeiten.
  • Richtig / Falsch unterscheidet nicht zwischen Groß- und Kleinschreibung und kann durch 1/0 oder T / F ersetzt werden.
  • Sie dürfen nur bis zu zwei Fibonacci-Zahlen fest codieren.
  • Die Ausgabe kann nur True / False oder 1/0 oder T / F sein. Zusätzlicher Text oder sichtbare Fehler sind nicht akzeptabel.
Iszi
quelle
Geben Sie ein Beispiel IO
Shubanker
@Subhanker In der verknüpften Frage finden Sie einige Beispiele für wahre Fälle.
Iszi
Relevanter Wikipedia-Artikel: en.wikipedia.org/wiki/…
Justin
ist T / F oder T / nil auch akzeptabel?
John Dvorak
2
Ugh, du hast die Herausforderung geändert. Jetzt sagen Sie, dass die Fibonacci-Sequenz bei 0 beginnt und bestimmte Fälle für 0 angibt. Die andere Frage, die Sie mit 0 verknüpft haben, verbietet 0, also habe ich dasselbe angenommen.
Justin

Antworten:

4

Golfscript, 36

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

Erläuterung:

  • :?speichert die Eingabe in ?.
  • 1 2{.@+.?,<}doberechnet die letzten beiden Fibonacci-Zahlen, bis die Eingabelänge erreicht ist. Der Block lautet: "Dupliziere die Oberseite, drehe den dritten Wert nach oben, füge sie hinzu, dupliziere die Oberseite, erhalte die Eingabe, erhalte ihre Länge, vergleiche".
  • ?,= vergleicht die zuletzt berechnete Fibonacci-Zahl mit der Eingabelänge.
  • @ bringt die Eingabe nach oben
  • {.48<\58<^},filtert nur Ziffern heraus. Der Block lautet "liegt der ASCII-Wert unter 48 XOR unter 58?"
  • ,@= vergleicht die gefilterte Stringlänge mit der unteren Fibonacci-Zahl (Anzahl der Ziffern)
  • * führt die beiden Vergleiche zusammen, um einen einzelnen booleschen Wert bereitzustellen.

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

John Dvorak
quelle
4

Javascript, 92 88 86 Zeichen

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

Ich hoffe, es macht Ihnen nichts aus, dass ich die ersten drei Fibonacci-Zahlen hart codiert habe.

John Dvorak
quelle
Behandelt es mehrere Textzeilen?
Justin
Mit @Quincunx Chrome können Sie Zeilenumbrüche kopieren / einfügen, aber nicht in die Eingabeaufforderung eingeben. habe Firefox nicht getestet.
John Dvorak
Ich schätze, ich lerne jeden Tag etwas Neues.
Justin
Laut OEIS sind die ersten drei Fibonacci-Zahlen 0, 1, 1. Auf jeden Fall sollten Sie nur die ersten beiden hart codieren müssen - warum haben Sie drei gemacht?
Iszi
@Iszi du hast recht - abrauchte keine Initialisierung. Warum fange ich bei 1,2,3 an - das Poster der ersten Herausforderung wurde nicht 1als unmittelbar vorhergehend akzeptiert 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

Ich hoffe wirklich, dass es kein Problem gibt, die ersten Fibonacci-Zahlen fest zu codieren

Justin
quelle
Gibt es nicht ... zu viel Leerzeichen?
John Dvorak
@ JanDvorak Diese vier Leerzeichen waren alle Tabulatoren, daher wurden sie als 1 Zeichen pro vier Leerzeichen gezählt. Ich könnte Tabulatoren und Leerzeichen abwechseln und das jetzt tun.
Justin
Sieht so aus, als hätte ich die Zahlen etwas klarer codieren sollen. Natürlich müssen Sie die Sequenz vorbereiten, aber Sie sollten nur die ersten beiden benötigen, um dies zu tun.
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

Verwendungszweck:

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
quelle
2

Python 3

(105 Zeichen)

Der Name der Skriptdatei wird über die Befehlszeile an das Programm übergeben

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

Das Skript muss in eine Datei mit dem Namen 's' geschrieben werden.

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

Ich würde sagen, das ist nicht schlecht für Java.

Edit : Danke an Chris Hayes für den Vorschlag 0>1 für falsch und 0<1für wahr.

Justin
quelle
4
Solange wir 1==0Zeichen speichern, können Sie diese 0<1anstelle von trueund 0>1für verwenden false.
Chris Hayes
1

APL, 34 Zeichen / Bytes *

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

Erwartet die Eingabezeichenfolge bei der Standardeingabe und druckt je nach Bedarf entweder 0 oder 1. ⎕IOmuss auf 0 gesetzt werden (der Standard ist implementierungsabhängig.)

Ungolfed

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

Beispiele

      {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 kann in einem eigenen ( alten) Einzelbyte -Zeichensatz geschrieben werden, der APL-Symbole den oberen 128-Byte-Werten zuordnet
. Für die Bewertung kann daher ein Programm mit N Zeichen , das nur ASCII-Zeichen und APL-Symbole verwendet, als N Byte lang angesehen werden.

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

Nimmt Eingaben entweder am STDINoder als Dateinamenargument vor.

Die Ausgabe ist entweder "true"oder "false".

Darren Stone
quelle