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.

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.


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

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.


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)

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

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

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

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

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

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.


0

Narzędzia Bash i Unix, 111

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

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

usuń białe znaki.
Rohan Jhunjhunwala
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.