Program walidacyjny Piem

11

Napisz program, który definiuje funkcję, która może sprawdzić, czy zmienna łańcuchowa o nazwie „cokolwiek chcesz lub wprowadzona przez użytkownika” jest piem. (piem = historia lub wiersz, w których długości wyrazów przedstawiają cyfry π ( z Wikipedii ))

Kilka przykładów:

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

Przed przetwarzaniem powinieneś usunąć każdą interpunkcję lub znak nowej linii. Golf z czystym kodem, najkrótsze wygrane

Data zakończenia: wieczór 01.10.2014

Różne odpowiedzi

  • Ile cyfr musimy obsłużyć? Więcej niż 10
  • Co ciekawe, jak należy interpretować zero w PI? Pominięte lub 10 literowe słowa? Jako 10 liter słów
  • „zmienna o nazwie piem” - więc nazwa parametru musi być piem? Nie, nie ma, poprawiono tekst pytania
  • Zabawny bonus może być rozwiązaniem, które samo w sobie jest piemem. Jeśli twoje rozwiązanie to piema, otrzymasz * 0,5 premii
  • Dla argumentu, czy _ zawsze jest interpunkcją? Możesz zdecydować, czy to interpunkcja, czy nie
  • Nie jest jasne, co należy rozumieć przez „jakąkolwiek interpunkcję”, mam na myśli. ”„?! ;;;)
  • Więc cyfry powinny być liczone? A grzywna Law byłaby fałszywa? Cyfry należy traktować jak litery, grzywna Law = False; Prawo jest w porządku = Prawda

Komentarze

  • Rozwiązanie APL należy liczyć w bajtach
  • Jeśli twoje rozwiązanie działa na ponad 100 cyfrach pi, otrzymasz * 0,8 premii
  • Ze względu na duże zainteresowanie terminem końcowym jest jeszcze jeden dzień w przyszłości.
Caridorc
źródło
6
Ile cyfr musimy obsłużyć?
marinus
5
„zmienna o nazwie piem” - więc nazwa parametru musi być piem? To sprawia, że ​​wszystkie aktualne odpowiedzi są nieprawidłowe.
Ingo Bürk
2
Zabawny bonus może być rozwiązaniem, które samo w sobie jest piem.
britishtea
5
Co ciekawe, jak należy interpretować zero w PI? Pominięte lub 10 literowe słowa?
MickyT,
3
Szkoda, że ​​nie odpowiadasz na bardzo ważne pytania, ale edytowałeś już datę końcową.
Ingo Bürk

Odpowiedzi:

3

APL (39)

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

Wykorzystuje wszystkie cyfry, jakie zapewnia stała pi interpretera APL, do limitu 99. W moim przypadku (Dyalog APL 14 32-bit) było to 16 cyfr. Wersja 64-bitowa prawdopodobnie ma więcej cyfr. Jednak 16 cyfr wystarcza, aby podane przykłady działały.

Ciągi zawierające więcej niż tę liczbę słów nie będą działać , nawet jeśli wszystkie cyfry, które można sprawdzić, będą prawdziwe. (To samo dotyczy innych postów, jak w tym piśmie.) Na przykład, gdyby było tylko 10 cyfr, to „Jak chcę drinka” nie powiedzie się. Można to naprawić, ale kosztem 14 znaków:

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

Ta wersja zaakceptuje każdy ciąg, w którym pierwsze N cyfr jest poprawnych.

marinus
źródło
Twój kod jest skrótem, ale nie jest to Unicode ... Muszę się zastanowić, czy zasługujesz na wygraną, czy nie, wersja javascript jest tylko trochę dłuższa ... W każdym razie głosowałem za odpowiedzią.
Caridorc
1
@marinus Pytanie nie określa, czy zgłoszenia powinny być oceniane według znaków czy bajtów, ale domyślnie są to bajty (zgodnie z tagiem wiki), więc myślę, że twój wynik jest bliższy 60.
Martin Ender
1
Przy odpowiednim kodowaniu jest to 1 bajt na znak. W końcu APL wyprzedza Unicode o dekady.
marinus
1
@marinus Fair point! Czy znasz jakieś (istniejące) kodowanie, w którym tak naprawdę by to działało?
Martin Ender
2
@ MartinBüttner: strona kodowa IBM 907 jest jedna, ale są obciążenia.
marinus
7

JavaScript (169) (140) (137) (135) (63) dla 17 cyfr pi

W mojej wersji Law's finei Law ' s finezwróć oba prawdziwe.

Najnowsza wersja (63) autorstwa Ingo Bürk i hsl

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

Nowa wersja (135) dla 17 cyfr pi (Dzięki 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
}

Stara wersja (169) dla 32 cyfr 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;
}
wada
źródło
Możesz zapisać 3 bajty za pomocą:1e15*Math.PI+"2384626433832795"
xem
Dzięki =) W międzyczasie zmieniłem go za pomocą tego pomysłu, ale teraz używam tylko pierwszych 17 cyfr.
flawr
@ IngoBürk Dziękuję bardzo, tylko sprawdzam, co działa.
flawr
Przepraszam, nieważne. To nie działa. : / forPętli nie można dodać w ten sposób.
Ingo Bürk,
Ale to, co działa, to inicjowanie, r=0a następnie zapętlanie r+=s[a].length!=p[a](możesz ;na końcu pominąć ). Następnie wróć !r.
Ingo Bürk
7

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

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

Wyjaśnienie

  • Dane wejściowe są traktowane jako argument dla lambda. Oczekuje String.
  • Pi jest obliczane do 999miejsc po przecinku i zamieniane na ciąg znaków po .usunięciu.
  • Znaki interpunkcyjne są usuwane z wiersza i są podzielone na pojedyncze słowa. "Let's"jest liczony jako dwa słowa: "Let"i "s".
  • Użyj, Array#mapaby przekonwertować każde słowo na jego rozmiar, połączyć je w plik String.
  • Za pomocą Regexp sprawdź, czy dwa utworzone Strings zaczynają się od tych samych znaków.

Złożyłem bonus za obsługę ponad 100 cyfr. _w tym rozwiązaniu nie jest traktowane jako interpunkcja.

Britishtea
źródło
Pamiętaj, że nie traktujesz _jako interpunkcji.
Martin Ender
Dobrze zauważony. Dla argumentu _ zawsze jest interpunkcja? Co ze zdaniami takimi jak My nickname on Stack Overflow is britishtea_500.
britishtea
To była tylko obserwacja. OP nie jest dokładnie określony w szczegółach tutaj.
Martin Ender
Słusznie. Na razie pozostawię odpowiedź, dopóki nie zostanie określona w problemie :)
britishtea
Używając bigdecimal nie masz limitu cyfr PI? Nicea (+1)
edc65
4

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

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

Prawie najdłuższe jak dotąd zgłoszenie, ale:

  • Działa dla dowolnej liczby cyfr Pi.
  • Usuwa wszystkie wymagane znaki ASCII i łamanie wiersza, bez dzielenia słów w tych miejscach.
  • Obsługuje poprawnie 0 cyfr w Pi (jako 10-literowe słowa)
Martin Ender
źródło
jeśli to działa na liczbę cyfr Pi, otrzymasz premię 0,8
Caridorc
1

Python - 130 127 116 - 17 cyfr liczby pi

Jak w odpowiedzi @flawr „s , Law ' s finea Law's finezarówno return true.

Dzięki @Emil za usunięcie 12 znaków z programu.

import re
f=lambda x:all(j==int("31415926535897932"[i])for i,j in enumerate([len(s)for s in re.findall("[\w]+",x)]))
monopole
źródło
Możesz zapisać 12 znaków, nie zapisując lw zmiennej i definiując funkcję za pomocą 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;}
Ypnypn
źródło
1

python 3, 17 cyfr pi, 104

import re;f=lambda s:all(map(int.__eq__, map(int, '31415926535897932'), map(len,re.findall('[\w]+',s))))
pgy
źródło
Możesz zastąpić ;nowym znakiem czytelności. Ponadto można usunąć wiele spacji.
tomsmeding
1

Python 3 - 129

Nie uwzględnia interpunkcji:

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(' '))))
Rozpad beta
źródło
0

T-SQL 488 383

A teraz duże rozwiązanie 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

Tworzy to wbudowaną funkcję cenioną w tabeli, która wykorzystuje rekurencyjne CTE do wykrywania granic słów.

Tworzy funkcję skalarną, która przeżuwa słowa i PI do 31 miejsc po przecinku (pierwsze 0). Nazywa się to w następujący sposób

SELECT dbo.f('SQL I golf, a large procedure is normal. Hefty not terse') --#True
MickyT
źródło
0

CJam, 40

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

Nie jest jasne, co należy rozumieć przez „każdy rodzaj interpunkcji”; to rozwiązanie usuwa ,.'"?!;;znaki.

Ypnypn
źródło
0

Narzędzia Bash i Unix, 111

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

NodeJS 32 cyfry 230 bajtów

Nie mogę tego skrócić z 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');
Wikunia
źródło
usuń białe znaki.
Rohan Jhunjhunwala