Piem validator programı


11

"İstediğiniz veya kullanıcı tarafından girilen herhangi bir şey" adlı bir dize değişkeninin bir piem olup olmadığını kontrol edebilen bir işlevi tanımlayan bir program yazın. (piem = uzunluk kelimesinin π rakamlarını temsil ettiği bir hikaye veya şiir ( Wikipedia'dan )

Bazı örnekler:

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

İşleme başlamadan önce her türlü noktalama işaretini veya yeni satırı silmelisiniz. Saf kod golf, en kısa kazanç

Bitiş tarihi: 1/10/2014 akşamı

Çeşitli cevaplar

  • Kaç basamak tutacağız? 10'dan fazla
  • İlgilenilen bir konu olarak, PI'daki 0'lar nasıl yorumlanmalıdır? Atlandı mı yoksa 10 harfli kelime mi? 10 harfli kelimeler
  • "piem adında bir değişken" - yani parametrenin adı piem olmalı? Hayır, soru metni düzeltilmedi
  • Eğlenceli bir bonus kendi başına bir çözüm olabilir . Çözümünüz bir düşmansa * 0,5 bonus kazanırsınız
  • Tartışma uğruna, _ her zaman noktalama işareti midir? Noktalama işareti mi yoksa noktalama mı olduğuna karar verebilirsiniz
  • "Her türlü noktalama işareti" ile kastedilen ne olduğu belli değil . ""?! ;; ()
  • Yani rakamlar sayılmalı mı? Ve Yasanın para cezası yanlış olur mu? Rakamlar harf olarak ele alınmalı, Yasanın cezası = Yanlış; Yasanın cezası = Doğru

Yorumlar

  • APL çözümü Bayt cinsinden sayılmalıdır
  • Eğer çözümünüz 100+ basamaklı pi için çalışıyorsa * 0,8 bonus kazanırsınız
  • Büyük ilgi nedeniyle, bitiş tarihi gelecekte bir gün daha.

6
Kaç basamak tutacağız?
marinus

5
"Değişken Piem sözde" - parametrenin adı böylece gerekir olmak piem? Bu, mevcut tüm cevapları yanlış yapar.
Ingo Bürk

2
Eğlenceli bir bonus, kendisinin bir parçası olan bir çözüm olabilir.
britishtea

5
İlgilenilen bir konu olarak, PI'daki 0'lar nasıl yorumlanmalıdır? Atlandı mı yoksa 10 harfli kelime mi?
MickyT

3
Çok önemli sorulara cevap vermemeniz utanç verici, ancak bir bitiş tarihinde zaten düzenlediniz.
Ingo Bürk

Yanıtlar:


3

APL (39)

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

APL tercümanının pi sabitinin sağladığı tüm rakamları 99'luk bir sınıra kadar kullanır. Benim durumumda (Dyalog APL 14 32-bit) 16 basamaklı. 64-bit sürümü muhtemelen daha fazla basamağa sahiptir. Bununla birlikte, verilen örneklerin çalışması için 16 basamak yeterlidir.

Bu miktardan fazla kelime içeren dizeler, kontrol edebileceği tüm rakamlar doğru olsa bile başarısız olacaktır . (Aynı şey bu yazıdan itibaren diğer gönderiler için de geçerlidir.) Örneğin, sadece 10 basamak olsaydı, 'Nasıl içki istiyorum' başarısız olur. Bu düzeltilebilir, ancak 14 karakter pahasına:

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

Bu sürüm , ilk N rakamının doğru olduğu tüm dizeleri kabul eder .


Kodunuz kısalar ama Unicode değil ... Kazanmayı hak edip etmediğinizi düşünmek zorundayım, javascript sürümü bundan biraz daha uzun ... Her neyse bu cevabı iptal ettim.
Caridorc

1
@marinus Soru, gönderimlerin karakter veya bayt tarafından mı puanlanacağını belirtmez, ancak varsayılan bayttır (wiki etiketine göre), bu yüzden puanınızın 60'a daha yakın olduğunu düşünüyorum.
Martin Ender

1
Doğru kodlama göz önüne alındığında, karakter başına 1 bayttır. APL on yıllardır Unicode'dan önce gelir.
marinus

1
@marinus Fuar noktası! Bunun gerçekten işe yarayacağı herhangi bir (mevcut) kodlama biliyor musunuz?
Martin Ender

2
@ MartinBüttner: IBM kod sayfası 907 bir, ancak yükler var.
marinus

7

JavaScript (169) (140) (137) (135) (63) 17 basamaklı pi için

Benim sürümünde Law's fineve Law ' s fineher ikisi de true döndürür.

En Yeni Sürüm (63) Ingo Bürk ve hsl

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

17 basamaklı pi için Yeni Sürüm (135) (Ingo Bürk sayesinde):

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

Pi sayısı 32 basamak için eski sürüm (169):

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

3 bayt ile şunları kaydedebilirsiniz:1e15*Math.PI+"2384626433832795"
xem

Thanks =) Bu arada ben bu fikri kullanarak değiştirdim ama şimdi sadece ilk 17 rakamı kullanarak.
flawr

@ IngoBürk Çok teşekkürler, sadece neyin işe yaradığını kontrol edin.
flawr

Üzgünüm boş ver. Bu işe yaramıyor gibi görünüyor. : / forDöngü bu şekilde eklenemez.
Ingo Bürk

Ama işe r=0yarayan şey başlıyor ve sonra sadece döngü yapıyor r+=s[a].length!=p[a]( ;sonunda atlayabilirsiniz ). Sonra geri dön !r.
Ingo Bürk

7

Yakut, 113 101 79 (98 x 0.8)

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

açıklama

  • Girdi bir lambda'ya argüman olarak alınır. Bekliyor a String.
  • Pi, 999ondalık sayılara kadar hesaplanır ve .kaldırılan dizeye dönüştürülür .
  • Noktalama işaretleri şiirden çıkarılır ve tek tek kelimelere bölünür. "Let's"iki kelime olarak sayılır: "Let"ve "s".
  • Array#mapHer kelimeyi kelimenin boyutuna dönüştürmek için kullanın , bunları bir ile birleştirin String.
  • Bir Regexp kullanarak, oluşturulan iki sunucunun Stringaynı karakterlerle başlayıp başlamadığını kontrol edin .

100'den fazla basamağı işleme bonusu uyguladım. _bu çözümde noktalama işareti olarak ele alınmaz.


Eğer tedavi etmediğiniz unutmayın _noktalama gibi.
Martin Ender

İyi gördüm. Tartışma uğruna, _ her zaman noktalama işareti mi? Peki ya cümleler gibi My nickname on Stack Overflow is britishtea_500.
britishtea

Bu sadece bir gözlemdi. OP buradaki detaylar hakkında tam olarak belli değil.
Martin Ender

Yeterince adil.
Sorunda

Bigdecimal kullanarak PI basamaklarında sınırınız yok mu? Nis (+1)
edc65

4

Mathematica, 123 bayt * 0.8 = 98.4

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

Şimdiye kadar neredeyse en uzun teslim, ancak:

  • Pi'nin herhangi bir rakamı için çalışır.
  • Bu yerlerdeki kelimeleri bölmeden gerekli tüm ASCII karakterlerini ve satır sonunu kaldırır.
  • Pi'deki 0 rakamları doğru şekilde işler (10 harfli kelimeler olarak)

Pi'nin basamak sayısı için işe yararsa 0,8 bonus kazanırsınız
Caridorc

1

Python - 130127 116 - pi 17 basamaklı

Olduğu gibi s' @flawr cevap , Law ' s fineveLaw's fine her iki dönüş doğrudur.

@Emil'e 12 karakteri programdan kaldırdığı için teşekkürler .

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

lBir değişkeni kaydetmeden ve lambda kullanarak işlevi tanımlayarak 12 karakter kaydedebilirsiniz .
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

piton 3, 17 basamak pi, 104

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

;Okunabilirlik için bunu yeni bir satırla değiştirebilirsiniz . Ayrıca, bir dizi boşluk kaldırılabilir.
tomsmeding

1

Python 3-129

Noktalama işaretlerini dikkate almaz:

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

Ve şimdi büyük bir T-SQL çözümü için :)

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

Bu, sözcük sınırlarını algılamak için özyinelemeli bir CTE kullanan satır içi tablo değerli bir işlev oluşturur.

Kelimeleri ve PI'yi 31 ondalık sayıya kadar çiğneyen bir skaler fonksiyon oluşturur (ilk 0). Aşağıdaki şekilde çağrılır

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

0

CJam, 40

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

"Her türlü noktalama işareti" ile ne kastedildiği belirsizdir; bu çözüm ,.'"?!;;karakterleri kaldırır .


0

Bash ve unix araçları, 111

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

0

NodeJS 32 basamak 230 Bayt

JS: D ile daha kısa bulamıyorum

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

boşluğu kaldır.
Rohan Jhunjhunwala
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.