Эта задача немного сложна, но довольно проста, учитывая строку s
:
meta.codegolf.stackexchange.com
Используйте положение символа в строке в качестве x
координаты и значение ascii в качестве y
координаты. Для приведенной выше строки результирующий набор координат будет иметь вид:
0, 109
1, 101
2, 116
3, 97
4, 46
5, 99
6, 111
7, 100
8, 101
9, 103
10,111
11,108
12,102
13,46
14,115
15,116
16,97
17,99
18,107
19,101
20,120
21,99
22,104
23,97
24,110
25,103
26,101
27,46
28,99
29,111
30,109
Затем вы должны рассчитать наклон и y-пересечение набора, который вы собрали, используя линейную регрессию , вот график, приведенный выше:
В результате получается линия наилучшего соответствия (с 0 индексами):
y = 0.014516129032258x + 99.266129032258
Вот 1-индексированная линия наилучшего соответствия:
y = 0.014516129032258x + 99.251612903226
Итак, ваша программа вернется:
f("meta.codegolf.stackexchange.com") = [0.014516129032258, 99.266129032258]
Или (любой другой разумный формат):
f("meta.codegolf.stackexchange.com") = "0.014516129032258x + 99.266129032258"
Или (любой другой разумный формат):
f("meta.codegolf.stackexchange.com") = "0.014516129032258\n99.266129032258"
Или (любой другой разумный формат):
f("meta.codegolf.stackexchange.com") = "0.014516129032258 99.266129032258"
Просто объясните, почему он возвращается в таком формате, если это не очевидно.
Некоторые уточняющие правила:
- Strings are 0-indexed or 1 indexed both are acceptable.
- Output may be on new lines, as a tuple, as an array or any other format.
- Precision of the output is arbitrary but should be enough to verify validity (min 5).
Это код-гольф с наименьшим количеством байтов.
0.014516129032258x + 99.266129032258
?Ответы:
MATL , 8 байт
Используется индексирование строк на основе 1.
Попробуйте онлайн!
объяснение
источник
Октава,
29262420 байтПопробуйте онлайн!
У нас есть модель
Вот
y
значение ASCII строкиs
Чтобы найти параметры пересечения и наклона, мы можем сформировать следующее уравнение:
так
!!s
преобразует строку в вектор из той же длины, что и строка.Вектор единиц используется для оценки перехвата.
1:nnz(s)
диапазон значений от 1 до количества элементов строки, используемой какx
.Предыдущий ответ
Для теста вставьте следующий код в Octave Online
Функция, которая принимает строку в качестве входных данных и применяет обычную оценку модели методом наименьших квадратов
y = x*b + e
Первый аргумент ols заключается в
y
том, что для него мы транспонируем строкуs
и добавляем с номером 0, чтобы получить ее код ASCII.источник
/
, отличная идея!TI-Basic, 51 (+ 141) байт
Строки основаны на 1 в TI-Basic.
Как и в другом примере, здесь выводится уравнение линии наилучшего соответствия в терминах X. Кроме того, в Str2 вам нужно иметь эту строку, которая составляет 141 байт в TI-Basic:
Причина, по которой это не может быть частью программы, заключается в том, что два символа в TI-Basic не могут быть автоматически добавлены в строку. Одним из них является
STO->
стрелка, но это не проблема, потому что она не является частью ASCII. Другой является строковый литерал ("
), который может быть преобразован в строку только путем ввода вY=
уравнение и использованияEqu>String(
.источник
"
, запросив его также в качестве пользовательского ввода в программе, что вам здесь не поможет, но я просто хотел указать на этот факт. 2, я не узнаю некоторые из этих символов как существующие на калькуляторе. Я могу ошибаться, но, например, где вы берете@
и~
? Так же как#
,$
и&
.R,
4645 байтЧитает входные данные из стандартного ввода и возвращает для данного тестового примера (с одним индексом):
источник
lm(utf8ToInt(y<-scan(,""))~1:nchar(y))$co
x
переменная должна быть предварительно определена дляlm
работы.s
такx=1:nchar(s);lm(charToRaw(s)~x)$co
экономит несколько байтов. Я также не знаю$co
, технически ли это необходимо, поскольку вы все еще получаете коэффициент перехвата + без негоPython,
8280 байт-2 байта благодаря @Mego
Использование
scipy
:источник
f=
.numpy.linalg.lstsq
очевидно, отличается по аргументамscipy.stats.linregress
и является более сложным.Mathematica, 31 байт
Безымянная функция, принимающая строку в качестве входных данных и возвращающая фактическое уравнение рассматриваемой линии наилучшего соответствия. Например,
f=Fit[ToCharacterCode@#,{1,x},x]&; f["meta.codegolf.stackexchange.com"]
возвращает99.2516 + 0.0145161 x
.ToCharacterCode
преобразует строку ASCII в список соответствующих значений ASCII; действительно, по умолчанию используется UTF-8 в более общем смысле. (Довольно печально, в этом контексте, что одно имя функции составляет более 48% длины кода ....) ИFit[...,{1,x},x]
является встроенным для вычисления линейной регрессии.источник
Node.js, 84 байта
Использование
regression
:демонстрация
источник
Sage, 76 байт
Вряд ли игра в гольф, возможно, дольше, чем ответ от Python, но да ...
источник
J 11 байт
При этом используется индексация по одному.
Попробуйте онлайн!
объяснение
источник
JavaScript,
151148 байтБолее читабельно:
Показать фрагмент кода
источник
0
из негоc.charCodeAt(0)
, и еще 2 байта, переместив группуk=...
запятых и поместив ее непосредственно в первый индекс возвращаемого массива, как[k=...,(d-k*b)/a]
Javascript (ES6), 112 байт
источник
Haskell,
154142 байтаЭто слишком долго для моих предпочтений из-за импорта и длинных имен функций, но хорошо. Я не мог придумать ни одного другого метода игры в гольф, хотя я не эксперт в области импорта гольфа.
Удалил 12 байтов, заменив
ord
и импортировав их изData.Char
fromEnum благодаря nimi.источник
ord
сfromEnum
и избавитьсяimport Data.Char
.Язык макросов SAS, 180 байт
Использует индексирование на основе 1. Решение становится довольно многословным, когда на выходе получаются только наклон и перехват.
источник
Clojure, 160 байт
Нет встроенных модулей, используется итерационный алгоритм, описанный в статье Perceptron . Может не сойтись на других входах, в этом случае снизить скорость обучения
2e-4
и, возможно, увеличить количество итераций1e5
. Не уверен, что не итерационный алгоритм был бы короче для реализации.Пример:
источник
Клен, 65 байт
Использование:
Возвращает:
Примечания. При этом используется команда Fit для подгонки полинома формы a * x + b к данным. Значения ASCII для строки находятся путем преобразования в байты.
источник