การถดถอยเชิงเส้นบนสตริง


25

ความท้าทายนี้เป็นเรื่องยากเล็กน้อย แต่ค่อนข้างง่ายให้สตริง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).

นี่คือการชนะการนับไบต์ต่ำสุดของ


3
คุณมีลิงค์ / สูตรใด ๆ ในการคำนวณความชันและจุดตัดแกน y หรือไม่?
ร็อด

16
เรียนผู้มีสิทธิ์ลงคะแนนที่ไม่ชัดเจน: ในขณะที่ฉันเห็นด้วยว่าการมีสูตรเป็นสิ่งที่ดี แต่ก็ไม่จำเป็น การถดถอยเชิงเส้นเป็นสิ่งที่กำหนดไว้อย่างดีในโลกคณิตศาสตร์และ OP อาจต้องการออกจากการหาสมการที่ผู้อ่าน
Nathan Merrill


2
มันจะโอเคที่จะส่งกลับสมการที่แท้จริงของเส้นที่ดีที่สุดเช่น0.014516129032258x + 99.266129032258?
เกร็กมาร์ติ

2
ชื่อของความท้าทายนี้ทำให้เพลงที่ยอดเยี่ยมนี้อยู่ในหัวของฉันตลอดทั้งวัน
หลุยส์เมนโดะ

คำตอบ:


2

MATL , 8 ไบต์

n:G3$1ZQ

ใช้การจัดทำดัชนีสตริงแบบ 1

ลองออนไลน์!

คำอธิบาย

n:     % Input string implicitly. Push [1 2 ... n] where n is string length.
       % These are the x values
G      % Push the input string. A string is an array of chars, which is
       % equivalent to an array of ASCII codes. These are the y values
3$     % The next function will use 3 inputs
1      % Push 1
ZQ     % Fit polynomial of degree 1 to those x, y data. The result is an
       % array with the polynomial coefficients. Implicitly display

7

Octave, 29 26 24 20 bytes

@(s)s/[!!s;1:nnz(s)]

ลองออนไลน์!

เรามีรูปแบบ

y= intercept *x^0 + slope * x
 = intercept * 1  + slope * x

นี่yคือค่า ASCII ของสตริงs

ในการหาพารามิเตอร์สกัดกั้นและความชันเราสามารถสร้างสมการต่อไปนี้:

s = [intercept slope] * [1 X]

ดังนั้น

[intercept slope] = s/[1 x]

!!sแปลงสตริงเป็นเวกเตอร์ของสตริงที่มีความยาวเท่ากับสตริง
เวกเตอร์ของวัตถุนั้นใช้สำหรับการประมาณค่าจุดตัด
1:nnz(s)เป็นช่วงของค่าตั้งแต่ 1 xถึงจำนวนขององค์ประกอบของสตริงใช้เป็น

คำตอบก่อนหน้า

@(s)ols(s'+0,[!!s;1:nnz(s)]')

สำหรับการทดสอบวางรหัสต่อไปนี้ลงในคู่ออนไลน์

(@(s)ols(s'+0,[!!s;1:nnz(s)]'))('meta.codegolf.stackexchange.com')

ฟังก์ชันที่ยอมรับสตริงเป็นอินพุตและใช้การประมาณกำลังสองน้อยสุดสามัญของโมเดล y = x*b + e

อาร์กิวเมนต์แรกของ ols คือyว่าเราจะแปลงสตริงsและเพิ่มด้วยหมายเลข 0 เพื่อรับรหัส ASCII


/, ความคิดที่ดี!
Luis Mendo

6

TI-Basic, 51 (+ 141) ไบต์

เงื่อนไขเป็นพื้นฐานใน TI-Basic

Input Str1
seq(I,I,1,length(Str1->L1
32+seq(inString(Str2,sub(Str1,I,1)),I,1,length(Str1->L2
LinReg(ax+b)

เช่นเดียวกับตัวอย่างอื่นผลลัพธ์นี้เป็นสมการของเส้นที่ดีที่สุดในแง่ของ X นอกจากนี้ใน Str2 คุณต้องมีสตริงนี้ซึ่งเป็น 141 ไบต์ใน TI-Basic:

! "# $% & '() * +, - / 0123456789:;. <=> @ ABCDEFGHIJKLMNOPQRSTUVWXYZ [] ^ _abcdefghijklmnopqrstuvwxyz{|}~

เหตุผลนี้ไม่สามารถเป็นส่วนหนึ่งของโปรแกรมได้เนื่องจากไม่สามารถเพิ่มสองอักขระใน TI-Basic ให้กับสตริงโดยอัตโนมัติ หนึ่งคือSTO->ลูกศร แต่นี่ไม่ใช่ปัญหาเนื่องจากไม่ใช่ส่วนหนึ่งของ ASCII อื่น ๆ ที่เป็นตัวอักษรสตริง ( ") ซึ่งสามารถ stringified โดยเฉพาะการพิมพ์ลงในสมการและการใช้Y=Equ>String(


ฉันสงสัยอย่างจริงจังว่าใครจะคิดคำนวณเก่าของพวกเขาสำหรับเรื่องนี้ :) ฉันมี TI-83 เก่าของฉันอยู่ในใจเมื่อฉันคิดสิ่งนี้
Magic Octopus Urn

@carusocomputing เฮ้ดี! ฉันชอบภาษาการเขียนโปรแกรม TI-Basic มากและฉันใช้มันในการเขียนโค้ดกอล์ฟของฉัน ถ้ารองรับเฉพาะ ASCII ...
Timtech

สองความคิดเห็น: 1, คุณสามารถทำให้เป็นสตริงได้"โดยการกระตุ้นให้มันป้อนข้อมูลผู้ใช้ในโปรแกรมเช่นกันซึ่งไม่ได้ช่วยคุณที่นี่ แต่ฉันแค่อยากจะชี้ให้เห็นข้อเท็จจริงนั้น 2 ฉันไม่รู้จักอักขระบางตัวที่มีอยู่ในเครื่องคิดเลข ฉันอาจจะผิด แต่ตัวอย่างเช่นคุณจะได้รับ@และ~ที่ไหน เช่นเดียวกับ#, และ$ &
Patrick Roberts

ขอบคุณสำหรับความคิดเห็น @PatrickRoberts นั่นเป็นโทเค็นสองไบต์เริ่มต้นด้วย 0xBB ดูในคอลัมน์ D ของtibasicdev.wikidot.com/miscellaneous-tokens
Timtech

6

R, 46 45 ไบต์

x=1:nchar(y<-scan(,""));lm(utf8ToInt(y)~x)$co

อ่านอินพุตจาก stdin และสำหรับกรณีทดสอบที่ส่งคืน (หนึ่งดัชนี):

(Intercept)           x 
99.25161290  0.01451613 

สั้นลงเล็กน้อย (แต่ยังไม่ได้ทดสอบอาจมีปัญหาการประเมินบางอย่างในการแยกวิเคราะห์สูตร):lm(utf8ToInt(y<-scan(,""))~1:nchar(y))$co
rturnbull

@rtbull ฉันลองมันในตอนแรก แต่ดูเหมือนว่าxตัวแปรจะต้องมีการกำหนดไว้ล่วงหน้าสำหรับlmการทำงาน
Billywob

@rtbull ฉันได้รับความยาวแตกต่างกันข้อผิดพลาดที่ เราจะได้รับsเพื่อx=1:nchar(s);lm(charToRaw(s)~x)$coช่วยประหยัดไบต์ ฉันยังไม่รู้ด้วยซ้ำว่า$coเป็นสิ่งจำเป็นทางเทคนิคหรือเปล่าหากคุณยังคงมีการสกัดกั้น + สัมประสิทธิ์โดยไม่ต้องใช้มัน
Chris

@Chris ค่อนข้างแน่ใจว่าไม่ใช่คำตอบที่ทำงานได้ ควรมีอินพุตจาก stdin หรือเป็นอาร์กิวเมนต์ของฟังก์ชัน
Billywob

ยุติธรรมพอเพียงอ่านคำถามของฉัน - มันให้การเปรียบเทียบที่เป็นธรรมมากขึ้นกับคำตอบของหลาม + อ็อกเทฟเช่นกัน
Chris

5

Python, 82 80 ไบต์

-2 ไบต์ต้องขอบคุณ @Mego

การใช้scipy:

import scipy
lambda s:scipy.stats.linregress(range(len(s)),list(map(ord,s)))[:2]

lambdas f=ไม่มีชื่อจะได้รับอนุญาตเพื่อให้คุณสามารถวาง
Mego

@DigitalTrauma numpy.linalg.lstsqเห็นได้ชัดว่าแตกต่างในการโต้แย้งscipy.stats.linregressและมีความซับซ้อน
dfernan

4

Mathematica, 31 ไบต์

Fit[ToCharacterCode@#,{1,x},x]&

ฟังก์ชั่นที่ไม่ได้ตั้งชื่อใช้สตริงเป็นอินพุตและส่งกลับสมการที่แท้จริงของบรรทัดที่ดีที่สุดที่เป็นปัญหา ตัวอย่างเช่นผลตอบแทน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]เป็นในตัวสำหรับการคำนวณการถดถอยเชิงเส้น


1
ขอบคุณสำหรับตัวอย่างของบรรทัดที่มีการจัดทำดัชนี 1 ไม่จำเป็นต้องคำนวณเพราะคุณฮ่าฮ่า
Magic Octopus Urn

4

Node.js, 84 ไบต์

การใช้regression:

s=>require('regression')('linear',s.split``.map((c,i)=>[i,c.charCodeAt()])).equation

การสาธิต

// polyfill, since this is clearly not Node.js
function require(module) {
  return window[module];
}
// test
["meta.codegolf.stackexchange.com"].forEach(function test(string) {
  console.log(string);
  console.log(this(string));
},
// submission
s=>require('regression')('linear',s.split``.map((c,i)=>[i,c.charCodeAt()])).equation
);
<script src="https://cdn.rawgit.com/Tom-Alexander/regression-js/master/src/regression.js"></script>


3

Sage, 76 ไบต์

var('m','c')
y(x)=m*x+c
f=lambda x:find_fit(zip(range(len(x)),map(ord,x)),y)

การเล่นกอล์ฟแทบจะไม่นานเกินคำตอบของงูหลาม แต่ใช่ ...


2

J , 11 ไบต์

3&u:%.1,.#\

สิ่งนี้ใช้การสร้างดัชนีแบบอิงฐานเดียว

ลองออนไลน์!

คำอธิบาย

3&u:%.1,.#\  Input: string S
         #\  Get the length of each prefix of S
             Forms the range [1, 2, ..., len(S)]
      1,.    Pair each with 1
3&u:         Get the ASCII value of each char in S
    %.       Matrix divide

2

JavaScript, 151 148 ไบต์

s=>([a,b,c,d,e]=[].map.call(s,c=>c.charCodeAt()).reduce(([a,b,c,d,e],y,x)=>[a+1,b+x,c+x*x,d+y,e+x*y],[0,0,0,0,0]),[k=(e*a-b*d)/(c*a-b*b),(d-k*b)/a])

อ่านเพิ่มเติมได้:


คุณสามารถบันทึกไบต์โดยการลบ0จากc.charCodeAt(0)และอีก 2 ไบต์โดยการย้ายk=...กลุ่มจุลภาคและวางโดยตรงในดัชนีแรกของอาร์เรย์กลับเช่น[k=...,(d-k*b)/a]
แพทริคโรเบิร์ต

2

Javascript (ES6), 112 ไบต์

s=>[m=(a=b=c=d=0,([...s].map((u,x)=>{a+=n=x,b+=y=u.charCodeAt(),c+=x*x,d+=x*y}),++n)*d-a*b)/(n*c-a*a),b/n-m*a/n]

F=s=>[m=(a=b=c=d=0,([...s].map((u,x)=>{a+=n=x,b+=y=u.charCodeAt(),c+=x*x,d+=x*y}),++n)*d-a*b)/(n*c-a*a),b/n-m*a/n]

const update = () => {
  console.clear();
  console.log(F(input.value));
};
input.oninput = update;
update();
#input {
  width: 100%;
  box-sizing: border-box;
}
<input id="input" type="text" value="meta.codegolf.stackexchange.com" length=99/>
<div id="output"></div>


2

Haskell, 154 142 ไบต์

import Statistics.LinearRegression
import Data.Vector
g x=linearRegression(generate(Prelude.length x)i)$i.fromEnum<$>fromList x
i=fromIntegral

มันยาวเกินไปสำหรับความชอบของฉันเพราะการนำเข้าและชื่อฟังก์ชั่นที่ยาวนาน แต่ก็ดี ฉันไม่สามารถนึกถึงวิธีการเล่นกอล์ฟแบบอื่น ๆ ได้แม้ว่าฉันจะไม่ชำนาญเรื่องการนำเข้ากอล์ฟก็ตาม

แยก 12 ไบต์โดยแทนที่ordและนำเข้าData.Charจาก fromEnum ด้วย nimi


1
คุณสามารถแทนที่ordด้วยและกำจัดfromEnum import Data.Char
nimi

1

ภาษามาโคร SAS, 180 ไบต์

ใช้การจัดทำดัชนีแบบอิง 1 วิธีการแก้ปัญหาจะเป็นคำที่ค่อนข้างสวยเมื่อผลลัพธ์เป็นเพียงความชันและการสกัดกั้น

%macro t(a);data w;%do i=1 %to %length(&a);x=&i;y=%sysfunc(rank(%substr(&a,&i,1)));output;%end;run;proc reg outtest=m;model y=x/noprint;run;proc print data=m;var x intercept;%mend;

1

Clojure 160 ไบต์

ไม่มีตัว -ins ใช้วิธีอธิบายซ้ำแล้วซ้ำอีกในบทความ Perceptron อาจจะไม่บรรจบกับปัจจัยการผลิตอื่น ๆ ในกรณีที่ลดอัตราการเรียนรู้และอาจจะเพิ่มจำนวนซ้ำ2e-4 1e5ไม่แน่ใจว่าอัลกอริทึมที่ไม่ใช่การวนซ้ำนั้นจะสั้นกว่าที่จะใช้หรือไม่

#(nth(iterate(fn[p](let[A apply e(for[x(range(count %))](-(int(get % x))(*(p 1)x)(p 0)))](mapv(fn[p e](+(* e 2e-4)p))p[(A + e)(A +(map *(range)e))])))[0 0])1e5)

ตัวอย่าง:

(def f #( ... ))
(f "meta.codegolf.stackexchange.com")

[99.26612903225386 0.014516129032464659]

1

Maple ขนาด 65 ไบต์

Statistics:-LinearFit(b*x+a,[$(1..length(s))],convert(s,bytes),x)

การใช้งาน:

s := "meta.codegolf.stackexchange.com";
Statistics:-LinearFit(b*x+a,[$(1..length(s))],convert(s,bytes),x);

ผลตอบแทน:

99.2516129032259+0.0145161290322573*x

หมายเหตุ: สิ่งนี้ใช้คำสั่งFitเพื่อให้พอดีกับพหุนามของรูปแบบ a * x + b กับข้อมูล พบค่า ASCII สำหรับสตริงด้วยการแปลง ing เป็นไบต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.