Piem Validator Programm


11

Schreiben Sie ein Programm, das eine Funktion definiert, die prüfen kann, ob eine Zeichenfolgenvariable mit dem Namen "Alles, was Sie wollen oder vom Benutzer eingegeben werden" ein Piem ist oder nicht. (piem = eine Geschichte oder ein Gedicht, in dem die Wortlängen die Ziffern von π darstellen ( aus Wikipedia ))

Einige Beispiele:

myfunction("I am clearly wrong") # False
myfunction("How I want a drink, alcoholic of course, after the heavy lectures involving quantum mechanics") #True (Taken from Wikipedia)
myfunction("Law ' s fine") # True

Sie sollten jede Art von Interpunktion oder Zeilenumbruch vor der Verarbeitung löschen. Pure Code Golf, der kürzeste gewinnt

Enddatum: Abend des 10.01.2014

Verschiedene Antworten

  • Wie viele Ziffern müssen wir verarbeiten? Mehr als 10
  • Wie sind 0 in PI zu interpretieren? Übersprungene Wörter oder Wörter mit 10 Buchstaben? Als 10 Buchstaben Wörter
  • "eine Variable namens piem" - also muss der Name des Parameters piem sein? Nein, der Fragetext wurde nicht korrigiert
  • Ein Spaßbonus kann eine Lösung sein, die selbst ein Piem ist. Wenn Ihre Lösung ein Piem ist, erhalten Sie einen Bonus von * 0,5
  • Ist _ aus Gründen der Argumentation immer Interpunktion? Sie können entscheiden, ob es sich um Interpunktion handelt oder nicht
  • Es ist unklar, was unter "irgendeiner Art von Interpunktion" zu verstehen ist. '"?! ;; ()
  • Also sollten Ziffern gezählt werden? Und Laws Geldstrafe wäre falsch? Ziffern sollten als Buchstaben behandelt werden, Law's fine = False; Das Gesetz ist in Ordnung = wahr

Bemerkungen

  • Die APL-Lösung sollte in Bytes gezählt werden
  • Wenn Ihre Lösung für mehr als 100 Stellen pi funktioniert, erhalten Sie einen Bonus von * 0,8
  • Aufgrund des großen Interesses liegt das Enddatum noch einen Tag in der Zukunft.

6
Wie viele Ziffern müssen wir verarbeiten?
Marinus

5
„eine Variable namens piem“ - so der Name des Parameters muss sein piem? Das macht alle aktuellen Antworten falsch.
Ingo Bürk

2
Ein Spaßbonus könnte eine Lösung sein, die selbst ein Piem ist.
Britishtea

5
Wie sind 0 in PI zu interpretieren? Übersprungene Wörter oder Wörter mit 10 Buchstaben?
MickyT

3
Es ist eine Schande, dass Sie nicht auf sehr wichtige Fragen antworten, aber bereits ein Enddatum bearbeitet haben.
Ingo Bürk

Antworten:


3

APL (39)

{N≡(≢N←≢¨('\w+'⎕S'\0')⍵)↑⍎¨'_. '~⍨99⍕○1}

Es werden alle Ziffern verwendet, die die pi-Konstante des APL-Interpreters liefert, bis zu einer Grenze von 99. In meinem Fall (Dyalog APL 14 32-Bit) waren das 16 Ziffern. Die 64-Bit-Version hat wahrscheinlich mehr Ziffern. 16 Ziffern reichen jedoch aus, damit die angegebenen Beispiele funktionieren.

Zeichenfolgen mit mehr als dieser Anzahl von Wörtern schlagen fehl , selbst wenn alle zu überprüfenden Ziffern wahr sind. (Dasselbe gilt für andere Posts zum Zeitpunkt dieses Schreibens.) Wenn beispielsweise nur 10 Ziffern vorhanden wären, würde die Meldung "Wie ich etwas trinken möchte" fehlschlagen. Dies kann behoben werden, jedoch auf Kosten von 14 Zeichen:

{(≢¨('\w+'⎕S'\0')⍵){∧/(⌊/≢¨⍺⍵)↑∨⌿⍺∘.=⍵}⍎¨'_. '~⍨99⍕○1}

Diese Version akzeptiert alle Zeichenfolgen, bei denen die ersten N Ziffern korrekt sind.


Ihr Code ist der Short, aber es ist kein Unicode ... Ich muss darüber nachdenken, ob Sie den Sieg verdienen oder nicht, die Javascript-Version ist nur ein bisschen länger als diese ... Wie auch immer, ich habe diese Antwort positiv bewertet.
Caridorc

1
@marinus Die Frage gibt nicht an, ob Einsendungen nach Zeichen oder Bytes bewertet werden sollen, aber die Standardeinstellung ist Bytes (gemäß Tag-Wiki), daher denke ich, dass Ihre Punktzahl näher bei 60 liegt.
Martin Ender

1
Bei richtiger Codierung ist es 1 Byte pro Zeichen. Immerhin liegt APL Jahrzehnte vor Unicode.
Marinus

1
@ Marinus Fairer Punkt! Kennen Sie eine bestimmte (vorhandene) Codierung, in der das tatsächlich funktionieren würde?
Martin Ender

2
@ MartinBüttner: IBM Codepage 907 ist eine, aber es gibt viele.
Marinus

7

JavaScript (169) (140) (137) (135) (63) für 17 Stellen pi

In meiner Version Law's fineund Law ' s finebeide wahr zurückgeben.

Neueste Version (63) von Ingo Bürk und hsl

f=s=>!s.split(/\W+/).some((x,i)=>x.length-(Math.PI*1e16+'')[i])

Neue Version (135) für 17 Stellen von pi (Dank an Ingo Bürk):

f=(s)=>{
s=s.split(/[!"#$%&'()*+, \-.\/:;<=>?@[\\\]^_`{|}~]+/);
p=Math.PI*1e16+'';
    r=0;
    for(a=s.length;a--;)r+=s[a].length!=p[a];
    return !r
}

Alte Version (169) für 32 Stellen von pi:

f=(s)=>{
s=s.split(/[!"#$%&'()*+, \-.\/:;<=>?@[\\\]^_`{|}~]+/);
p="31415926535897932384626433832795".split('');
    r=1;
    for(a=s.length;a--;)if(s[a].length!=p[a]){r=0};
    return r;
}

Sie können 3 Bytes speichern mit:1e15*Math.PI+"2384626433832795"
xem

Danke =) In der Zwischenzeit habe ich es mit dieser Idee geändert, aber jetzt nur mit den ersten 17 Ziffern.
Fehler

@ IngoBürk Vielen Dank, ich überprüfe nur, was funktioniert.
Fehler

Tut mir leid, vergiss es. Das scheint nicht zu funktionieren. : / Die forSchleife kann auf diese Weise nicht hinzugefügt werden.
Ingo Bürk

Aber was funktioniert, ist zu initialisieren r=0und dann einfach zu durchlaufen r+=s[a].length!=p[a](Sie können das ;am Ende weglassen ). Dann kehre zurück !r.
Ingo Bürk

7

Ruby, 113 101 79 (98 * 0,8)

require"bigdecimal/math"
x=->p{!(BigMath.PI(999).to_s[2..-1]!~/^#{p.scan(/\w+/).map(&:size)*''}/)}

Erläuterung

  • Die Eingabe wird als Argument für ein Lambda verwendet. Es erwartet a String.
  • Pi wird bis zu 999Dezimalstellen berechnet und mit .entferntem Wert in einen String umgewandelt .
  • Satzzeichen werden aus dem Gedicht entfernt und in einzelne Wörter aufgeteilt. "Let's"wird als zwei Wörter gezählt: "Let"und "s".
  • Verwenden Sie Array#mapdiese Option , um jedes Wort in die Größe des Wortes umzuwandeln und in ein Wort zu verketten String.
  • Überprüfen Sie mit einem Regexp, ob die beiden erstellten Strings mit denselben Zeichen beginnen.

Ich habe den Bonus für den Umgang mit mehr als 100 Ziffern angewendet. _wird in dieser Lösung nicht als Interpunktion behandelt.


Beachten Sie, dass Sie nicht _als Interpunktion behandeln .
Martin Ender

Gut erkannt. Ist aus Gründen der Argumentation _ immer Interpunktion? Was ist mit Sätzen wie My nickname on Stack Overflow is britishtea_500.
Britishtea

Es war nur eine Beobachtung. Das OP ist nicht genau über die Details hier.
Martin Ender

Meinetwegen. Ich werde die Antwort
vorerst so lange belassen,

Mit bigdecimal haben Sie keine Begrenzung für PI-Ziffern? Nizza (+1)
edc65

4

Mathematica, 123 Bytes * 0,8 = 98,4

f=#&@@RealDigits[Pi,10,Length[d=StringLength/@StringSplit@StringReplace[#,RegularExpression@"[!-.:-?]
"->""]/. 10->0]]==d&;

Fast die längste Einreichung bisher, aber:

  • Es funktioniert für eine beliebige Anzahl von Pi-Stellen.
  • Es entfernt alle erforderlichen ASCII-Zeichen und den Zeilenumbruch, ohne die Wörter an diesen Stellen aufzuteilen.
  • Es behandelt 0-stellige Stellen in Pi korrekt (als 10-Buchstaben-Wörter)

Wenn es für die Anzahl der Pi-Stellen funktioniert, erhalten Sie einen Bonus von 0,8
Caridorc

1

Python - 130 127 116 - 17 Stellen pi

Wie in der Antwort von @flawr , Law ' s fineund Law's finebeide geben True zurück.

Vielen Dank an @Emil für das Entfernen von 12 Zeichen aus dem Programm.

import re
f=lambda x:all(j==int("31415926535897932"[i])for i,j in enumerate([len(s)for s in re.findall("[\w]+",x)]))

Sie können 12 Zeichen speichern, indem Sie nicht lin einer Variablen speichern und die Funktion mit Lambda definieren.
Emil

1

Java, 185

boolean f(String...s){s=s[0].replaceAll("\\W","~").replaceAll("~+","~").split("~");for(int i=0;i<s.length;){if(s[i].length()!=(int)(Math.PI*Math.pow(10,i++)%10))return 0>1;}return 1>0;}

1

Python 3, 17 Stellen von pi, 104

import re;f=lambda s:all(map(int.__eq__, map(int, '31415926535897932'), map(len,re.findall('[\w]+',s))))

Sie können die aus ;Gründen der Lesbarkeit durch eine neue Zeile ersetzen . Außerdem können einige Leerzeichen entfernt werden.
Tomsmeding

1

Python 3 - 129

Interpunktion wird nicht berücksichtigt:

import math
f=lambda p:all(1if len(p.split(' ')[i])!=int(str(math.pi).replace('.','')[i])else 1for i in range(len(p.split(' '))))

0

T-SQL 488 383

Und jetzt zu einer großen T-SQL-Lösung :)

CREATE FUNCTION F(@s VARCHAR(MAX))RETURNS CHAR(6) AS BEGIN DECLARE @ CHAR='T',@p VARCHAR(50)='31415926535897932384626433832795028841971693993751',@i INT=0WHILE @='T'AND @s<>''BEGIN SET @i=PATINDEX('%[^a-z0-9]%',@s)IF @i=0RETURN'#True'IF @i-1<>LEFT(@p,1)RETURN'#False'SET @p=STUFF(@p,1,1,'')SET @s=STUFF(@s,1,@i,'')SET @s=STUFF(@s,1,PATINDEX('%[a-z0-9]%',@s)-1,'')END RETURN'#True'END

Dadurch wird eine Inline-Tabellenwertfunktion erstellt, die einen rekursiven CTE verwendet, um Wortgrenzen zu erkennen.

Erstellt eine Skalarfunktion, die sich durch die Wörter und PI auf 31 Dezimalstellen (erste 0) kaut. Es wird folgendermaßen aufgerufen

SELECT dbo.f('SQL I golf, a large procedure is normal. Hefty not terse') --#True

0

CJam, 40

"
,.'\"?!;:"{-}/S%{,PAV#*iA%=V):V}/]0#)!

Es ist unklar, was unter "jeglicher Art von Interpunktion" zu verstehen ist. Diese Lösung entfernt die ,.'"?!;;Zeichen.


0

Bash- und Unix-Tools, 111

f() { grep ^"$(echo "$@"|grep -Po '[\w]+'|xargs -n1 sh -c 'echo ${#0}'|xargs|tr -d ' ')"<<<31415926535897932; 

0

NodeJS 32 Ziffern 230 Bytes

Ich kann es mit JS: D nicht kürzer machen

var p = "31415926535897932384626433832795", i = 0;
console.log(process.argv[2].split(/[\s,.]+/).every(function(w) {
    if (parseInt(p.charAt(i)) !== w.length) {
        return false;
    }
    i++;
    return true;
}) ? 'True' : 'False');

Leerzeichen entfernen.
Rohan Jhunjhunwala
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.