Програма валідатора Piem


11

Напишіть програму, яка визначає функцію, яка може перевірити, чи є змінною рядка під назвою "все, що ви хочете або ввели користувачем", чи не пієм. (piem = історія чи поема, в якій довжини слова представляють цифри π ( з Вікіпедії ))

Деякі приклади:

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

Перед обробкою слід видалити будь-які розділові знаки або новий рядок. Чистий код гольфу, найкоротший виграш

Кінцева дата: вечір 1.10.2014

Різні відповіді

  • Скільки цифр нам потрібно обробити? Більше 10
  • Як цікаво, як слід інтерпретувати 0 в PI? Пропущено або 10 буквених слів? Як 10 букв слів
  • "змінна під назвою piem" - значить, ім'я параметра має бути piem? Ні, так, текст запитання виправлений
  • Забавним бонусом може стати рішення, яке саме по собі є пієм. Якщо ваше рішення - пієм, ви отримуєте * 0,5 бонуса
  • Заради аргументів, чи завжди _ пунктуація? Ви можете вирішити, чи це розділові знаки, чи ні
  • Незрозуміло, що мається на увазі під "будь-яким пунктуацією" я маю на увазі. '"?! ;; ()
  • Тож цифри слід рахувати? А штраф Закону був би помилковим? Цифри слід розглядати як літери, штраф Закону = Неправдивий; Закон штрафу = Правда

Коментарі

  • Рішення APL слід рахувати в байтах
  • Якщо ваше рішення працює на 100+ пі пі, ви отримуєте * 0,8 бонуса
  • Через великий інтерес кінцева дата - це ще день на майбутнє.

6
Скільки цифр нам потрібно обробити?
marinus

5
"змінна під назвою piem" - значить, ім'я параметра має бути piem? Це робить усі поточні відповіді невірними.
Інго Бюрк

2
Веселим бонусом може стати рішення, яке саме по собі є пієм.
britishtea

5
Як цікаво, як слід інтерпретувати 0 в PI? Пропущено або 10 буквених слів?
MickyT

3
Прикро, що ви не відповідаєте на дуже важливі питання, але ви вже відредагували кінцеву дату.
Інго Бюрк

Відповіді:


3

APL (39)

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

Він використовує всі цифри, що забезпечує константа pi інтерпретатора APL, до ліміту 99. У моєму випадку (Dyalog APL 14 32-розрядний), який становив 16 цифр. 64-бітова версія, ймовірно, має більше цифр. Але 16 цифр достатньо для роботи цих прикладів.

Рядки, що містять більше такої кількості слів, не зможуть , навіть якщо всі цифри, які він міг перевірити, були правдивими. (Те ж саме стосується інших публікацій, як у цій статті.) Наприклад, якби було лише 10 цифр, "Як я хочу випити", одна з них не зможе. Це можна виправити, але ціною 14 символів:

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

Ця версія прийме будь-який рядок, де перші N цифр є правильними.


Ваш код - це шорти, але це не Unicode ... Мені доведеться подумати, ви заслуговуєте на виграш чи ні, версія javascript трохи довша, ніж ця ... У будь-якому разі я підтримав цю відповідь.
Caridorc

1
@marinus Питання не визначає, чи слід подавати оцінки символами чи байтами, але за замовчуванням - байти (відповідно до тегів wiki), тому я думаю, що ваш бал ближче до 60.
Мартін Ендер,

1
Враховуючи правильне кодування, це 1 байт на символ. APL передує Unicode десятиліттями.
marinus

1
@marinus Справедливий бал! Чи знаєте ви якесь конкретне (існуюче) кодування, в якому воно б насправді працювало?
Мартін Ендер

2
@ MartinBüttner: IBM кодова сторінка 907 - це одна, але є навантаження.
marinus

7

JavaScript (169) (140) (137) (135) (63) для 17 цифр пі

У моїй версії Law's fineі Law ' s fineповерніть обидва вірні.

Найновіша версія (63) Інго Бюрк та hsl

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

Нова версія (135) на 17 цифр пі (спасибі Інго Бюрк):

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

Стара версія (169) для 32 цифр пі:

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 байти за допомогою:1e15*Math.PI+"2384626433832795"
xem

Дякую =) Тим часом я змінив його, використовуючи цю ідею, але тепер використовуючи лише перші 17 цифр.
flawr

@ IngoBürk Дякую дуже, просто перевірив, що працює.
flawr

Вибачте, неважливо. Це, здається, не працює. : / forЦикл не можна додати таким чином.
Інго Бюрк

Але те, що працює, є ініціалізацією, r=0а потім просто циклічним завершенням r+=s[a].length!=p[a](ви можете опустити ;це наприкінці). Потім поверніться !r.
Інго Бюрк

7

Рубі, 113 101 79 (98 * 0,8)

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

Пояснення

  • Введення береться за аргумент лямбда. Він очікує String.
  • Пі обчислюється до 999десяткових знаків і перетворюється на рядок із .вилученим.
  • Знаки пунктуації видаляються з поеми і вона розбивається на окремі слова. "Let's"обчислюється як два слова: "Let"і "s".
  • Використовуйте Array#mapдля перетворення кожного слова у розмір слова, об'єднайте їх у String.
  • Використовуючи Regexp, перевірте, чи Stringпочинаються два створені s однакових символів.

Я застосував бонус за обробку 100+ цифр. _не розглядається як розділові знаки в цьому рішенні.


Зауважте, що ви не трактуєтесь _як розділові знаки.
Мартін Ендер

Добре помічений. Заради аргументів, чи _ завжди розділові знаки? Як щодо таких речень, як My nickname on Stack Overflow is britishtea_500.
britishtea

Це було лише спостереження. ОП не зовсім конкретна щодо деталей тут.
Мартін Ендер

Досить справедливо. Я покину відповідь, поки не буде вказано в проблемі :)
britishtea

Використовуючи bigdecimal, у вас немає обмежень на PI цифри? Ніцца (+1)
edc65

4

Mathematica, 123 байти * 0,8 = 98,4

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

Майже найдовше подання досі, але:

  • Він працює для будь-якої кількості цифр Pi.
  • Він видаляє всі необхідні символи ASCII та розрив рядка, не розбиваючи слова в цих місцях.
  • Він обробляє 0-цифру в Pi правильно (як 10-літерні слова)

якщо це працює на кількість цифр Пі, ви отримуєте бонус 0,8
Caridorc

1

Пітон - 130 127 116 - 17 цифр пі

Як у відповіді @flawr , Law ' s fineі Law's fineобидва повертають True.

Завдяки @Emil за видалення 12 символів з програми.

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

Ви можете зберегти 12 символів, не зберігаючи lзмінну та визначивши функцію за допомогою лямбда.
Еміль

1

Ява, 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

пітон 3, 17 цифр пі, 104

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

Ви можете замінити ;нову лінію для читабельності. Також ряд пробілів можна видалити.
tomsmeding

1

Пітон 3 - 129

Знаки пунктуації не враховуються:

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

А тепер про велике рішення 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

Це створює функцію оцінювання вбудованої таблиці, яка використовує рекурсивний CTE для виявлення меж слова.

Створює скалярну функцію, яка пережовує шлях через слова та PI до 31 десяткових знаків (перший 0). Його називають наступним чином

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

0

CJam, 40

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

Незрозуміло, що розуміється під "будь-яким видом пунктуації"; це рішення видаляє ,.'"?!;;символів.


0

Інструменти Bash і unix, 111

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

0

NodeJS 32 цифри 230 байт

Я не можу скоротити його з 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');

видалити пробіли.
Rohan Jhunjhunwala
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.