Program validator piem

11

Tulis program yang mendefinisikan fungsi yang dapat memeriksa apakah variabel string yang disebut "apa pun yang Anda inginkan atau masukkan oleh pengguna" adalah piem. (piem = cerita atau puisi di mana panjang kata mewakili angka π ( dari Wikipedia ))

Beberapa contoh:

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

Anda harus menghapus tanda baca atau baris baru apa pun sebelum memproses. Golf kode murni, kemenangan terpendek

Tanggal akhir: malam hari 1/10/2014

Berbagai jawaban

  • Berapa banyak digit yang perlu kita tangani? Lebih dari 10
  • Yang menarik, bagaimana seharusnya 0's di PI ditafsirkan? Dilewati atau 10 kata kata? Seperti 10 huruf kata
  • "variabel yang disebut piem" - jadi nama parameter harus piem? Tidak, belum, teks pertanyaan diperbaiki
  • Bonus yang menyenangkan mungkin solusi yang merupakan piem itu sendiri. Jika solusi Anda adalah piem, Anda mendapat bonus * 0,5
  • Demi argumen, apakah _ selalu tanda baca? Anda dapat memutuskan apakah itu tanda baca atau tidak
  • Tidak jelas apa yang dimaksud dengan "tanda baca apa pun" Maksudku,. '"?! ;; ()
  • Jadi digit harus dihitung? Dan denda Law akan salah? Digit harus diperlakukan sebagai huruf, Law's fine = False; Law's fine = Benar

Komentar

  • Solusi APL harus dihitung dalam Bytes
  • Jika solusi Anda bekerja untuk 100+ pi, Anda mendapat bonus * 0,8
  • Karena minat besar tanggal akhir adalah satu hari lebih banyak di masa depan.
Caridorc
sumber
6
Berapa banyak digit yang perlu kita tangani?
marinus
5
"variabel yang disebut piem" - begitu nama parameter harus menjadi piem? Itu membuat semua jawaban saat ini salah.
Ingo Bürk
2
Bonus yang menyenangkan mungkin solusi yang merupakan piem itu sendiri.
britishtea
5
Yang menarik, bagaimana seharusnya 0's di PI ditafsirkan? Dilewati atau 10 kata kata?
MickyT
3
Sangat memalukan bahwa Anda tidak menjawab pertanyaan yang sangat penting, namun Anda sudah diedit pada tanggal akhir.
Ingo Bürk

Jawaban:

3

APL (39)

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

Ia menggunakan semua digit yang disediakan oleh pi penerjemah APL yang konstan, hingga batas 99. Dalam kasus saya (Dyalog APL 14 32-bit) yaitu 16 digit. Versi 64-bit kemungkinan memiliki lebih banyak digit. 16 digit sudah cukup untuk contoh yang diberikan untuk bekerja.

String yang memiliki jumlah kata lebih dari itu akan gagal , bahkan jika semua digit yang bisa diperiksa itu benar. (Hal yang sama berlaku untuk posting lain, pada tulisan ini.) Misalnya, jika hanya ada 10 digit, yang 'Bagaimana saya ingin minum' satu akan gagal. Ini dapat diperbaiki, tetapi dengan biaya 14 karakter:

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

Versi itu akan menerima string apa pun di mana digit N pertama benar.

marinus
sumber
Kode Anda adalah yang terpendek tetapi bukan Unicode ... Saya harus memikirkan apakah Anda pantas menang atau tidak, versi javascript hanya sedikit lebih lama dari ini ... Pokoknya saya memutakhirkan jawaban ini.
Caridorc
1
@marinus Pertanyaannya tidak menentukan apakah pengiriman harus dinilai berdasarkan karakter atau byte, tetapi defaultnya adalah byte (sesuai tag wiki), jadi saya pikir skor Anda lebih dekat ke 60.
Martin Ender
1
Diberikan pengkodean yang tepat, itu 1 byte per karakter. APL mendahului Unicode oleh dekade setelah semua.
marinus
1
@marinus Fair point! Apakah Anda tahu pengkodean tertentu (yang ada) di mana itu akan benar-benar berfungsi?
Martin Ender
2
@ MartinBüttner: IBM codepage 907 adalah satu, tetapi ada banyak.
marinus
7

JavaScript (169) (140) (137) (135) (63) untuk 17 digit pi

Dalam versi saya Law's finedan Law ' s finemengembalikan keduanya benar.

Versi terbaru (63) oleh Ingo Bürk dan hsl

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

Versi Baru (135) untuk 17 digit pi (Terima kasih kepada 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
}

Versi lama (169) untuk 32 digit 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;
}
cacat
sumber
Anda dapat menyimpan 3 byte dengan:1e15*Math.PI+"2384626433832795"
xem
Terima kasih =) Sementara itu saya mengubahnya menggunakan ide ini tetapi sekarang hanya menggunakan 17 digit pertama.
flawr
@ IngoBürk Terima kasih banyak, hanya memeriksa apa yang berhasil.
flawr
Maaf, sudahlah. Sepertinya itu tidak berhasil. : / forLoop tidak dapat ditambahkan dengan cara ini.
Ingo Bürk
Tetapi apa yang berhasil adalah menginisialisasi r=0dan kemudian hanya mengulang r+=s[a].length!=p[a](Anda dapat menghilangkan ;pada akhirnya). Lalu, kembali !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)*''}/)}

Penjelasan

  • Masukan diambil sebagai argumen ke lambda. Itu mengharapkan a String.
  • Pi dihitung hingga 999desimal dan berubah menjadi String dengan .dihapus.
  • Tanda baca dihapus dari puisi dan dibagi menjadi kata-kata individual. "Let's"dihitung sebagai dua kata: "Let"dan "s".
  • Gunakan Array#mapuntuk mengubah setiap kata menjadi ukuran kata, menggabungkannya menjadi a String.
  • Menggunakan Regexp, periksa apakah dua yang dibuat Stringdimulai dengan karakter yang sama.

Saya telah menerapkan bonus untuk menangani 100+ digit. _tidak ditangani sebagai tanda baca dalam solusi ini.

britishtea
sumber
Perhatikan bahwa Anda tidak memperlakukan _sebagai tanda baca.
Martin Ender
Terlihat dengan baik. Demi pertengkaran, apakah _ selalu tanda baca? Bagaimana dengan kalimat seperti My nickname on Stack Overflow is britishtea_500.
britishtea
Itu hanya pengamatan. OP tidak spesifik tentang detail di sini.
Martin Ender
Cukup adil. Saya akan meninggalkan jawaban untuk sekarang sampai ditentukan dalam masalah :)
britishtea
Menggunakan bigdecimal Anda tidak memiliki batasan pada digit PI? Bagus (+1)
edc65
4

Mathematica, 123 byte * 0.8 = 98.4

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

Hampir pengajuan terpanjang sejauh ini, tetapi:

  • Ini berfungsi untuk sejumlah digit Pi.
  • Ini menghapus semua karakter ASCII yang diperlukan dan jeda baris, tanpa membelah kata-kata di tempat-tempat itu.
  • Ini menangani 0-digit dalam Pi dengan benar (seperti kata 10 huruf)
Martin Ender
sumber
jika berfungsi untuk jumlah digit Pi Anda mendapatkan bonus 0,8
Caridorc
1

Python - 130 127 116 - 17 digit pi

Seperti pada jawaban @ flawr , Law ' s finedan Law's finekeduanya mengembalikan True.

Terima kasih kepada @Emil karena menghapus 12 karakter dari program.

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
sumber
Anda dapat menyimpan 12 karakter dengan tidak menyimpan ldalam variabel dan dengan mendefinisikan fungsi menggunakan lambda.
Emil
1

Jawa, 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
sumber
1

python 3, 17 digit pi, 104

import re;f=lambda s:all(map(int.__eq__, map(int, '31415926535897932'), map(len,re.findall('[\w]+',s))))
pgy
sumber
Anda dapat mengganti ;dengan baris baru agar mudah dibaca. Juga, sejumlah ruang dapat dihilangkan.
mulai
1

Python 3 - 129

Tidak memperhitungkan tanda baca:

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(' '))))
Peluruhan Beta
sumber
0

T-SQL 488 383

Dan sekarang untuk solusi T-SQL besar :)

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

Ini menciptakan fungsi bernilai tabel inline yang menggunakan CTE rekursif untuk mendeteksi batas kata.

Membuat fungsi skalar yang mengunyahnya melalui kata-kata dan PI hingga 31 desimal (0 pertama). Itu disebut dengan cara berikut

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

CJam, 40

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

Tidak jelas apa yang dimaksud dengan "tanda baca apa pun"; solusi ini menghilangkan ,.'"?!;;karakter.

Ypnypn
sumber
0

Alat bash dan unix, 111

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

NodeJS 32 digit 230 Bytes

Saya tidak bisa lebih pendek dengan 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
sumber
hapus spasi putih.
Rohan Jhunjhunwala