Программа проверки 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

Вы должны удалить любые знаки препинания или перевода строки перед обработкой. Чистый код гольф, самые короткие победы

Дата окончания: вечер 10.01.2014

Различные ответы

  • Сколько цифр нам нужно обработать? Более 10
  • Интересно, как следует интерпретировать 0 в PI? Пропущено или 10 букв? Как 10 букв слова
  • «переменная с именем piem» - значит, имя параметра должно быть piem? Нет, текст вопроса исправлен
  • Веселым бонусом может быть решение, которое само по себе является пиамом. Если ваше решение является фишкой, вы получаете * 0.5 бонуса.
  • Ради аргумента, _ всегда ли пунктуация? Вы можете решить, если это пунктуация или нет
  • Непонятно, что подразумевается под "любой пунктуацией", которую я имею в виду. '"?! ;; ()
  • Значит цифры должны быть посчитаны? И закон Ло будет ложным? Цифры следует рассматривать как буквы, закон в порядке = False; Закон в порядке = True

Комментарии

  • Решение APL должно быть посчитано в байтах
  • Если ваше решение работает на 100+ цифр числа пи, вы получаете бонус * 0,8
  • Из-за большого интереса дата окончания - еще один день в будущем.
Caridorc
источник
6
Сколько цифр нам нужно обработать?
Маринус
5
«переменная с именем piem» - значит, имя параметра должно быть piem? Это делает все текущие ответы неправильными.
Инго Бюрк,
2
Забавный бонус может быть решением, которое само по себе является идеальным.
Британцы
5
Интересно, как следует интерпретировать 0 в PI? Пропущено или 10 букв?
MickyT
3
Обидно, что вы не отвечаете на очень важные вопросы, но вы уже отредактировали дату окончания.
Инго Бюрк

Ответы:

3

APL (39)

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

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

Строки, содержащие больше, чем количество слов, потерпят неудачу , даже если все цифры, которые он может проверить, были истинными. (То же самое относится и к другим сообщениям на момент написания этой статьи.) Например, если бы было только 10 цифр, то «Как я хочу выпить» не получилось бы. Это можно исправить, но за счет 14 символов:

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

Эта версия будет принимать любую строку, где правильные первые N цифр.

Мэринус
источник
Ваш код является кратким, но это не Unicode ... Я должен подумать, заслуживаете ли вы победы или нет, версия javascript немного длиннее этой ... В любом случае, я проголосовал за этот ответ.
Caridorc
1
@marinus Вопрос не указывает, должны ли заявки оцениваться по символам или байтам, но по умолчанию это байты (согласно тегу wiki), поэтому я думаю, что ваш счет ближе к 60.
Martin Ender
1
При правильной кодировке это 1 байт на символ. APL предшествует Unicode десятилетиями в конце концов.
Маринус
1
@marinus Честная точка зрения! Знаете ли вы какую-то конкретную (существующую) кодировку, в которой это будет работать?
Мартин Эндер
2
@ MartinBüttner: кодовая страница IBM 907 одна, но есть множество.
Маринус
7

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

По моей версии Law's fineи Law ' s fineверни оба правда.

Новейшая версия (63) от Ingo Bürk и 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;
}
flawr
источник
Вы можете сохранить 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.
  • Используя регулярное выражение, проверьте, если два созданных String начинаются символа с одинаковых символов.

Я применил бонус для обработки 100+ цифр. _не рассматривается как пунктуация в этом решении.

britishtea
источник
Обратите внимание, что вы не _относитесь к пунктуации.
Мартин Эндер
Хорошо подмечено. Ради аргумента, _ всегда ли пунктуация? Как насчет предложений, таких как My nickname on Stack Overflow is britishtea_500.
Британцы
Это было просто наблюдение. ОП здесь не совсем конкретен в деталях.
Мартин Эндер
Справедливо. Я оставлю ответ на данный момент, пока он не будет указан в задаче :)
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&;

Почти самая длинная подача на данный момент, но:

  • Работает на любое количество цифр числа Пи.
  • Он удаляет все необходимые символы ASCII и разрыв строки, не разбивая слова в этих местах.
  • Он правильно обрабатывает 0-значные числа в Пи (как 10-буквенные слова)
Мартин Эндер
источник
если он работает для числа цифр числа Пи, вы получаете бонус 0.8
Caridorc
1

Python - 130 127 116 - 17 цифр числа Пи

Как и в ответ @flawr «s , 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;}
Ypnypn
источник
1

питон 3, 17 цифр числа пи, 104

import re;f=lambda s:all(map(int.__eq__, map(int, '31415926535897932'), map(len,re.findall('[\w]+',s))))
PGY
источник
Вы можете заменить его ;на новую строку для удобства чтения. Кроме того, ряд пробелов может быть удален.
Томсминг
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
MickyT
источник
0

CJam, 40

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

Непонятно, что подразумевается под «любой пунктуацией»; это решение удаляет ,.'"?!;;символы.

Ypnypn
источник
0

Инструменты Bash и Unix, 111

f() { grep ^"$(echo "$@"|grep -Po '[\w]+'|xargs -n1 sh -c 'echo ${#0}'|xargs|tr -d ' ')"<<<31415926535897932; 
PGY
источник
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');
Wikunia
источник
удалить пробелы.
Рохан