ค้นหา Array Runs


14

ค้นหาการวิ่งภายในอาเรย์

การวิ่งหมายถึงตัวเลขสามตัวขึ้นไปที่เพิ่มขึ้นจากครั้งก่อนด้วยขั้นตอนคงที่ ตัวอย่างเช่น [1,2,3] จะเป็นการรันด้วยขั้นตอนที่ 1 [1,3,5,7] จะเป็นการรันด้วยขั้นตอนที่ 2 และ [1,2,4,5] ไม่ใช่การเรียกใช้

เราสามารถแสดงการวิ่งเหล่านี้โดยสัญกรณ์ "i to j by s" โดยที่ฉันเป็นหมายเลขแรกของการวิ่ง j คือหมายเลขสุดท้ายของการวิ่งและ s คือขั้นตอน อย่างไรก็ตามการรันของขั้นตอนที่ 1 จะแสดงเป็น "i to j"

ดังนั้นก่อนใช้อาร์เรย์เราจะได้รับ:

  • [1,2,3] -> "1to3"

  • [1,3,5,7] -> "1to7by2"

  • [1,2,4,5] -> "1 2 4 5"

ในความท้าทายนี้คุณต้องทำเช่นนี้สำหรับอาร์เรย์ที่อาจมีการเรียกใช้หลายครั้ง

ตัวอย่างโค้ด Python พร้อมการเรียกซ้ำ:

def arr_comp_rec(a, start_index):
    # Early exit and recursion end point
    if start_index == len(a)-1:
        return str(a[-1])
    elif start_index == len(a):
        return ''

    # Keep track of first delta to compare while searching
    first_delta = a[start_index+1] - a[start_index]
    last = True
    for i in range(start_index, len(a)-1):
        delta = a[i+1] - a[i]
        if delta != first_delta:
            last = False
            break
    # If it ran through the for loop, we need to make sure it gets the last value
    if last: i += 1

    if i - start_index > 1:
        # There is more than 2 numbers between the indexes
        if first_delta == 1:
            # We don't need by if step = 1
            return "{}to{} ".format(a[start_index], a[i]) + arr_comp_rec(a, i+1)
        else:
            return "{}to{}by{} ".format(a[start_index], a[i], first_delta) + arr_comp_rec(a, i+1)
    else:
        # There is only one number we can return
        return "{} ".format(a[start_index]) + arr_comp_rec(a, i)

IO ยืดหยุ่นได้

อินพุต

Array ของ ints บวกที่เรียง (ไม่ซ้ำกัน)

เอาท์พุต

สตริงของการรันที่คั่นด้วยช่องว่างหรืออาเรย์สตริงของการรัน

ไม่จำเป็นต้องมีความโลภในทิศทางใดโดยเฉพาะ

สามารถมีช่องว่างต่อท้าย

กรณีทดสอบ

In: [1000, 1002, 1004, 1006, 1008, 1010]
Out: "1000to1010by2"

In: [1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233]
Out: "1to3 5 8 13 21 34 55 89 144 233"

In: [10, 20, 30, 40, 60]
Out: "10to40by10 60"

In: [5, 6, 8, 11, 15, 16, 17]
Out: "5 6 8 11 15to17"

In: [1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 15, 30, 45, 50, 60, 70, 80, 90, 91, 93]
Out: "1to7 9to15by2 30 45 50to90by10 91 93"

นี่คืออย่างน้อยจำนวนไบต์ที่ชนะ



2
มันจะต้องโลภจากซ้ายไปขวาใช่ไหม? (เช่น[4, 5, 6, 7, 9, 11, 13, 15]ไม่สามารถเป็นได้4to6 7to15by2?)
Jonathan Allan

1
@JanathanAllan ไม่ไม่จำเป็นต้องละโมบ
WretchedLout

ฉันคิดว่าจะไม่มีรายการที่ซ้ำกัน?
Shieru Asakoto

1
จำนวนเต็มบวกเท่านั้น @ Οurous Trailing whitespace ยอมรับได้
WretchedLout

คำตอบ:


5

เจลลี่ ,  42  40 ไบต์

-2 ต้องขอบคุณ Kevin Cruijssen (กรองสองครั้งḟ2, แทนที่แทนที่ twos ด้วยศูนย์2,0y)

ŒṖIE×LƲ€ḟ2SƊÞṪµ.ịU,Iḟ1ƊQ€Fż“to“by”ṁṖƊ$)K

โปรแกรมเต็มรูปแบบการพิมพ์ผล
(เป็น monadic เชื่อมโยงรายการที่มีส่วนผสมของจำนวนเต็มและตัวละครจะได้รับผล)

ลองออนไลน์!
(ไม่มีประสิทธิภาพสำหรับกรณีทดสอบที่ใหญ่ที่สุดที่จะทำให้เสร็จภายใน 60 วินาทีดังนั้นฉันจึงลบออก[1,2,3,4] )

อย่างไร?

ŒṖIE×LƲ€ḟ2SƊÞṪµ.ịU,Iḟ1ƊQ€Fż“to“by”ṁṖƊ$)K - Main Link: list of numbers
ŒṖ                                       - all partitions
           ƊÞ                            - sort by last three links as a monad:
      Ʋ€                                 -   last four links as a monad for €ach:
  I                                      -     incremental differences (of the part)
   E                                     -     all equal?
     L                                   -     length (of the part)
    ×                                    -     multiply
        ḟ2                               -   filter discard twos
          S                              -   sum
             Ṫ                           - tail (gets us the desired partition of the input)
              µ                       )  - perform this monadic chain for €ach:
               .                         -   literal 0.5
                ị                        -   index into (the part) - getting [tail,head]
                 U                       -   upend - getting [head,tail]
                      Ɗ                  -   last three links as a monad:
                   I                     -     incremental differences (of the part)
                     1                   -     literal one
                    ḟ                    -     filter discard (remove the ones)
                  ,                      -   pair -> [[head,tail],[deltasWithoutOnes]]
                       Q€                -   de-duplicate €ach -> [[head,tail],[delta]] or [[head,tail],[]] or [[loneValue],[]]
                         F               -   flatten -> [head,tail,delta] or [head,tail] or [loneValue]
                                     $   -   last two links as a monad:
                                    Ɗ    -     last three links as a monad:
                           “to“by”       -       literal list [['t', 'o'], ['b', 'y']]
                                   Ṗ     -       pop (get flattened result without rightmost entry)
                                  ṁ      -       mould ["to","by"] like that (i.e. ["to","by"] or ["to"] or [])
                         ż               -     zip together      
                                       K - join with spaces
                                         - implicit print

ไม่ควรใช้ 'by' หาก step = 1
WretchedLout

โอ้ Gawwwd: p ขอบคุณสำหรับหัวขึ้น!
Jonathan Allan

2,0ySƲÞสามารถเล่นกอล์ฟได้ถึงḟ2SƊÞ2 ไบต์
Kevin Cruijssen

@KevinCruijssen จริงมากกอล์ฟดีขอบคุณ
Jonathan Allan

1
@KevinCruijssen FYI ฉันจำได้ว่าทำไมถึงมีอยู่ในตอนนี้ - แต่เดิมฉันพยายามเรียงลำดับผลิตภัณฑ์Pแทนที่จะเป็นผลรวมSและต้องการศูนย์
Jonathan Allan

6

Swift, 246 ไบต์

func f(_ a:[Int]){
var c=a.count,m=a+a,z=0,r:String=""
for i in 1..<c{m[i]-=a[i-1];if m[i]==m[i-1]{m[i-1]=0}};m[0]=1
for i in 0..<c{if m[i]==0 {z=1}else if z==0{r+=" \(a[i])"}else{r+="to\(a[i])"+(m[i]>1 ? "by\(m[i])":"");z=0;m[i+1]=1}}
print(r)
}

ลองออนไลน์!


4
ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! คำตอบแรกที่ดีมาก ฉันหวังว่าคุณจะอยู่รอบ ๆ เพราะชุมชน Swift ที่นี่เป็น ... เล็กมาก!
Mr. Xcoder



3

JavaScript (ES6), 129 ไบต์

ส่งคืนอาร์เรย์ของสตริง

a=>(a.map((n,i)=>n+[n-a[i+1]||''])+'').replace(/(\d+)(-\d+)(?:,\d+\2)+,(\d+)/g,(_,a,b,c)=>a+'to'+(~b?c+'by'+-b:c)).split(/-\d+,/)

ลองออนไลน์!

อย่างไร?

ขั้นตอนที่ 1

อันดับแรกเราต่อท้ายแต่ละหมายเลขคำต่อท้ายประกอบด้วยส่วนนำ'-'ตามด้วยความแตกต่างกับหมายเลขถัดไปยกเว้นสำหรับรายการสุดท้ายที่ไม่มีการเปลี่ยนแปลง อาร์เรย์ใหม่นี้ถูกบังคับให้ใช้สตริง

(a.map((n, i) => n + [n - a[i + 1] || '']) + '')

ตัวอย่าง:

Input : [ 1, 2, 3, 5, 9, 11, 13, 20 ]
Output: "1-1,2-1,3-2,5-4,9-2,11-2,13-7,20"

ขั้นตอนที่ 2

เราระบุการทำงานทั้งหมดในสตริงผลลัพธ์และแทนที่ด้วยสัญกรณ์ที่เหมาะสม

.replace(
  /(\d+)(-\d+)(?:,\d+\2)+,(\d+)/g,
  (_, a, b, c) => a + 'to' + (~b ? c + 'by' + -b : c)
)

ตัวอย่าง:

Input : "1-1,2-1,3-2,5-4,9-2,11-2,13-7,20"
Output: "1to3-2,5-4,9to13by2-7,20"

ขั้นตอนที่ # 3

ในที่สุดเราก็แยกสตริงที่ส่วนต่อท้ายที่เหลือรวมถึงคอมม่าต่อท้าย

.split(/-\d+,/)

ตัวอย่าง:

Input : "1to3-2,5-4,9to13by2-7,20"
Output: [ '1to3', '5', '9to13by2', '20' ]

2

Ruby , 125 118 ไบต์

->a{i=y=0;a.chunk{|x|-y+y=x}.map{|z,w|2-i<(s=w.size)?"#{w[i*s]}to#{w[~i=0]}"+"by#{z}"*(z<=>1)+' ':' '*i+w*' '*i=1}*''}

ลองออนไลน์!

คำอธิบาย

Ruby Enumerable มีchunkวิธีการที่มีประโยชน์ซึ่งทำสิ่งที่เราต้องการได้อย่างแม่นยำ - จัดกลุ่มรายการตามการดำเนินการติดต่อที่มีค่าส่งคืนเดียวกันจากบล็อกในกรณีของเรา - ความแตกต่างระหว่างกระแส ( x) และก่อนหน้า (y )

ข้อแม้คือกลยุทธ์ดังกล่าวจะไม่จับองค์ประกอบแรกของการวิ่งเช่นที่นี่มีเพียงสององค์ประกอบสุดท้ายเท่านั้นที่ถูกจัดกลุ่มเข้าด้วยกัน:

Input: [5, 6, 8, 11, 15, 16, 17]
Grouped: [[5, [5]], [1, [6]], [2, [8]], [3, [11]], [4, [15]], [1, [16, 17]]]

ดังนั้นในขณะที่การแมปไปยังสตริงที่จัดรูปแบบถูกต้องเมื่อเราพบการทำงานที่มีศักยภาพใหม่ (อันที่มี> 1 รายการ) เราจะต้องติดตามว่ารายการก่อนหน้านี้เป็นรายการเดียว ( i=1) หรือถูกใช้แล้วในการดำเนินการอื่น ( i=0) หากมีรายการเดียวที่ไม่ได้ใช้มันจะกลายเป็นจุดเริ่มต้นของการรันและลดขนาดของชิ้นย่อยจาก 3 เป็น 2


2

R , 180 175 ไบต์

r=rle(c(0,diff(a<-scan())));for(j in 1:sum(1|r$l)){l=r$l[j];v=r$v[j];i=T+l-1;cat("if"(l>2-F,paste0(a[T][!F],"to",a[i],"by"[v>1],v[v>1]," "),c("",a[T:i])[-3^F]));T=i+1;F=l<3-F}

ลองออนไลน์!

ตามหลักการแล้วนี่คือพอร์ตของคำตอบ Rubyของฉันแม้ว่าจะเห็นได้ชัดว่าเทคนิคแตกต่างกันเล็กน้อย

5 ไบต์บันทึกโดย JayCe


ฉันต้องการrleทำอะไรsum(1|x)length(x)
ซัก

ที่จริงคุณมีเพียง 1 cat ถึง 175 ไบต์: TIO
JayCe

โอ้เยี่ยมมากขอบคุณ!
Kirill L.

2

R , 238 217 ไบต์

ขอบคุณ @digEmAll สำหรับ -19 ไบต์

function(v,R=rle(diff(v)),L=R$l,S=sum(L|1),Y=0)if(!S)cat(v)else for(i in 1:S){D=R$v[i]
N=L[i]-F
if(N>1){N=N+1
cat(v[Y+1],'to',v[Y+N],'by'[D>1],D[D>1],' ',sep='')
F=1}else{N=N+(i==S)
if(N>0)cat(v[Y+1:N],'')
F=0}
Y=Y+N}

ลองออนไลน์!


ฉันใช้Fแทนnเพราะมันถูกเตรียมใช้งานแล้ว0ซึ่งควรบันทึกสองสามไบต์
จูเซปเป้

อันนี้น่าผิดหวัง คุณเกือบมีโดยเพียงแค่ใช้split, และdiff rleแต่น่าเสียดายที่การค้นหาโลภวิ่งได้จำนวนมาก
J.Doe

214 ไบต์เกือบจะมีปัญหาเดียวก็คือระยะห่าง uncorrect บางครั้ง ...
digEmAll

นั่น'by'[D>1]เป็นเคล็ดลับที่ดี
J.Doe

ดูเหมือนว่าจะทำงานได้ดี217 ไบต์
digEmAll




1

Python 2 , 170 166 ไบต์

def f(a):
 j=len(a)
 while j>2:
	l,r=a[:j:j-1];s=(r-l)/~-j
	if a[:j]==range(l,r+1,s):return[`l`+'to%d'%r+'by%d'%s*(s>1)]+f(a[j:])
	j-=1
 return a and[`a[0]`]+f(a[1:])

ลองออนไลน์!


ฉันไม่แน่ใจว่ารูปแบบผลลัพธ์นี้ถูกต้องหรือไม่ การวิ่งทั้งหมดควรเป็นสตริงหรือไม่?
Erik the Outgolfer

@EriktheOutgolfer Fixed
TFeld


1

gvm (กระทำ2612106 ) ไบต์รหัส 108 ไบต์

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

hexdump:

> hexdump -C findruns.bin
00000000  e1 0a 00 10 00 e1 0b 00  ff c8 92 00 f4 f7 10 00  |................|
00000010  01 b0 20 03 00 ff 0a 01  a2 01 c8 92 00 f4 01 c0  |.. .............|
00000020  03 00 ff 0a 02 d0 72 01  0a 03 c8 92 00 f4 05 b0  |......r.........|
00000030  20 a2 02 c0 02 02 6a 03  8b 00 ff f6 06 b0 20 a2  | .....j....... .|
00000040  02 f4 ce 0a 02 c8 92 00  f6 07 6a 03 8b 00 ff f6  |..........j.....|
00000050  f2 b9 66 01 a2 02 00 01  8a 03 f6 05 b9 69 01 a2  |..f..........i..|
00000060  03 92 00 f4 ac c0 74 6f  00 62 79 00              |......to.by.|
0000006c

ทดสอบการทำงาน:

> echo -e "7\n5\n6\n8\n11\n15\n16\n17\n" | ./gvm findruns.bin
5 6 8 11 15to17
> echo -e "20\n1\n2\n3\n4\n5\n6\n7\n9\n11\n13\n15\n30\n45\n50\n60\n70\n80\n90\n91\n93\n" | ./gvm findruns.bin
1to7 9to15by2 30 45 50to90by10 91 93

รวบรวมจากนี้ด้วยตนเอง:

0100  e1        rud                     ; read length of array
0101  0a 00     sta     $00             ; -> to $00
0103  10 00     ldx     #$00            ; loop counter
                  readloop:
0105  e1        rud                     ; read unsigned number
0106  0b 00 ff  sta     $ff00,x         ; store in array at ff00
0109  c8        inx                     ; next index
010a  92 00     cpx     $00             ; length reached?
010c  f4 f7     bne     readloop        ; no -> read next number
010e  10 00     ldx     #$00            ; loop counter
0110  01                                ; 'lda $20b0', to skip next instruction
                  runloop:
0111  b0 20     wch     #' '            ; write space character
0113  03 00 ff  lda     $ff00,x         ; load next number from array
0116  0a 01     sta     $01             ; -> to $01
0118  a2 01     wud     $01             ; and output
011a  c8        inx                     ; next index
011b  92 00     cpx     $00             ; length reached?
011d  f4 01     bne     compare         ; if not calculate difference
011f  c0        hlt                     ; done
                  compare:
0120  03 00 ff  lda     $ff00,x         ; load next number from array
0123  0a 02     sta     $02             ; -> to $01
0125  d0        sec                     ; calculate ...
0126  72 01     sbc     $01             ; ... difference ...
0128  0a 03     sta     $03             ; ... to $03
012a  c8        inx                     ; next index
012b  92 00     cpx     $00             ; length reached?
012d  f4 05     bne     checkrun        ; if not check whether we have a run
012f  b0 20     wch     #' '            ; output space
0131  a2 02     wud     $02             ; output number
0133  c0        hlt                     ; done
                  checkrun:
0134  02 02     lda     $02             ; calculate next ...
0136  6a 03     adc     $03             ; ... expected number in run
0138  8b 00 ff  cmp     $ff00,x         ; compare with real next number
013b  f6 06     beq     haverun         ; ok -> found a run
013d  b0 20     wch     #' '            ; otherwise output space ...
013f  a2 02     wud     $02             ; ... and number
0141  f4 ce     bne     runloop         ; and repeat searching for runs
                  haverun:
0143  0a 02     sta     $02             ; store number to $02
0145  c8        inx                     ; next index
0146  92 00     cpx     $00             ; length reached?
0148  f6 07     beq     outputrun       ; yes -> output this run
014a  6a 03     adc     $03             ; calculate next expected number
014c  8b 00 ff  cmp     $ff00,x         ; compare with real next number
014f  f6 f2     beq     haverun         ; ok -> continue parsing run
                  outputrun:
0151  b9 66 01  wtx     str_to          ; write "to"
0154  a2 02     wud     $02             ; write end number of run
0156  00 01     lda     #$01            ; compare #1 with ...
0158  8a 03     cmp     $03             ; ... step size
015a  f6 05     beq     skip_by         ; equal, then skip output of "by"
015c  b9 69 01  wtx     str_by          ; output "by"
015f  a2 03     wud     $03             ; output step size
                  skip_by:
0161  92 00     cpx     $00             ; length of array reached?
0163  f4 ac     bne     runloop         ; no -> repeat searching for runs
0165  c0        hlt                     ; done
                  str_to:
0166  74 6f 00                          ; "to"
                  str_by:
0169  62 79 00                          ; "by"
016c

1

05AB1E (เดิม) , 49 50 ไบต์

.œʒε¥Ë}P}Σ€g2KO>}¤εD©g≠i¬s¤„toý¬®¥0èDU≠i„byX««]˜ðý

นานเกินไป แต่ฉันดีใจที่มันใช้งานได้ ความท้าทายนี้ยากกว่าที่คิดดูสิ .. สามารถเล่นกอล์ฟได้อย่างไม่ต้องสงสัยเลย
Σ€g2KO>}¤เป็นท่าเรือ2,0ySƲÞṪ จาก@JonathanAllan 's คำตอบวุ้น (ขอบคุณ!)

ลองออนไลน์(หมายเหตุ: หมดเวลาสำหรับกรณีทดสอบขนาดใหญ่)

+1 byte เป็นการแก้ไขข้อผิดพลาดเพราะ 0จะถูกวางที่ตำแหน่งต่อท้ายเสมอเมื่อเรียงลำดับ

คำอธิบาย:

                       # Get all partions of the (implicit) input-list
                         #  i.e. [1,2,3,11,18,20,22,24,32,33,34]
                         #   → [[[1],[2],[3],[11],[18],[20],[22],[24],[32],[33],[34]],
                         #      [[1],[2],[3],[11],[18],[20],[22],[24],[32],[33,34]],
                         #      [[1],[2],[3],[11],[18],[20],[22],[24],[32,33],[34]],
                         #      ...]
  ʒ     }                # Filter this list by:
   ε  }                  #  Map the current sub-list by:
    ¥Ë                   #   Take the deltas, and check if all are equal
                         #    i.e. [1,2,3] → [1,1] → 1
                         #    i.e. [1,2,3,11] → [1,1,8] → 0
       P                 #  Check if all sub-list have equal deltas
  Σ      }               # Now that we've filtered the list, sort it by:
   g                    #  Take the length of each sub-list
                         #   i.e. [[1,2,3],[11,18],[20,22,24],[32,33],[34]]
                         #    → [3,2,3,2,1]
                         #   i.e. [[1,2,3],[11],[18,20,22,24],[32,33,34]]
                         #    → [3,1,4,3]
     2K                  #  Remove all 2s
                         #   i.e. [3,2,3,2,1] → ['3','3','1']
       O                 #  And take the sum
                         #   i.e. ['3','3','1'] → 7
                         #   i.e. [3,1,4,3] → 11
        >                #  And increase the sum by 1 (0 is always trailing when sorting)
          ¤              # And then take the last item of this sorted list
                         #  i.e. for input [1,2,3,11,18,20,22,24,32,33,34]
                         #   → [[1,2,3],[11],[18,20,22,24],[32,33,34]]
  ε                      # Now map each of the sub-lists to:
   D©                    #  Save the current sub-list in the register
     gi                 #  If its length is not 1:
                         #    i.e. [11] → 1 → 0 (falsey)
                         #    i.e. [18,20,22,24] → 4 → 1 (truthy)
        ¬s¤              #   Take the head and tail of the sub-list
                         #    i.e. [18,20,22,24] → 18 and 24
           toý          #   And join them with "to"
                         #    i.e. 18 and 24 → ['18to24', '18to20to22to24']
               ¬         #   (head to remove some access waste we no longer need)
                         #    i.e. ['18to24', '18to20to22to24'] → '18to24'
        ®                #   Get the sub-list from the register again
         ¥               #   Take its deltas
                         #    i.e. [18,20,22,24] → [2,2,2]
          0è             #   Get the first item (should all be the same delta)
                         #    i.e. [2,2,2] → 2
            DU           #   Save it in variable `X`
              i         #   If the delta is not 1:
                         #     i.e. 2 → 1 (truthy)
                byX«    #    Merge "by" with `X`
                         #     i.e. 2 → 'by2'
                     «   #    And merge it with the earlier "#to#"
                         #     i.e. '18to24' and 'by2' → '18to24by2'
                      ]  # Close the mapping and both if-statements
˜                        # Flatten the list
                         #  i.e. ['1to3',[11],'18to24by2','32to34']
                         #   → ['1to3',11,'18to24by2','32to34']
 ðý                      # And join by spaces (which we implicitly output as result)
                         #  i.e. ['1to3',11,'18to24by2','32to34']
                         #   → '1to3 11 18to24by2 32to34'

0

Perl 5 , 154 ไบต์

{my(@r,$r);@r&&(@$r<2||$$r[1]-$$r[0]==$_-$$r[-1])?push@$r,$_:push@r,$r=[$_]for@_;join" ",map@$_<3?@$_:("$$_[0]to$$_[-1]by".($$_[1]-$$_[0]))=~s/by1$//r,@r}

เหมือนกับช่องว่างบรรทัดใหม่ #comments และsub by:

sub by {
  my(@r,$r);
  @r &&                               # if at least one run candidate exists and...
   ( @$r<2                            # ...just one elem so far
     || $$r[1]-$$r[0] == $_-$$r[-1] ) # ...or diff is same
    ? push @$r, $_                    # then add elem to curr. run candidate
    : push @r, $r=[$_]                # else start new run cand. with curr elem
        for @_;
  join " ",
    map @$_<3                                         # is it a run?
    ? @$_                                             # no, just output the numbers
    : ("$$_[0]to$$_[-1]by".($$_[1]-$$_[0]))=~s/by1$//r, # yes, make run, delete by1
    @r                                                # loop run candidates
}

ลองออนไลน์!

... สำหรับการสอบผ่านจาก OP


0

เรติน่า 0.8.2 , 77 ไบต์

\d+
$*
(1+)(?= \1(1+))
$1:$2
1:(1+) (1+:\1 )+(1+)
1to$3by$1
:1+|by1\b

1+
$.&

ลองออนไลน์! ลิงก์มีกรณีทดสอบ คำอธิบาย:

\d+
$*

แปลงเป็นเอก

(1+)(?= \1(1+))
$1:$2

คำนวณความแตกต่างติดต่อกัน

1:(1+) (1+:\1 )+(1+)
1to$3by$1

แปลงทำงานเป็นto...byไวยากรณ์

:1+|by1\b

by1นำความแตกต่างและเผล่

1+
$.&

แปลงเป็นทศนิยม

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