แยกวิเคราะห์ Quaternion


27

หากคุณยังไม่ทราบ quaternion นั้นเป็นตัวเลข 4 ส่วน สำหรับจุดประสงค์ของการท้าทายนี้มันมีองค์ประกอบจริงและส่วนประกอบจินตภาพสามประการ ส่วนประกอบจินตนาการโดยมีตัวแทนต่อท้ายi, ,j kยกตัวอย่างเช่น1-2i+3j-4kเป็น quaternion กับ1การเป็นองค์ประกอบจริงและ-2, 3และ-4เป็นส่วนประกอบในจินตนาการ

ในการท้าทายนี้คุณจะต้องแยกวิเคราะห์รูปแบบสตริงของ quaternion (เช่น"1+2i-3j-4k") ในรายการ / อาร์เรย์ของค่าสัมประสิทธิ์ (เช่น[1 2 -3 -4]) อย่างไรก็ตามสตริง quaternion สามารถจัดรูปแบบได้หลายวิธี ...

  • อาจเป็นเรื่องปกติ: 1+2i-3j-4k
  • มันอาจจะมีเงื่อนไขที่ขาดหายไป: 1-3k, 2i-4k(หากคุณมีคำขาดหายไปเอาท์พุท0สำหรับเงื่อนไขเหล่านั้น)
  • มันอาจจะมีค่าสัมประสิทธิ์ขาดหายไป: i+j-k(ในกรณีนี้นี้จะเทียบเท่ากับ1i+1j-1kในคำอื่น ๆ . i, jหรือkโดยไม่มีหมายเลขในด้านหน้าจะถือว่ามี1ในหน้าโดยค่าเริ่มต้น)
  • อาจไม่เป็นไปตามลำดับที่ถูกต้อง: 2i-1+3k-4j
  • สัมประสิทธิ์อาจเป็นจำนวนเต็มหรือทศนิยม: 7-2.4i+3.75j-4.0k

มีบางสิ่งที่ควรทราบในขณะที่การแยกวิเคราะห์:

  • จะมี+หรือ-ระหว่างเงื่อนไขเสมอ
  • คุณจะถูกส่งผ่านการป้อนข้อมูลที่ถูกต้องเสมอด้วยอย่างน้อย 1 เทอมและไม่มีตัวอักษรซ้ำ (ไม่มีj-j)
  • ตัวเลขทั้งหมดสามารถสันนิษฐานได้ว่าถูกต้อง
  • คุณสามารถเปลี่ยนตัวเลขลงในอีกรูปแบบหนึ่งหลังจากแยกถ้าคุณต้องการ (อดีต. 3.0 => 3, 0.4 => .4, 7 => 7.0)

ไม่อนุญาตให้ทำการแยกวิเคราะห์และสร้าง quaternion และช่องโหว่มาตรฐาน ซึ่งรวมถึงevalคำหลักและฟังก์ชั่น อินพุตจะเป็นสตริงเดี่ยวและเอาต์พุตจะเป็นรายการอาร์เรย์ค่าที่คั่นด้วยช่องว่าง ฯลฯ

เช่นนี้คือรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบตัน

1+2i+3j+4k             => [1 2 3 4]
-1+3i-3j+7k            => [-1 3 -3 7]
-1-4i-9j-2k            => [-1 -4 -9 -2]
17-16i-15j-14k         => [17 -16 -15 -14]

7+2i                   => [7 2 0 0]
2i-6k                  => [0 2 0 -6]
1-5j+2k                => [1 0 -5 2]
3+4i-9k                => [3 4 0 -9]

42i+j-k                => [0 42 1 -1]
6-2i+j-3k              => [6 -2 1 -3]
1+i+j+k                => [1 1 1 1]
-1-i-j-k               => [-1 -1 -1 -1]

16k-20j+2i-7           => [-7 2 -20 16]
i+4k-3j+2              => [2 1 -3 4]
5k-2i+9+3j             => [9 -2 3 5]
5k-2j+3                => [3 0 -2 5]

1.75-1.75i-1.75j-1.75k => [1.75 -1.75 -1.75 -1.75]
2.0j-3k+0.47i-13       => [-13 0.47 2.0 -3] or [-13 .47 2 -3]
5.6-3i                 => [5.6 -3 0 0]
k-7.6i                 => [0 -7.6 0 1]

0                      => [0 0 0 0]
0j+0k                  => [0 0 0 0]
-0j                    => [0 0 0 0] or [0 0 -0 0]
1-0k                   => [1 0 0 0] or [1 0 0 -0]

จะมี+สัญญาณที่ไม่จำเป็นในอินพุตหรือไม่? ที่ชอบ: +1k?
FryAmTheEggman

@FryAmTheEggman +เลขที่ปัจจัยการผลิตจะไม่เริ่มต้นด้วย
GamrCorps

1
เป็น-0ส่วนหนึ่งของการส่งออกตามกฎหมายสำหรับสองตัวอย่างที่ผ่านมาหรือไม่?
isaacg

1
@isaacg ใช่ว่าใช้ได้
GamrCorps

1
@LLlAMnYP คุณนำเสนอจุดที่ดี ให้กำหนดevalข้อ จำกัด ที่ต้องใช้ในสตริงตีความเป็นรหัสและ / หรืออินพุต การแปลงใด ๆ จะไม่นับภายใต้สิ่งนี้เนื่องจากคุณไม่สามารถส่งผ่านตัวอย่างเช่นสตริง"test"ไปยังฟังก์ชันการแปลงจำนวนเต็มเพื่อรับจำนวนเต็ม แต่testจะตีความว่าเป็นรหัสในevalฟังก์ชั่นปกติ TLDR: eval: ไม่ใช่พิมพ์การแปลง: ใช่
GamrCorps

คำตอบ:


5

Pyth, 48 ไบต์

jm+Wg\-K--e|d0G\+K1+]-I#GJczfT.e*k<b\.zm/#dJ"ijk

ชุดทดสอบสาธิต

รูปแบบเอาท์พุทจะขึ้นบรรทัดใหม่คั่น รหัสชุดทดสอบใช้การแยกช่องว่างเพื่อความสะดวกในการอ่าน แต่จะเหมือนกัน

ส่งออก a -0ใน 2 กรณีล่าสุดซึ่งฉันหวังว่าจะโอเค

คำอธิบายที่จะปฏิบัติตาม


9

เรติน่า, 115

\b[ijk]
1$&
^(?!.*\d([+-]|$))
0+
^(?!.*i)
+0i+
^(?!.*j)
0j+
^(?!.*k)
0k+
O$`[+-]*[\d.]*(\w?)
$1
-
+-
^\+

S`[ijk+]+

ลองออนไลน์!

1 ไบต์บันทึกขอบคุณที่@ Chris Jester-หนุ่ม

แก้ไขข้อผิดพลาดและบันทึก 6 ไบต์ด้วย@Martin Büttner

พบข้อบกพร่องคู่ที่เกี่ยวข้องกับกรณีขอบบางชนจำนวนไบต์นับขึ้นเล็กน้อย

ส่งคืนตัวเลขบรรทัดใหม่ที่คั่นด้วย ยังไงก็ตามนี่เป็นวิธีแก้ปัญหาที่สง่างามเป็นส่วนใหญ่ซึ่งได้รับการทำลายโดยกรณีขอบ แต่เฮ้ฉันต้องใช้โหมดการจัดเรียงซึ่งหมายความว่าฉันใช้เครื่องมือที่เหมาะสมสำหรับงานใช่มั้ย

คำอธิบาย:

ทีละขั้นตอนตามปกติ

\b[ijk]
1$&

-+.ตัวละครเท่านั้นในการป้อนข้อมูลที่สามารถสร้างขอบเขตของคำมี ซึ่งหมายความว่าหากเราพบเขตแดนตามด้วยตัวอักษรเรามีนัย1ที่เราเพิ่มเข้าไปด้วยการแทนที่$&$0เป็นคำพ้องสำหรับ

^(?!.*\d([+-]|$))
0+

ขอบคุณมากสำหรับมาร์ตินสำหรับอันนี้อันนี้เพิ่มโดยนัย 0สำหรับส่วนจริงถ้ามันหายไปในการป้อนข้อมูล เราตรวจสอบให้แน่ใจว่าเราไม่พบหมายเลขที่ตามด้วยเครื่องหมายบวกหรือลบหรือจุดสิ้นสุดของสตริง ตัวเลขที่ซับซ้อนทั้งหมดจะมีตัวอักษรตามหลังพวกเขา

^(?!.*i)
+0i+

3 ขั้นตอนถัดไปนั้นเหมือนกันหมดยกเว้นว่าจะส่งผลกระทบต่อตัวอักษรใด พวกเขาทั้งหมดมองว่าเราไม่สามารถจับคู่จดหมายและถ้าเราไม่สามารถเพิ่ม0คำสำหรับมัน เหตุผลเดียวที่iมีการเพิ่ม+มาก่อนเพื่อป้องกันไม่ให้มูลค่าที่แท้จริงอ่านไม่ได้ด้วยiสัมประสิทธิ์ s ตัวเลขอื่น ๆ ทั้งหมดจะถูกคั่นด้วยตัวแปรที่ซับซ้อน

O$`[+-]*[\d.]*(\w?)
$1

อาส่วนที่สนุก สิ่งนี้ใช้ขั้นตอนการจัดเรียงแบบใหม่ซึ่งแสดงโดยOก่อนตัวเลือกตัวคั่น backtick ijkเคล็ดลับที่นี่คือการคว้าตัวเลขทั้งหมดตามด้วยตัวอักษรคำซึ่งในกรณีนี้เท่านั้นที่เคยจะตรงกับหนึ่งใน ตัวเลือกอื่น ๆ ที่ใช้นั้นเป็น$สาเหตุให้ค่าที่ใช้ในการเรียงลำดับรายการที่ตรงกันเหล่านี้เป็นการแทนที่ ที่นี่เราเพียงแค่ใช้ตัวเลือกที่เหลืออยู่เป็นค่าจัดเรียงของเรา เนื่องจาก Retina เรียงลำดับตามพจนานุกรมตามค่าเริ่มต้นค่าต่างๆจะเรียงลำดับเหมือนอยู่ในพจนานุกรมซึ่งหมายความว่าเราจะได้รับการจับคู่ใน"", "i", "j", "k"การสั่งซื้อ

-
+-

ขั้นตอนนี้ทำให้ +เครื่องหมายไว้หน้าเครื่องหมายลบทั้งหมดซึ่งจำเป็นถ้าเรามีค่าลบสำหรับiในสเตจแยก

^ \ +

เราลบผู้นำ +เพื่อให้แน่ใจว่าเราไม่มี newline ชั้นนำพิเศษ

S`[ijk+]+

แยกบรรทัดที่เหลือในการทำงานของตัวแปรที่ซับซ้อนหรือเครื่องหมายบวก สิ่งนี้ทำให้เรามีค่าหนึ่งค่าต่อบรรทัด


3

Perl 5, 125 ไบต์

#!perl -p
%n=(h,0,i,0,j,0,k,0);$n{$4//h}=0+"$1@{[$3//$5//1]}"while/([+-]?)(([\d.]+)?([ijk])|([\d.]+))/g;s/.*/@n{qw(h i j k)}/

1
@KennyLau น่าเสียดายที่การเปลี่ยนแปลงที่คุณเสนอไม่ได้ทำในสิ่งที่คุณคาดหวัง ฉันได้ลองแล้วก่อนที่จะโพสต์คำตอบของฉัน ;-)
Chris Jester-Young

@KennyLau เกี่ยวกับการเปลี่ยนแปลงที่เสนอนี้การ\aจับคู่ของ Perl ใน "การเตือน" ไม่ใช่ตัวอักษร มี\wสำหรับตัวอักษรคำ (ตัวอักษรและตัวเลขและขีดล่าง) แต่นั่นจะไม่ทำงานที่นี่ เราต้องการไม่ให้จับคู่กับตัวเลข
Chris Jester-Young

3
@KennyLau BTW คุณมีตัวแทนพอที่จะพูดคุยในการแชท อย่าลังเลที่จะพูดคุยความคิดที่นั่นแทนที่จะปฏิเสธคำแนะนำการแก้ไขของคุณอย่างต่อเนื่อง ;-)
Chris Jester-Young

ฉันมีตัวแทนมากพอที่จะแสดงความคิดเห็นในขณะนี้ Perl ไม่มีรูปแบบสำหรับ [az] หรือไม่?
Leun Nun

1
@KennyLau ไม่ใช่ความรู้ของฉัน
Chris Jester-Young

3

Lua , 185 187 195 183 166 ไบต์ (ลองออนไลน์ได้ ) [used regex]

ขอบคุณ@Chris Jester-Youngสำหรับ regex ที่ได้รับการปรับปรุง

ขอบคุณ@Katenkyoนำมันลงมาที่ 166 ไบต์

แข็งแรงเล่นกอล์ฟ:

r={0,0,0,0}for u in(...):gsub("([+-])(%a)","%11%2"):gmatch("-?[%d.]+%a?")do n,i=u:match("(.+)(%a)")r[i and(" ijk"):find(i)or 1]=(n or u)end print(table.concat(r," "))

Ungolfed:

n = "42i+j-k+0.7"

result = {0,0,0,0}

for unit in n:gsub("([+-])(%a)","%11%2"):gmatch("-?[%d.]+%a?") do
  num, index = unit:match("(.+)(%a)")
  if index == "i" then
    result[2] = num
  elseif index == "j" then
    result[3] = num
  elseif index == "k" then
    result[4] = num
  else
    result[1] = unit
  end
end

print(table.concat(result," "))

2
สวัสดีเคนนี่ขอบคุณสำหรับการแก้ปัญหา โดยปกติเราไม่อนุญาตให้อินพุตเริ่มต้นในตัวแปร (เช่นnในกรณีนี้) ดังนั้นคุณควรเพิ่มรหัสเพื่ออ่านอินพุต
isaacg

คุณควรจะสามารถที่จะบันทึกไบต์บางโดยการเปลี่ยนการป้อนข้อมูลของคุณจาก STDIN อาร์กิวเมนต์แทนการใช้io.read() (...)มันจะชี้ไปที่อาร์กิวเมนต์บรรทัดคำสั่งครั้งแรกและจะช่วยให้คุณประหยัดมากขึ้น 4 ไบต์ :)
Katenkyo

1
นอกจากนี้เอาต์พุตที่ถามสามารถเป็นอะไรก็ได้ตราบใดที่มันสามารถถูก interepreted โดยมนุษย์เป็นรายการเพื่อให้คุณสามารถลบการจัดรูปแบบพิเศษ รวมถึงช่องว่างอื่น ๆ อีกมากมายที่คุณสามารถโกนได้รหัสของคุณสามารถลงไปได้ถึง 166 ไบต์ ->r={0,0,0,0}for u in(...):gsub("([+-])(%a)","%11%2"):gmatch("-?[%d.]+%a?")do n,i=u:match("(.+)(%a)")r[i and(" ijk"):find(i)or 1]=(n or u)end print(table.concat(r," "))
Katenkyo

3

C, 236 ไบต์

char j,n[9][9],s[9],y[9],i=8,k,*p=n[8];main(c){for(**n=48;c=getchar(),c+1;)c-32&&(c<46&&(k&&(y[1]=i),k=0,s[--i]=c-43,p=n[i])||c>57&&(k||(*p=49),k=0,y[c-103]=i)||(*p++=c,k=1));for(k&&(y[1]=i);++j<5;)printf("%c%s ",s[y[j]]?45:0,n[y[j]]);}

(สำหรับค่าเช่น -0 หรือ -0.0 เครื่องหมายลบจะถูกพิมพ์ในเอาต์พุตด้วยเช่นกันแต่เนื่องจากความท้าทายระบุว่า "คุณสามารถเปลี่ยนตัวเลขไปเป็นรูปแบบอื่นหลังจากแยกวิเคราะห์หากคุณต้องการ" และถ้า -0 ปรากฏในอินพุต เป็นไปตามที่มันยอมรับได้ในผลลัพธ์ @GamrCorps ได้ชี้แจงว่านี่เป็น ok)


3

JavaScript (ES6), 103 100 ไบต์

f=s=>s.replace(/(?=.)(\+|-|)([\d.]*)(\w?)/g,(_,s,x,c)=>a[c.charCodeAt()&3]=+(s+(x||1)),a=[0,0,0,0])&&a

แก้ไข: บันทึก 3 ไบต์โดยสลับจากparseIntเป็นcharCodeAtซึ่งสะดวกเพียงต้องการ&3ดัชนีอาร์เรย์ที่ถูกต้องให้ฉัน


ความคิดที่ดี parseInt + mod คิดถึงฐานและคำนำหน้า
edc65

1

JavaScript (ES6) 106

s=>(s.replace(/([+-]?)([\d.]*)(\w?)/g,(a,b,c,d)=>a&&(s[d||9]=b+(c||1)),s={}),[...'9ijk'].map(i=>+s[i]||0))

ทดสอบ

f=s=>(s.replace(/([+-]?)([\d.]*)(\w?)/g,(a,b,c,d)=>a&&(s[d||9]=b+(c||1)),s={}),[...'9ijk'].map(i=>+s[i]||0))

function Test()
{
  var t,k,r,ts=TS.value.split('\n')
  
  O.textContent=ts.map(x=>x.trim()&&(
    [t,k]=x.split('=>').map(x=>x.trim()),
    console.log(t,'*',k),
    k=k.match(/[\d+-.]+/g).map(x=>+x),
    r=f(t),
    t+' => '+r+(r+''==k+''?' OK':' KO (check: '+k+')')
  )).join('\n')
}    

Test()
#TS { width:90%; height:10em}
<pre id=O></pre>

Test data (modify if you like)<button onclick='Test()'>repeat test</button>
<textarea id=TS>
1+2i+3j+4k             => [1 2 3 4]
-1+3i-3j+7k            => [-1 3 -3 7]
-1-4i-9j-2k            => [-1 -4 -9 -2]
17-16i-15j-14k         => [17 -16 -15 -14]
  
7+2i                   => [7 2 0 0]
2i-6k                  => [0 2 0 -6]
1-5j+2k                => [1 0 -5 2]
3+4i-9k                => [3 4 0 -9]
  
42i+j-k                => [0 42 1 -1]
6-2i+j-3k              => [6 -2 1 -3]
1+i+j+k                => [1 1 1 1]
-1-i-j-k               => [-1 -1 -1 -1]
  
16k-20j+2i-7           => [-7 2 -20 16]
i+4k-3j+2              => [2 1 -3 4]
5k-2i+9+3j             => [9 -2 3 5]
5k-2j+3                => [3 0 -2 5]
  
1.75-1.75i-1.75j-1.75k => [1.75 -1.75 -1.75 -1.75]
2.0j-3k+0.47i-13       => [-13 0.47 2.0 -3]
5.6-3i                 => [5.6 -3 0 0]
k-7.6i                 => [0 -7.6 0 1]
  
0                      => [0 0 0 0]
0j+0k                  => [0 0 0 0]
-0j                    => [0 0 0 0]
1-0k                   => [1 0 0 0]
</textarea>


0

PowerShell, 178 ไบต์

param($a);$p="(-?)([\d.]+)?";$g={param($s)if($a-match"$p$s"){if(($r=$matches)[2]){$r[1]+$r[2]}else{$r[1]+1}}else{0}};$a-match"$p(\+|-|$)">$null;+$matches[2];"i","j","k"|%{&$g $_}

ไม่พอใจกับคำอธิบาย

# Get the whole string into a variable
param($a)
# Pattern shared getting both imaginary and real numbers. 
$p="(-?)([\d.]+)?"
# Anonymous function that will locate a imaginary number using a letter sent as a parameter. 
# If no value is assigned a signed 1 is returned. If no value is matched 0 is returned
$g={param($s)if($a-match"$p$s"){if(($r=$matches)[2]){$r[1]+$r[2]}else{$r[1]+1}}else{0}}
# Locate the real component if any. Null is converted to 0
$a-match"$p(\+|-|$)">$null;+$matches[2]
# Call the anonymous function using each of the imaginary suffixes.                                               
"i","j","k"|%{&$g $_}

ไม่ประทับใจสุด ๆ แต่มันก็เป็นผลลัพธ์


0

PHP, 179 ไบต์

$a=[''=>0,'i'=> 0,'j'=>0,'k'=>0];preg_match_all("/([-+]?)(\d*(\.\d+)?)([ijk]?)/",$argv[1],$m,2);foreach($m as$n)if($n[0])$a[$n[4]]=$n[1].($n[2]===''?1:$n[2]);echo implode(',',$a);

ลองใช้ชุดทดสอบ


0

Python 3.5 - 496 ไบต์ [ใช้นิพจน์ปกติ]:

from re import*
def wq(r):
 a=sub('[+](?![0-9])','+1',sub('[-](?![0-9])','-1',r));q=lambda x:(not x.isdigit(),''.join(filter(str.isalpha,x)))
 for z in findall('(?<![0-9])[a-z]',a):a=a.replace(z,('+1{}'.format(z)))
 if not str(sorted(((sub('[.]','',sub('[+-]',' ',a))).split(' ')),key=q)[0]).isdigit():a+='+0, '
 for i in list(set(findall('[a-z]',a))^{'i','j','k'}):a+='+0{}, '.format(i)
 print(findall('[-]?\d+(?:\.\d+)?',''.join(sorted(sub('(?<=[A-Za-z0-9])(?=[+-])',', ',a).split(' '),key=q))))

อาจนาน แต่ในการป้องกันของฉันมันทำงานได้อย่างสมบูรณ์แบบในการทำสิ่งที่ OP ต้องการเนื่องจากทุกกรณีการทดสอบที่ได้รับนั้นประสบความสำเร็จในการใช้รหัสของฉัน

เวอร์ชันที่ไม่ได้บรรจุพร้อมคำอธิบายรวมถึง:

from re import*
def w(r):
    # Substitute all minus (-) and plus (+) signs NOT followed by a number  (if there are any) with a "-1"/"+1", respectively.
    a=sub('[+](?![0-9])','+1',sub('[-](?![0-9])','-1',r))
    # Lambda function created for later use to sort the Quaternion. This function, when given as a key to the "sorted" function, arranges the input Quaternion in the order where the whole number comes first, and then the rest are placed in order of increasing letter value (i,j,k in this case) 
    q=lambda x:(not x.isdigit(),''.join(filter(str.isalpha,x)))
    # The following "for" loop replaces the letters NOT preceded by a number with a one followed by that letter
    for z in findall('(?<![0-9])[a-z]',a):
        a=a.replace(z,('+1{}'.format(z)))
    # The following first substitutes all pluses and minuses (+ and -) with a space, and then that new string is split at those spaces, and returned as a list. After that, the list is sorted according the the "lambda" function shown above. Then, the first item in that list, which is supposed to be a lone number, is checked to make sure that it indeed is a lone number. If it isn't, then "+0, " is appended to the Quaternion. 
    if not str(sorted(((sub('[.]','',sub('[+-]',' ',a))).split(' ')),key=q)[0]).isdigit():
        a+='+0, '
    # The following "for" loop finds ALL the letters NOT in the list, by finding the symmetric difference between a set of all the letters found, and a set containing all the letters needed. For the letters not in the list, a '+0' is added the quaternion, followed by that letter, and then a comma and a space.
    for i in list(set(findall('[a-z]',a))^{'i','j','k'}):
        a+='+0{}, '.format(i)
    # Finally, in this last step, a ", " is added IN BETWEEN unicode characters and pluses/minuses (+/-). Then, it splits at those spaces, and the commas separate different parts of the Quaternion from each other (otherwise, you would get something like `12i+3j+4k` from `2i+3j+4k+1`) in a returned list. Then, that list is sorted according to the lambda expression "q" (above), and then, finally, the NUMBERS (of any type, courtesy to Regex) are extracted from that joined list, and printed out in the correct order.
    print(findall('[-]?\d+(?:\.\d+)?',''.join(sorted(sub('(?<=[A-Za-z0-9])(?=[+-])',', ',a).split(' '),key=q))))

หากสิ่งที่กล่าวมาข้างต้นนั้นยากเกินกว่าจะอ่านได้โดยทั่วไปสิ่งที่เกิดขึ้นคือ:

  1. หากมีเครื่องหมาย + หรือ - ทั้งหมดที่ไม่ได้ตามด้วยหมายเลขจะถูกแทนที่ด้วย "+1" / "- 1" ตามลำดับ

  2. มีlambdaการกำหนดฟังก์ชันซึ่งเมื่อใช้ในsortedการทำงานเป็นกุญแจสำคัญที่จะเรียงลำดับรายชื่อตามการวางตัวเลขทั้งหมดก่อนแล้วจึงสั่งซื้อส่วนที่เหลือในการเพิ่มมูลค่าตัวอักษร ( "ฉัน" แล้ว "เจ" แล้ว "K" ในตัวอย่างนี้)

  3. Quaternion ซึ่งขณะนี้มีเครื่องหมาย +/- ทั้งหมดแทนที่ด้วย 1 หากต้องการถูกค้นหาโดยใช้นิพจน์ปกติสำหรับตัวอักษรทั้งหมดที่ไม่นำหน้าด้วยตัวเลขอย่างน้อยหนึ่งตัวและตัวอักษรที่ตรงกันจะถูกแทนที่ด้วย "+1" ตามด้วย จดหมายฉบับนั้น

  4. คำสั่ง "if" จะแทนที่สัญญาณทั้งหมด +/- ด้วยช่องว่างจากนั้น Quaternion ที่ถูกปรับเปลี่ยนจะกลายเป็น "แยก" ที่ช่องว่างเหล่านั้นและส่งกลับมาในรายการ จากนั้นรายการจะถูกจัดเรียงตามฟังก์ชั่นแลมบ์ดาที่อธิบายไว้ก่อนหน้านี้ ในที่สุดรายการแรกในรายการนั้นจะถูกตรวจสอบเพื่อให้แน่ใจว่าเป็นตัวเลขเนื่องจากมันควรจะเป็นและถ้าไม่ใช่จะมีการเพิ่ม "+0," ลงใน Quaternion

  5. "for" loop ที่สองค้นหาตัวอักษรทั้งหมดที่ไม่ได้อยู่ใน Quaternion โดยการค้นหาความแตกต่างที่สมมาตรระหว่างชุดของตัวอักษรเหล่านั้นที่พบในนิพจน์แล้วชุดที่รวมถึงตัวอักษรทั้งหมดที่ต้องการ ถ้าพบจะมีเครื่องหมาย "+0" ตามด้วยตัวอักษรที่หายไปและเพิ่มช่องว่างใน Quaternion

  6. ในที่สุดในขั้นตอนสุดท้ายนี้จะมีการเพิ่ม "," ระหว่างอักขระแต่ละตัวตามด้วยเครื่องหมาย +/- จากนั้น Quaternion จะถูกแยกออกที่ช่องว่างเหล่านั้นจากนั้นรายการที่ส่งกลับจะถูกจัดเรียงเป็นครั้งสุดท้ายตาม ฟังก์ชัน lambda ถูกกำหนดเป็น "q" ก่อนหน้านี้ เครื่องหมายจุลภาคในนิพจน์คั่นแต่ละส่วนของควอเทอเนียน (ไม่เช่นนั้นคุณจะได้อะไร14i+5j+6kจาก4i+5j+6k+1) สุดท้ายรายการที่เรียงลำดับตอนนี้จะถูกรวมเข้าด้วยกันเป็นสตริงและจะดึงเฉพาะตัวเลข ประเภทใด ๆ (ความอนุเคราะห์จากนิพจน์ปกติ) และในที่สุดก็ส่งคืนในรายการตามลำดับที่ถูกต้องทุกครั้ง

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