Рассмотрим строку длиной N, например, Peanut Butter
с N = 13. Обратите внимание, что в строке есть N-1 пар соседних символов. Ибо Peanut Butter
первая из 12 пар есть Pe
, вторая - ea
последняя er
.
Когда пары в основном разные символы, строка имеет короткое качество, например chUnky
.
Когда эти пары в основном одинаковые символы, строка имеет плавное качество, например sssmmsss
.
Определите размер строки как отношение количества пар с двумя разными символами к общему количеству пар (N-1).
Определите гладкость строки как отношение количества пар с двумя одинаковыми символами к общему количеству пар (N-1).
Например, Peanut Butter
имеет только одну пару с одинаковыми символами ( tt
), поэтому его гладкость равна 1/12 или 0,0833, а его толщина равна 11/12 или 0,9167.
Пустые строки и строки только с одним символом определены как 100% гладкие и 0% короткие.
Вызов
Напишите программу, которая принимает строку произвольной длины и выводит либо ее размерность, либо коэффициент гладкости в качестве значения с плавающей запятой.
- Возьмите ввод через стандартный ввод или командную строку, или вы можете написать функцию, которая принимает строку.
- Можно предположить, что входная строка содержит только печатаемые символы ASCII (и, следовательно, является однострочной).
- Выведите число с плавающей запятой на стандартный вывод в 4 или более десятичных разрядах, или вы можете вернуть его, если написали функцию. Десятичные знаки, не содержащие никакой информации, не требуются, например,
0
вместо0.0000
. - Выберите размер или гладкость, как вы предпочитаете. Только не забудьте сказать, какая из ваших программ выводит.
Самый короткий код в байтах побеждает.
Примеры
Peanut Butter
→ Chunkiness: 0.91666666666
Гладкость: 0.08333333333
chUnky
→ Chunkiness: 1.0
Гладкость: 0.0
sssmmsss
→ Chunkiness: 0.28571428571
Гладкость: 0.71428571428
999
→ Chunkiness: 0.0
Гладкость: 1.0
AA
→ Chunkiness: 0.0
Гладкость: 1.0
Aa
→ Chunkiness: 1.0
Гладкость: 0.0
!
→ Chunkiness: 0.0
Гладкость: 1.0
[пустая строка] → Chunkiness: 0.0
, Гладкость:1.0
Бонусный вопрос: что вы предпочитаете , короткие или гладкие струны ?
источник
Ответы:
APL, 10 байт
Это читает входные данные из стандартного ввода и печатает блок в стандартный вывод. Алгоритм тот же, что и для решения J.
источник
CJam, 19 байтов
100% объемный исходный код, который вычисляет размерность .
Попробуйте это короткое совершенство онлайн.
Как это работает
Очевидно, что NaN, округленное до 4 десятичных знаков, равно 0.
источник
2ew
подход, который я пробовал. Особые случаи письма 0/1 убивали меня._
переехал. Не уверен, если это имеет значение.Pyth,
1312 байтПолностью коренастый код, вычисляющий размер.
Демонстрация. Тестовый жгут.
источник
z
вызывает ошибку на пустом входе онлайн. Я пойду и исправлю эту ошибку. Этот код в порядке, однако.TI-BASIC, 46 байтов
sub(x1,x2,x3
выдает подстроку строки,x1
начинающуюся (с единицы) по номеруx2
и заканчивающуюся номеромx3
, затемseq(
строит последовательность.Дает значение гладкости. По умолчанию это
Ans
переменная0
, поэтому нам не нужен операторElse
toIf
или что-то сохранятьAns
заранее.источник
Matlab (
3736 байт)Это можно сделать с помощью следующей анонимной функции, которая возвращает размер:
Комментарии:
В старых версиях Matlab (таких как R2010b) вам нужно
+
привести массив charx
к двойному массиву:Но это не так в последних версиях (протестировано в R2014b), который экономит один байт. Спасибо Джонасу за его комментарий.
max
обрабатывает односимвольные и нулевые символы (для краткости)Пример:
источник
diff('abc')
предупреждение не выдаст.> <> ,
4036 байтЭта программа возвращает кусок строки.
объяснение
Предыдущее представление (37 + 3 = 40 байт)
Эта программа возвращает гладкость строки. Ввод осуществляется с помощью
-s
флага, напримеристочник
C #,
9489 байтСаб 100 байтов, так что, думаю, это какая-то форма победы сама по себе?
Это определение функции (разрешено согласно спецификации), которое возвращает гладкость входной строки:
Довольно просто: если длина равна 0 или 1, возвращается 1, в противном случае она сравнивает строку с собой без первого символа, а затем возвращает количество идентичных пар, деленное на количество пар.
Изменить - заменить Подстроку на Пропустить. Ошибка новичка!
источник
J,
1413 байтВычисляет размер. Престижность J для определения
0 % 0
быть равным 0.Попробуйте онлайн
Вот объяснение:
источник
(]+/%#)2~:/\]
сохраняет 1 байт.CJam, 23 байта
Объяснение:
Это выводит коэффициент гладкости.
источник
CJam, 16 байтов
Обманочный исходный код, который вычисляет гладкость .
Для входов длины 0 или 1, это печатает правильный результат перед выходом с ошибкой. С интерпретатором Java вывод ошибок идет в STDERR ( как и должно быть ).
Если вы попробуете код онлайн , просто проигнорируйте все, кроме последней строки вывода.
Как это работает
источник
Юлия, 52 байта
Плавность!
Это создает безымянную функцию, которая принимает строку и возвращает числовое значение.
Если длина ввода меньше 2, гладкость равна 1, в противном случае мы вычисляем пропорцию идентичных соседних символов, беря среднее значение из массива логических элементов.
источник
Ним
1059691 байтПытаюсь выучить Нима. Это вычисляет размер строки.
(
Если я попытаюсь прочитать это как Python, отступ будет выглядеть испорченным ...Теперь это больше похоже на Ruby ...)источник
Python 3, 63 байта
Это анонимная лямбда-функция, которая принимает строку в качестве аргумента и возвращает ее размер.
Чтобы использовать его, дайте ему имя и назовите его.
источник
def f(n):
который имеет ровно столько же символов, что иlambda n:
. Это устраняет необходимость называть вашу функцию.def f(n):
также нужноreturn
Python 3, 52 байта
Это вычисляет размер и выводит
-0.0
пустую строку. Если вам не нравятся отрицательные нули, вы всегда можете исправить это с помощью дополнительного байта:источник
Haskell, 64 байта
Гладкость выходов. например
f "Peanut Butter"
->8.333333333333333e-2
.Как это работает:
sum(x>>[1])
это длина x, но поскольку система строгих типов в Haskell требует фракционной дроби/
, я не могу использовать,length
которая возвращает целые числа. Преобразование целых чисел в дробные с помощьюfromInteger$length x
слишком долго.источник
import Data.Ratio
слишком дорого.JavaScript (ES6), 55 байт
Гладкость, 56 байт
Размерность 55 байт
демонстрация
Рассчитывает плавность, так как это то, что я предпочитаю. Пока работает только в Firefox, так как это ES6.
источник
КДБ (Q), 30
Возвращает гладкость.
объяснение
Тест
источник
Рубин ,
6966 байтПопробуйте онлайн!
Побрит из нескольких байтов с комментариями от IMP. Кроме того , с предстоящей версии 2.7.0 Руби , что можно сэкономить несколько байт, заменив
|x,y|x!=y
с@1!=@2
источник
.to_f/~-s.size
в присвоение c, то вы можете сбрить байт с помощью троичной операции:f=->s{(c=s.chars.each_cons(2).count{|x,y|x!=y}.to_f/~-s.size)>0?c:0}
f=
? Я не на 100% об этих правилах. Задача гласит, что вы можете вернуть функцию, которая принимает строку, которая является лямбда-указателем.Python 3, 69 байт
Никто еще не опубликовал решение Python, так что вот довольно простая реализация функции «chunkiness». Он закорачивает строку длины
1
и печатает0
(что является целым числом, а не числом с плавающей точкой, но, кажется, разрешено в соответствии с правилами).В пустой строке выводится
-0.0
вместо0.0
. Можно утверждать, что это можно считать приемлемым, как-0.0 == 0 == 0.0
возвратTrue
.Примеры:
(Python 3 используется по умолчанию для деления чисел с плавающей точкой.)
источник
C 83 байта
Функция, возвращающая размер .
объяснение
Примите строку C и верните число с плавающей запятой (двойной будет работать, но больше символов).
Счетчики -
a
для всех пар,b
для несоответствующих пар. Использованиеint
ограничивает «произвольную длину» строки, но это лишь незначительное нарушение требований, и я не собираюсь это исправлять.Особый случай пустой строки - оставьте оба счетчика равными нулю.
Непустая строка - итерация по ней с предварительным приращением (поэтому первый раз в цикле
s[a]
будет второй символ. Если строка имеет только один символ, тело цикла не будет введено иa
будет равно 1.Если текущий символ отличается от предыдущего, увеличивается
b
.После цикла есть три возможности: «a == 0, b == 0» для пустого ввода, «a == 1, b == 0» для односимвольного ввода или «a> 1, b> = 0 'для многосимвольного ввода. Мы вычитаем 1 из
a
(?
оператор является точкой последовательности, поэтому мы в безопасности), и если она равна нулю, у нас есть второй случай, поэтому мы должны вернуть ноль. В противном случаеb/a
это то , что мы хотим, ноb
сначала мы должны перейти к типу с плавающей точкой, иначе мы получим целочисленное деление. Для пустой строки мы получим отрицательный ноль, но правила этого не запрещают.тесты:
Который дает:
как требуется.
источник
a,b;float f(char*s){if(*s)for(a=b=0;s[++a];)b+=s[a]!=s[a-1];return--a?1.*b/a:b;}
Perl, 69
Функция, возвращающая гладкость :
объяснение
тесты
источник
Mathematica,
7372 байтаЭто ничего не выигрывает по размеру, но это просто:
ровность
источник
Length[#]
->Length@#
сохраняет удар. Так же как устранениеN@
и изменение1
на1.
GeL:
7673 символаПлавность.
Образец прогона:
(GeL = Gema + Lua bindings. Намного лучше, но все еще далеко от победы.)
Гема:
123120 символовПлавность.
Образец прогона:
(Для меня это было больше упражнение, чтобы увидеть, каковы шансы решить его на языке без поддержки чисел с плавающей запятой и, как правило, болезненной арифметической поддержки. 2-я строка, особенно
\P
последовательность, - чистая магия, последняя строка - настоящая пытка.)источник
Java 8,
8482 байтаГладкость выходов.
Попробуйте онлайн.
Объяснение:
источник
Кокос , 38 байт
Попробуйте онлайн!
Порт Python 3 будет 50 байтов .
источник
PowerShell, 55 байт
ровность
Кажется немного глупым получить переменную в stdin и затем дать ей идентификатор, но это быстрее, чем иметь функцию.
источник
Python 3, 61 байт
рассчитать краткость:
источник
К (22)
улучшено решение Q от WooiKent:
источник
Рубин, 63 байта
Выводит краткость.
f=->s{s.chars.each_cons(2).count{|x,y|x!=y}/[s.size-1.0,1].max}
Аналогично решению @ daniero, но немного укорочено путем прямого деления на длину строки - 1 и последующего полагания на .count равным нулю со строками длины 0 и 1 (.max гарантирует, что я не буду делить на 0 или -1).
источник
Mathematica, 107 байт
Вычисляет размерность, беря половину расстояния Левенштейна между каждым орграфом и его оборотом.
Если вы предпочитаете точный рациональный ответ, удалите
.5
и поместите/2
перед последним&
без штрафа. Сама программа имеет размер 103/106 или около 0,972.источник