นับเช่นเดียวกับชาวบาบิโลน


41

ท้าทาย

ให้การแทน ASCII ของหมายเลข Babylonian เป็น input, ส่งออกตัวเลขในเลขอารบิคตะวันตก

ระบบตัวเลขของบาบิโลน

ชาวบาบิโลนนับอย่างไร ที่น่าสนใจคือพวกเขาใช้ระบบฐาน 60 พร้อมองค์ประกอบของระบบฐาน 10 ก่อนอื่นให้พิจารณาคอลัมน์หน่วยของระบบ:

ชาวบาบิโลนมีเพียงสามสัญลักษณ์: T(หรือถ้าคุณสามารถทำให้มัน:) 𒐕ซึ่งเป็นตัวแทน 1 และ<(หรือถ้าคุณสามารถทำให้มัน:) 𒌋ซึ่งเป็นตัวแทน 10 และ\(หรือถ้าคุณทำให้มัน:) 𒑊ซึ่งเป็นศูนย์

หมายเหตุ: ในทางเทคนิคแล้ว\(หรือ𒑊) ไม่ใช่ศูนย์ (เพราะชาวบาบิโลนไม่ได้มีความคิดเป็น 'ศูนย์') 'Zero' ถูกประดิษฐ์ขึ้นในภายหลังดังนั้นจึง\มีการเพิ่มสัญลักษณ์ตัวยึดตำแหน่งในภายหลังเพื่อป้องกันความกำกวม อย่างไรก็ตามสำหรับวัตถุประสงค์ของการท้าทายนี้ก็ถือว่าเพียงพอแล้วที่จะ\เป็นศูนย์

ดังนั้นในแต่ละคอลัมน์คุณเพียงเพิ่มมูลค่าของสัญลักษณ์เช่น:

<<< = 30
<<<<TTTTTT = 46
TTTTTTTTT = 9
\ = 0

จะไม่มีมากกว่าห้า<หรือมากกว่าเก้าTในแต่ละคอลัมน์ \จะปรากฏอยู่คนเดียวในคอลัมน์เสมอ

ตอนนี้เราจำเป็นต้องขยายเพื่อเพิ่มคอลัมน์เพิ่มเติม วิธีนี้ทำงานเหมือนกับฐานหกสิบอื่น ๆ ทุกประการที่คุณคูณค่าของคอลัมน์ขวาสุดด้วย , หนึ่งทางซ้าย , หนึ่งทางซ้ายเป็นต้น จากนั้นคุณจะเพิ่มมูลค่าของแต่ละรายการเพื่อรับค่าของตัวเลข600601602

คอลัมน์จะถูกคั่นด้วยช่องว่างเพื่อป้องกันความกำกวม

ตัวอย่างบางส่วน:

<< <TT = 20*60 + 12*1 = 1212
<<<TT \ TTTT = 32*60^2 + 0*60 + 4*1 = 115204

กฎระเบียบ

  • คุณมีอิสระที่จะรับอินพุต ASCII ( T<\) หรืออินพุต Unicode ( 𒐕𒌋𒑊)
  • จำนวนที่ป้อนจะต่ำกว่า107
  • <เสมอจะไปทางซ้ายของTในแต่ละคอลัมน์
  • \ จะปรากฏอยู่คนเดียวในคอลัมน์เสมอ

การชนะ

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


2
@TaylorScott ใช่คุณอาจ
เบต้าการสลายตัว

2
ในกรณีที่ช่วยได้: จำนวนสูงสุดที่ต้องจัดการคือ 4 คอลัมน์:<<<<TTTTTT <TTTTTTT <<<<TTTTTT <<<<
Wernisch

1
คอลัมน์ถูกคั่นด้วยช่องว่างหนึ่งช่องเสมอกันหรือไม่ ฉันสังเกตเห็นคำตอบที่ต้องใช้
KRyan

4
ประเภทต่างประเทศที่มีท่อมอระกู่พูดว่า Ay oh เวย์โอ้, ay oh เวย์โอ้ - นับเหมือนชาวบาบิโลน ยิ่งใหญ่ ตอนนี้มันติดอยู่ในหัวของฉัน
cobaltduck

5
"How did the Babylonians count? Interestingly, they used a Base 60 system with an element of a Base 10 system."ซึ่งยังคงใช้อยู่ในปัจจุบัน ระบบหมายเลขบาบิโลนเป็นสิ่งที่เราใช้สำหรับนาฬิกา ทศนิยมสองหลักแต่ละหน่วยเป็นวินาทีนาทีและชั่วโมง 60 วินาทีถึงนาที 60 นาทีถึงชั่วโมง
เรย์

คำตอบ:


39

JavaScript (ES6), 44 ไบต์

รับอินพุตเป็นอาร์เรย์ของอักขระ ASCII

a=>a.map(c=>k+=c<1?k*59:c<'?'?10:c<{},k=0)|k

ลองออนไลน์!

อย่างไร?

ระบบตัวเลขของชาวบาบิโลนนั้นถูกมองว่าเป็นภาษา 4 คำสั่งที่ทำงานด้วยการลงทะเบียนครั้งเดียว - เรียกมันว่าแอคคูมูเลเตอร์

เริ่มต้นด้วยอักขระแต่ละตัวในอาร์เรย์อินพุตจะปรับเปลี่ยนการสะสมดังนี้:c a kk=0cak

  • space: คูณด้วย60 (ใช้งานเป็น: เพิ่ม59 kถึงk )k6059kk
  • <: เพิ่มถึงk10k
  • T: เพิ่มค่าk
  • \: ไม่ทำอะไร; นี่คือNOPคำสั่งของภาษานี้ (นำไปใช้เป็น: เพิ่มถึงk )0k

12

C (gcc) , 140 138 136 ไบต์

  • ที่บันทึกไว้สองไบต์ขอบคุณที่ceilingcat
B,a,b,y;l(char*o){y=B=0,a=1;for(char*n=o;*n;n++,B++[o]=b,a*=60)for(b=0;*n&&*n-32;n++)b+=*n-84?*n-60?:10:1;for(B=a;B/=60;y+=*o++*B);B=y;}

ลองออนไลน์!


6
+1 ยกระดับ "นับเหมือนชาวบาบิโลน" ไปอีกระดับ: D
Beta Decay

11

Perl 6 , 39 ไบต์

-3 ไบต์ขอบคุณ nwellnhof

{:60[.words>>.&{sum .ords X%151 X%27}]}

ลองออนไลน์!

ใช้อักขระตัวพิมพ์ใหญ่

คำอธิบาย:

{                                     }   # Anonymous code block
     .words  # Split input on spaces
           >>.&{                    }  # Convert each value to
                sum   # The sum of:
                    .ords # The codepoints
                          X%151 X%27   # Converted to 0,1 and 10 through modulo
 :60[                                ]  # Convert the list of values to base 60

คุณชนะฉันในอีกไม่กี่นาที นี่คือสิ่งที่ฉันคิด: {:60[.words>>.&{sum (.ords X%151)X%27}]}(40 bytes)
nwellnhof

@nwellnhof ทำได้ดีมาก! คุณหาค่า mod ได้อย่างไร
Jo King

2
ง่ายๆโดยการใช้กำลังดุร้าย
nwellnhof

11

เยลลี่ ,  13  12 ไบต์

ḲO%7C%13§ḅ60

ลิงก์ monadic ยอมรับรายการของอักขระที่ให้จำนวนเต็ม

ลองออนไลน์!

อย่างไร?

ḲO%7C%13§ḅ60 - Link: list of characters   e.g. "<<<TT \ TTTT"
Ḳ            - split at spaces                 ["<<<TT", "\", "TTTT"]
 O           - cast to ordinals                [[60,60,60,84,84],[92],[84,84,84,84]]
  %7         - modulo by seven (vectorises)    [[4,4,4,0,0],[1],[0,0,0,0]]
    C        - compliment (1-X)                [[-3,-3,-3,1,1],[0],[1,1,1,1]]
     %13     - modulo by thirteen              [[10,10,10,1,1],[0],[1,1,1,1]]
        §    - sum each                        [32,0,4]
         ḅ60 - convert from base sixty         115204

อีก 12: ḲO⁽¡€%:5§ḅ60( ⁽¡€เป็น1013ดังนั้น modulos นี้1013โดยOค่า rdinal รับ53, 5และ1สำหรับ<, T, \ตามลำดับจากนั้นดำเนินการจำนวนเต็มหาร:โดย5จะได้รับ10, 1และ0)


ฮ่า ๆ ฉันได้ลบคำตอบของฉันอย่างแน่นอนเพราะฉันจำได้ว่าฉันสามารถใช้การแปลงฐาน แต่ก็ขี้เกียจเกินไปที่จะหาวิธี +1
Mr. Xcoder

6

05AB1E , 13 ไบต์

8740|Ç%4/O60β

ลองออนไลน์!

เพื่อชดเชยว่าฉันขี้เกียจกับคำตอบ Jelly ของฉันได้อย่างไรนี่คือการส่งใน 05AB1E xD


ช่วย 05AB1E ออกไปไม่มีวิธีบีบอัดตัวเลขเช่นนี้8740หรือ
นาย Xcoder

2
codegolf.stackexchange.com/a/166851/52210น่าเสียดายที่มันจะไม่สั้นลง: •Yη•(4 bytes)
Kevin Cruijssen

2
@KevinCruijssen ขอขอบคุณ! คำตอบนั้นมีประโยชน์มากฉันจะใช้มันในอนาคตโดยสิ้นเชิง
Mr. Xcoder

1
ดีใจที่ได้ใช้ :) ฉันคิดสิ่งเหล่านี้ออกมาหลังจากเห็นคำตอบที่ใช้ ส่วนพจนานุกรมอธิบายที่นี่ และการบีบอัดของสตริงอื่น ๆ หรือจำนวนเต็มขนาดใหญ่ที่ผมคิดออกเองหลังจากที่ได้เห็นคำตอบเช่นการเชื่อมโยงสำหรับ"ห่าน"และ246060
Kevin Cruijssen

1|Ç7%-13%O60βคือ 13 - มันเล่นกอล์ฟได้ไหม?
Jonathan Allan

6

Python 2 , 96 93 87 85 ไบต์

lambda s:sum(60**i*sum(8740%ord(c)/4for c in v)for i,v in enumerate(s.split()[::-1]))

ลองออนไลน์!


ที่บันทึกไว้:

  • -1 ไบต์ขอบคุณ Mr. Xcoder
  • -4 ไบต์ขอบคุณ Poon Levi
  • -2 ไบต์ขอบคุณ Matthew Jensen

1
95:(ord(c)%5/2or 11)-1
นาย Xcoder

@ Mr.Xcoder ขอบคุณ :)
TFeld

2
87:8740%ord(c)/4
Poon Levi

-2 โดยลบวงเล็บที่อยู่รอบ ๆ ผลรวมที่สอง () ลองออนไลน์!
แมทธิวเซ่น


4

Excel VBA ขนาด 121 ไบต์

จำกัด ไว้ที่ Office แบบ 32 บิตซึ่ง^ทำหน้าที่เป็นLongLongตัวอักษรประเภทในรุ่น 64 บิต

รับอินพุตจากเซลล์A1และเอาต์พุตไปยังหน้าต่าง vbe ทันที

a=Split([A1]):u=UBound(a):For i=0 To u:v=a(i):j=InStrRev(v,"<"):s=s+(j*10-(InStr(1,v,"T")>0)*(Len(v)-j))*60^(u-i):Next:?s

Ungolfed และแสดงความคิดเห็น

a=Split([A1])       '' Split input into array
u=UBound(a)         '' Get length of array
For i=0 To u        '' Iter from 0 to length
v=a(i)              '' Get i'th column of input
j=InStrRev(v,"<")   '' Get count of <'s in input
                    '' Multiply count of <'s by 10; check for any T's, if present
                    ''   add count of T's
t=t+(j*10-(InStr(1,v,"T")>0)*(Len(v)-j))
    *60^(u-i)       '' Multiply by base
Next                '' Loop
?s                  '' Output to the VBE immediate window

4

Dyalog APL , 33 30 ไบต์

{+/(⌊10*⍵-360*+\2=⍵}'\ T<'⍳⌽

ลองออนไลน์!

แก้ไข: -3 ไบต์ขอบคุณngn

'\ T<'⍳แทนที่อักขระด้วยตัวเลข (ตำแหน่งของพวกเขาในค่าคงที่ของสตริง) และย้อนกลับอินพุตดังนั้น 'หลัก' ที่สำคัญที่สุดจะคงอยู่ สิ่งนี้ช่วยให้+\2=สามารถนับจำนวนกำลังไฟที่ต้องการ 60 (ใช้โดย60*) โดยการนับจำนวนครั้งที่มีช่องว่าง (ดัชนี 2 ในค่าคงที่สตริง)

⌊10*⍵-3ให้พลังที่ต้องการเป็นสิบสำหรับตัวละครแต่ละตัว ลำดับของอักขระในค่าคงที่สตริงและออฟเซ็ต -3 ทำให้เกิด '\' และช่องว่างเพื่อไปยังจำนวนลบทำให้เกิดเศษส่วนเมื่ออักขระเหล่านั้นถูกยกกำลัง 10 ทำให้สามารถกำจัดได้

ทั้งหมดที่เราต้องทำตอนนี้คือคูณตัวเลขอำนาจของ-10 โดยอำนาจของ 60 +/ค่าสถานที่และสรุปจำนวนมากขึ้นด้วย


บันทึกสองสามไบต์โดยหลีกเลี่ยงการเปรียบเทียบแยกกับ' ':{+/(⌊10*⍵-3)×60*+\2=⍵}'\ T<'⍳⌽
ngn



3

APL (NARS ⎕io← 0), 28 ตัวอักษร, 56 ไบต์

{60⊥{+/⍵⍳⍨10⍴'\T'}¨⍵⊂⍨⍵≠' '}

ทดสอบกับการตรวจสอบประเภท:

  q←{60⊥{+/⍵⍳⍨10⍴'\T'}¨⍵⊂⍨⍵≠' '}

  o←⎕fmt
  o q '<< <TT'
1212
~~~~
  o q '<<<TT \ TTTT'
115204
~~~~~~

ผลลัพธ์แต่ละประเภทคือตัวเลข


2

JavaScript (Node.js) , 122 114 107 106 83 ไบต์

a=>a.split` `.map(b=>[...b].map(c=>x+=c<'T'?10:c<'U',x=0)&&x).reduce((a,b)=>a*60+b)

ลองออนไลน์!

ฉันหมกมุ่นอยู่กับการทำงานของอาเรย์แบบ "functional-style" ใช้ ASCII input เท่าที่ฉันสามารถบอกได้ JS ไม่ค่อยเก่งในการรับ charcodes golfily

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


@Shaggy ดูเหมือนว่าจะใช้งานได้กับฉัน!
Skidsdev

c<'T'ทำงานแทนc=='<'
Mr. Xcoder

บันทึกอีก 1 โดยการแทนที่ด้วย&& |
ปุย

@Shaggy และประหยัดมากขึ้นโดยใช้for...ofลูป: P
ASCII เท่านั้น

2

Retina , 29 26 23 ไบต์

<
10*T
+`^(.*)¶
60*$1
T

ลองออนไลน์! ใช้การขึ้นบรรทัดใหม่ แต่ลิงก์มีส่วนหัวเพื่อใช้ช่องว่างแทนเพื่อความสะดวก แก้ไข: บันทึกแล้ว 3 ไบต์ด้วยความช่วยเหลือจาก @KevinCruijssen บันทึกอีก 3 ไบต์ด้วย @FryAmTheEggman คำอธิบาย:

<
10*T

แทนที่แต่ละรายการ<ด้วย 10 Tวิ

+`^(.*)¶
60*$1

ใช้บรรทัดแรกคูณด้วย 60 และเพิ่มบรรทัดถัดไป จากนั้นทำซ้ำจนกว่าจะมีเพียงหนึ่งบรรทัดที่เหลือ

T

นับTs

รุ่นที่เร็วกว่า 51 ไบต์:

%`^(<*)(T*).*
$.(10*$1$2
+`^(.+)¶(.+)
$.($1*60*_$2*

ลองออนไลน์! ใช้การขึ้นบรรทัดใหม่ แต่ลิงก์มีส่วนหัวเพื่อใช้ช่องว่างแทนเพื่อความสะดวก คำอธิบาย:

%`^(<*)(T*).*
$.(10*$1$2

ตรงกับแต่ละบรรทัดรายบุคคลและนับจำนวนของTs และ 10 เท่าของจำนวนของ<s สิ่งนี้จะแปลงแต่ละบรรทัดให้เป็นค่าฐาน "60 หลัก"

+`^(.+)¶(.+)
$.($1*60*_$2*

การแปลงฐาน 60 วิ่งครั้งละหนึ่งบรรทัด การคำนวณจะทำในรูปแบบทศนิยมสำหรับความเร็ว


ฉันค่อนข้างแน่ใจว่าบรรทัดที่สามนั้นอาจจะ<ปราศจาก+ก็ได้เว้นแต่ว่าฉันจะไม่เห็นกล่องแบบขอบ
Kevin Cruijssen

1
@KevinCruijssen ดียิ่งขึ้นเพราะ$&ตอนนี้เป็นตัวละครตัวหนึ่งเสมอฉันสามารถใช้ตัวอักษรเริ่มต้นประหยัดอีกสองไบต์!
Neil

ดีจัง! :) ไม่ทราบว่าสามารถทำได้โดยปริยายสำหรับอักขระเดี่ยว
Kevin Cruijssen

@KevinCruijssen ดีฉันไม่สนใจว่าตัวละครคืออะไรเพราะฉันใช้เวลาแค่ความยาว ใน Retina 1 คุณจะได้รับ_ในขณะที่ในรุ่นก่อนหน้าของการเริ่มต้นที่จะ$* Retina 1
Neil

อ่าฉันเข้าใจแล้ว รหัสเริ่มต้นของคุณทำการ<แข่งขันแบบเดี่ยวทั้งหมดและทำซ้ำความยาว 10 เท่า (จำนวนของ<การแข่งขัน) และการเปลี่ยนแปลงที่เสนอของฉันจะทำซ้ำทุก ๆ<10 ครั้งแยกกัน (ซึ่งคุณเล่นด้วย 2 ไบต์โดยใช้นัย 1 ด้วย10*) ตอนนี้ฉันเข้าใจได้ดีขึ้นว่าทำไมถึง+อยู่ที่นั่นในตอนแรก ฉันไม่รู้อะไรมากเกี่ยวกับ Retina builtins มีเพียง regexes โดยทั่วไปดังนั้นการเปลี่ยนแปลงที่เสนอของฉันเพราะฉันอ่านมันซ้ำแล้วซ้ำอีกทุก ๆ>10 ครั้ง ;)
Kevin Cruijssen

2

Bash (พร้อม sed และ dc) 50 ไบต์

sed 's/</A+/g
s/T/1+/g
s/ /60*/g
s/\\//g'|dc -ez?p

ใช้อินพุตที่คั่นด้วยช่องว่างจากstdinเอาต์พุตไปยังstdout

ลองออนไลน์!

คำอธิบาย

ใช้ sed ที่จะเปลี่ยนการป้อนข้อมูลที่มีพวงของการแข่งขันการแสดงออกปกติจนยกตัวอย่างเช่นการป้อนข้อมูลที่ได้รับการเปลี่ยนไป<<<TT \ TTTT A+A+A+1+1+60*60*1+1+1+1+จากนั้นอินพุตนี้จะถูกป้อนไปยัง dc พร้อมกับคำสั่งการดำเนินการอินพุตอย่างชัดเจน?นำหน้าด้วยz(ดันความยาวสแต็ก (0) ไปยังสแต็กเพื่อให้เรามีที่ที่จะเพิ่มการเพิ่ม) และตามด้วยp(พิมพ์)





1

ถ่าน 26 ไบต์

≔⁰θFS«≡ι ≦×⁶⁰θ<≦⁺χθT≦⊕θ»Iθ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

≔⁰θ

ล้างผลลัพธ์

FS«...»

วนซ้ำอักขระที่ป้อนเข้า คำสั่งถูกห่อในบล็อกเพื่อป้องกันไม่ให้มันจากการหาบล็อก "เริ่มต้น"

≡ι

สลับไปที่อักขระปัจจุบัน ...

 ≦×⁶⁰θ

ถ้ามันเป็นช่องว่างให้คูณผลลัพธ์ด้วย 60 ...

<≦⁺χθ

ถ้ามันเป็น<แล้วเพิ่ม 10 ผล ...

T≦⊕θ

ถ้ามันเป็นTผลลัพธ์ที่เพิ่มขึ้นแล้ว

Iθ

พิมพ์ผลลัพธ์


1

R , 98 81 ไบต์

(u=sapply(scan(,""),function(x,y=utf8ToInt(x))y%%3%*%(y%%6)))%*%60^(sum(u|1):1-1)

ลองออนไลน์!

ยาวขันเนื่องจากการแยกสตริง ขอบคุณ Giusppe สำหรับการกำจัด 16 ไบต์ที่ไม่จำเป็น

กำหนดyค่า bytecode ของอินพุต unicode และR = y("T<\") = y("𒐕𒌋𒑊")

สังเกตสิ่งนั้นR%%3 = 1,2,0และR%%6 = 1,5,0... อย่างนั้นR%%3 * R%%6 = 1,10,0!

ส่วนที่เหลือเป็นเรื่องง่าย: ผลรวมต่อคอลัมน์จากนั้นผลิตภัณฑ์ดอทที่มีพลังลดลง 60


การย้ายแอนเวิล์ดโดยใช้การลดของ Arnauld น่าจะมีความเป็นกอล์ฟมากขึ้น
JayCe

ไม่scan(,"")แยกช่องว่างโดยอัตโนมัติ
Giuseppe

1
เคล็ดลับดีกับ mods แต่! ฉันพยายามคิดออก แต่ไม่สามารถหาได้ ... และ/60สามารถแทนที่ด้วย-1นิพจน์เลขชี้กำลังสำหรับไบต์อื่นบวกกับ<-สามารถแทนที่ได้=เนื่องจากมันอยู่ในวงเล็บ
จูเซปเป้

@Giuseppe ฉันพยายาม %% 3 และมันก็มีแนวโน้มดังนั้นฉันเก็บไว้ดู ... ยังมีการใช้ผลิตภัณฑ์จุดเพียงบันทึกฉันหนึ่งไบต์เพิ่มเติม :)
Jayce

1

Ruby , 50 46 ไบต์

->a{x=0;a.bytes{|c|x+=[59*x,10,0,1][c%9%5]};x}

ลองออนไลน์!

พอร์ตพื้นฐานของคำตอบของ Arnauldปรับปรุงโดย GB สำหรับ -4 ไบต์


1
45 ไบต์ - ใช้งานจริง 47 ถ้าคุณใช้ "ไบต์" แทน "แผนที่"
GB

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

1
ไบต์อื่นออก: 46 ไบต์
GB


1

ชวา 8, 64 60 ไบต์

a->{int r=0;for(int c:a)r+=c<33?r*59:c<63?10:84/c;return r;}

-4 ไบต์ขอบคุณที่@ceilingcat

ลองออนไลน์ คำอธิบาย:

a->{            // Method with character-array parameter and integer return-type
  int r=0;      //  Result-integer, starting at 0
  for(int c:a)  //  Loop over each character `c` of the input-array
    r+=         //   Increase the result by:
       c<33?    //    Is the current character `c` a space:
        r*59    //     Increase it by 59 times itself
       :c<63?   //    Else-if it's a '<':
        10      //     Increase it by 10
       :c<85?   //    Else (it's a 'T' or '\'):
        84/c;   //     Increase it by 84 integer-divided by `c`,
                //     (which is 1 for 'T' and 0 for '\')
  return r;}    //  Return the result

0

Perl -F // -E, 39 ไบต์

$w+=/</?10:/T/?1:/ /?59*$w:0for@F;say$w

นี่เป็นการอ่านค่าที่แปลงจาก STDIN

นี่เป็นสิ่งสำคัญซึ่งเป็นโซลูชันเดียวกับที่กำหนดโดย @Arnauld โดยใช้ JavaScript


0

F #, 128 ไบต์

let s(v:string)=Seq.mapFoldBack(fun r i->i*Seq.sumBy(fun c->match c with|'<'->10|'T'->1|_->0)r,i*60)(v.Split ' ')1|>fst|>Seq.sum

ลองออนไลน์!

Ungolfed มันจะมีลักษณะเช่นนี้:

let s (v:string) =
    Seq.mapFoldBack(fun r i ->
        i * Seq.sumBy(fun c ->
            match c with
                | '<' -> 10
                | 'T' ->1
                | _ -> 0
        ) r, 
        i * 60) (v.Split ' ') 1
    |> fst
    |> Seq.sum

Seq.mapFoldBackรวมและSeq.map วนซ้ำผ่านลำดับไปข้างหลังและเธรดค่าตัวสะสมผ่านลำดับ (ในกรณีนี้Seq.foldBackSeq.mapFoldBacki )

สำหรับองค์ประกอบในแต่ละลำดับจำนวนชาวบาบิโลนคำนวณ (โดยSeq.sumByที่ตัวละครแต่ละตัวแผนที่ไปยังหมายเลขและรวมผล) iและคูณด้วยแล้วiจะถูกคูณด้วย 60 และค่านี้จะถูกส่งผ่านไปยังรายการถัดไปตามลำดับ สถานะเริ่มต้นสำหรับการสะสมคือ 1

ตัวอย่างเช่นลำดับการโทรและผลลัพธ์Seq.mapFoldBackสำหรับอินพุต<<<TT \ TTTTจะเป็น:

(TTTT, 1)     -> (4, 60)
(\, 60)       -> (0, 3600)
(<<<TT, 3600) -> (115200, 216000)

ฟังก์ชั่นจะกลับ tuple seq<int>, intของ fstฟังก์ชันส่งกลับรายการแรกใน tuple นั้นและSeq.sumไม่ข้อสรุปที่เกิดขึ้นจริง

ทำไมไม่ใช้Seq.mapiหรือคล้ายกัน?

Seq.mapiแผนที่แต่ละองค์ประกอบในลำดับและจัดทำดัชนีไปยังฟังก์ชั่นการทำแผนที่ จากตรงนั้นคุณสามารถทำได้60 ** index(ที่ไหน**คือผู้ให้บริการพลังงานใน F #)

แต่**ต้องfloatsไม่ซึ่งหมายความว่าคุณจะต้องเริ่มใช้อย่างใดอย่างหนึ่งหรือโยนค่าทั้งหมดในการทำงานเป็นints floatฟังก์ชั่นทั้งหมดจะกลับมาfloatซึ่ง (ในความคิดของฉัน) จะยุ่งเล็กน้อย

การใช้งานSeq.mapiสามารถทำได้เช่นนี้เป็นเวลา139 ไบต์ :

let f(v:string)=v.Split ' '|>Seq.rev|>Seq.mapi(fun i r->Seq.sumBy(fun c->match c with|'<'->10.0|'T'->1.0|_->0.0)r*(60.0**float i))|>Seq.sum

0

Tcl , 134 ไบต์

proc B l {regsub {\\} $l 0 l
lmap c [lreverse $l] {incr s [expr 60**([incr i]-1)*([regexp -all < $c]*10+[regexp -all T $c])]}
expr $s}

ลองออนไลน์!

ในรายการที่กลับรายการฉันวนรอบการเพิ่มผลลัพธ์ในการนับ<และT(พร้อม-allตัวเลือก regexp) และการเพิ่มค่าเป็นธรรมชาติเท่ากับกำลัง 60

รุ่นที่ถูกต้อง (ดูความคิดเห็น)


ดูเหมือนว่าฉันล้มเหลวนี้เพราะ \ ในจำนวนที่ผ่านมา ... ฉันควรมีregsub {\\} $l0 lก่อนที่จะห่วง foreach .... การ
david

0

APL (Dyalog Extended) , 18 ไบต์SBCS

ฟังก์ชันนำหน้าเงียบโดยไม่ระบุชื่อ

60⊥10⊥¨≠'<T'∘⍧¨⍤⊆⊢

ลองออนไลน์!

                  ⊢  the argument; "<<<TT \ TTTT"
       ≠             mask where different from space; [1,1,1,1,1,0,1,0,1,1,1,1]
                ⊆    enclose runs of 1; ["<<<TT","\","TTTT"]
               ⍤     on that
              ¨      for each one
             ⍧       Count the occurrences In it of the elements
            ∘        of the entire list
        '<T'         ["<","T"]; [[3,2],[0,0],[0,4]]
      ¨              for each one
   10⊥               evaluate as base-10 digits
60⊥                  evaluate as base-60 digits

0

05AB1E (ดั้งเดิม) 10 ไบต์

#Ç9%5BO60β

ลองออนไลน์!

#               # split input on spaces
 Ç              # convert each character to its codepoint
  9%            # modulo 9 (maps 𒌋 to 5, 𒐕 to 1, 𒑊 to 0)
    5B          # convert each to base 5 (5 becomes 10, 0 and 1 unchanged)
      O         # sum each column
       60β      # convert from base 60

05AB1E , 11 ไบต์

#Ç9%5B€O60β

ลองออนไลน์!

อัลกอริทึมเดียวกัน แต่ใน 05AB1E ที่ทันสมัยOไม่สามารถใช้งานได้กับรายการของ int และรายการที่ผสมกันดังนั้นเราจึงต้องการ€Oแทน

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