Programme de validation Piem


11

Écrivez un programme qui définit une fonction qui peut vérifier si une variable chaîne appelée "tout ce que vous voulez ou entré par l'utilisateur" est ou non un piem. (piem = une histoire ou un poème dans lequel la longueur des mots représente les chiffres de π ( de Wikipedia ))

Quelques exemples:

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

Vous devez supprimer tout type de ponctuation ou de nouvelle ligne avant le traitement. Golf pur code, les victoires les plus courtes

Date de fin: soirée du 1/10/2014

Réponses diverses

  • Combien de chiffres devons-nous traiter? Plus que 10
  • Comme question d'intérêt, comment interpréter les 0 dans PI? Mots ignorés ou à 10 lettres? Comme mots de 10 lettres
  • "une variable appelée piem" - donc le nom du paramètre doit être piem? Non, ce n'est pas le cas, le texte de la question a été corrigé
  • Un bonus amusant pourrait être une solution qui est elle-même un piem Si votre solution est un piem, vous obtenez * 0,5 bonus
  • Par souci d'argument, est-ce que _ est toujours une ponctuation? Vous pouvez décider s'il s'agit de ponctuation ou non
  • On ne sait pas ce que l'on entend par "tout type de ponctuation", je veux dire,. '"?! ;; ()
  • Donc, les chiffres doivent être comptés? Et l'amende de Law serait fausse? Les chiffres doivent être traités comme des lettres, Law's fine = False; Amende de la loi = Vrai

commentaires

  • La solution APL doit être comptée en octets
  • Si votre solution fonctionne pour plus de 100 chiffres de pi, vous obtenez * 0,8 bonus
  • En raison du grand intérêt, la date de fin est un jour de plus dans le futur.

6
Combien de chiffres devons-nous traiter?
marinus

5
"une variable appelée piem" - donc le nom du paramètre doit être piem? Cela rend toutes les réponses actuelles incorrectes.
Ingo Bürk

2
Un bonus amusant pourrait être une solution qui est en soi un piem.
britishtea

5
Comme question d'intérêt, comment interpréter les 0 dans PI? Mots ignorés ou à 10 lettres?
MickyT

3
C'est un peu dommage que vous ne répondiez pas à des questions très importantes, pourtant vous avez déjà édité une date de fin.
Ingo Bürk

Réponses:


3

APL (39)

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

Il utilise tous les chiffres fournis par la constante pi de l'interpréteur APL, jusqu'à une limite de 99. Dans mon cas (Dyalog APL 14 32 bits), il s'agissait de 16 chiffres. La version 64 bits a probablement plus de chiffres. Cependant, 16 chiffres suffisent pour que les exemples donnés fonctionnent.

Les chaînes qui ont plus que ce nombre de mots échoueront , même si tous les chiffres qu'il a pu vérifier étaient vrais. (Il en va de même pour les autres articles, au moment de la rédaction de cet article.) Par exemple, s'il n'y avait que 10 chiffres, celui «Comment je veux boire un verre» échouerait. Cela peut être corrigé, mais au prix de 14 caractères:

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

Cette version accepte toute chaîne dont les N premiers chiffres sont corrects.


Votre code est le shortes mais ce n'est pas Unicode ... Je devrai penser si vous méritez la victoire ou non, la version javascript est juste un peu plus longue que cela ... Quoi qu'il en soit, j'ai voté pour cette réponse.
Caridorc

1
@marinus La question ne précise pas si les soumissions doivent être notées par caractères ou octets, mais la valeur par défaut est octets (selon le wiki wiki), donc je pense que votre score est plus proche de 60.
Martin Ender

1
Étant donné le bon encodage, c'est 1 octet par caractère. APL est antérieure à Unicode de plusieurs décennies après tout.
marinus

1
@marinus Fair point! Connaissez-vous un codage particulier (existant) dans lequel cela fonctionnerait réellement?
Martin Ender

2
@ MartinBüttner: IBM codepage 907 en est un, mais il y a des charges.
marinus

7

JavaScript (169) (140) (137) (135) (63) pour 17 chiffres de pi

Dans ma version Law's fineet Law ' s fineretourner les deux vrai.

Nouvelle version (63) par Ingo Bürk et hsl

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

Nouvelle version (135) pour 17 chiffres de pi (Merci à 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
}

Ancienne version (169) pour 32 chiffres de 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;
}

Vous pouvez économiser 3 octets avec:1e15*Math.PI+"2384626433832795"
xem

Merci =) En attendant, je l'ai changé en utilisant cette idée, mais maintenant en utilisant uniquement les 17 premiers chiffres.
flawr

@ IngoBürk Merci beaucoup, je vérifie simplement ce qui fonctionne.
flawr

Désolé, tant pis. Cela ne semble pas fonctionner. : / La forboucle ne peut pas être ajoutée de cette façon.
Ingo Bürk

Mais ce qui fonctionne, c'est l'initialisation r=0puis la boucle r+=s[a].length!=p[a](vous pouvez omettre le ;à la fin). Revenez ensuite !r.
Ingo Bürk

7

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

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

Explication

  • L'entrée est considérée comme l'argument d'un lambda. Il attend a String.
  • Pi est calculé jusqu'aux 999décimales et transformé en une chaîne avec le .supprimé.
  • Les signes de ponctuation sont supprimés du poème et il est divisé en mots individuels. "Let's"est compté comme deux mots: "Let"et "s".
  • Utilisez Array#mappour convertir chaque mot à la taille du mot, les concaténer en a String.
  • À l'aide d'une expression régulière, vérifiez si les deux Strings créés commencent par les mêmes caractères.

J'ai appliqué le bonus pour gérer plus de 100 chiffres. _n'est pas traité comme ponctuation dans cette solution.


Notez que vous ne traitez pas _comme une ponctuation.
Martin Ender

Bien repéré. Par souci d'argument, est-ce _ toujours la ponctuation? Qu'en est-il des phrases telles que My nickname on Stack Overflow is britishtea_500.
britishtea du

C'était juste une observation. L'OP n'est pas exactement précis sur les détails ici.
Martin Ender

C'est suffisant. Je vais laisser la réponse pour l'instant jusqu'à ce qu'elle soit spécifiée dans le problème :)
britishtea

En utilisant bigdecimal, vous n'avez aucune limite sur les chiffres PI? Nice (+1)
edc65

4

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

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

Presque la soumission la plus longue jusqu'à présent, mais:

  • Cela fonctionne pour n'importe quel nombre de chiffres de Pi.
  • Il supprime tous les caractères ASCII requis et le saut de ligne, sans fractionner les mots à ces endroits.
  • Il gère correctement les 0 chiffres de Pi (en tant que mots de 10 lettres)

si cela fonctionne pour le nombre de chiffres de Pi, vous obtenez un bonus de 0,8
Caridorc

1

Python - 130 127 116 - 17 chiffres de pi

Comme dans la réponse de @flawr , Law ' s fineet les Law's finedeux renvoient True.

Merci à @Emil d' avoir supprimé 12 caractères du programme.

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

Vous pouvez enregistrer 12 caractères en n'enregistrant pas ldans une variable et en définissant la fonction à l'aide de lambda.
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 chiffres de pi, 104

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

Vous pouvez remplacer le ;par une nouvelle ligne pour plus de lisibilité. De plus, un certain nombre d'espaces peuvent être supprimés.
tomsmeding

1

Python 3 - 129

Ne tient pas compte de la ponctuation:

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

Et maintenant pour une grande solution T-SQL :)

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

Cela crée une fonction de valeur de table en ligne qui utilise un CTE récursif pour détecter les limites des mots.

Crée une fonction scalaire qui mâche son chemin à travers les mots et PI jusqu'à 31 décimales (premier 0). Il est appelé de la manière suivante

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

0

CJam, 40

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

On ne sait pas ce que l'on entend par "tout type de ponctuation"; cette solution supprime les ,.'"?!;;caractères.


0

Outils Bash et Unix, 111

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

0

NodeJS 32 chiffres 230 octets

Je ne peux pas le raccourcir avec JS: D

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');

supprimer les espaces.
Rohan Jhunjhunwala
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.