ยุบจำนวนเต็มต่อเนื่อง


22

ที่เกี่ยวข้อง: บอกฉันว่าฉันต้องทำปัญหาคณิตศาสตร์มากแค่ไหน!

ท้าทาย

ได้รับในเชิงบวกอย่างเคร่งครัดขึ้นอย่างเคร่งครัด L รายการจำนวนเต็มและ 3 ความยาว≤ N ≤ของ L จำนวนเต็มแทนที่จำนวนเต็มกลางของ L's จำนวนเต็มวิ่งติดต่อกันของความยาว≥ N -กับขีดเดียว

กฎระเบียบ

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

ตัวอย่างข้อมูล

L = 3 5 6 7 8 10 11 12 14 16 17 18 19 20 21 22 24ตัวอย่างเหล่านี้ใช้

N = 33 5 - 8 10 - 12 14 16 - 22 24

N = 43 5 - 8 10 11 12 14 16 - 22 24

N = 53 5 6 7 8 10 11 12 14 16 - 22 24

N = 83 5 6 7 8 10 11 12 14 16 17 18 19 20 21 22 24

จัดรูปแบบตัวอย่าง

สำหรับอินพุต
L = [3,5,6,7,8,10,11,12,14,16,17,18,19,20,21,22,24]และN = 3
บรรทัดด้านล่างทั้งหมดเป็นตัวอย่างของการตอบกลับที่ถูกต้องทั้งในรายการจริงและเป็นสตริง:

[3,5,"-",8,10,"-",12,14,16,"-",22,24]
[3,5,-,8,10,-,12,14,16,-,22,24]
[3,5-8,10-12,14,16-22,24]
3,5-8,10-12,14,16-22,24

เช่นเดียวกับรูปแบบรายการอื่น ๆ เช่น{1 2 3}และ(1; 2; 3)อื่น ๆ มีข้อสงสัย? ถาม!


จำเป็นต้องใช้-หรือเราอนุญาตให้ใช้สัญลักษณ์อื่นหรือไม่?
ไมล์

@miles สัญลักษณ์ที่แตกต่างกันจะช่วยให้คุณประหยัดไบต์?
อดัม

ฉันกำลังคิดที่จะใช้อินฟินิตี้_เพื่อที่ฉันจะได้สามารถใช้งานอาร์เรย์ตัวเลขในเจได้
ไมล์

@miles อาใช่ทำไมคุณไม่ไปข้างหน้าและทำ แต่ทำไม่ได้เกี่ยวกับเรื่องนี้และถ้าคุณสามารถจะใส่ใจเขียน (ผมถือว่านานมาก) '-'วิธีการบรรจุกล่องด้วย คุณอาจสามารถทำให้ทุกอย่างเป็นระเบียบก่อนที่จะใส่เครื่องหมายขีดกลางได้หรือไม่
Adám

ต่อไปนี้ถูกต้องหรือไม่ [3,5,-8,10,-12,14,16,-22,24](นี้น่าจะเป็นรูปแบบที่เหมาะสมที่สุดในแง่ของชนิด)
รั่วนูน

คำตอบ:


7

Python 2 , 132 115 ไบต์

-17 ไบต์ขอบคุณ Leaky Nun

x,n=input()
o=[]
i=1
while x:
 t=x[0]
 while[t+i]==x[i:i+1]:i+=1
 o+=[[t,'-',t+i-1],x[:i]][i<n];x=x[i:];i=1
print o

ลองออนไลน์!



จะwhile t+i==x[i]:ทำงานอย่างไร หรือฉันกำลังพลาดอะไรอยู่?
Zacharý

@ Zacharýมันจะพังถ้าiสูงกว่าขนาดของx
Rod

6

เยลลี่ ,  26 25  23 ไบต์

-2 ไบต์ขอบคุณ Erik the Outgolfer (โดยการนำคำสั่ง if ไปยังลิงก์หลัก)

Ḣ;Ṫj”-
IỊ¬1;œṗ⁸¹ÇL<¥?€F

ลิงก์ dyadic ส่งคืนรายการใน[3,5,"-",8,10,"-",12,14,16,"-",22,24]รูปแบบ

ลองออนไลน์! (ส่วนท้ายคั่นด้วยช่องว่างเพื่อพิมพ์รูปแบบตัวอย่างข้อมูล)

อย่างไร?

Ḣ;Ṫj”- - Link 1, format a run: list R
Ḣ      -     head
  Ṫ    -     tail
 ;     -     concatenate
    ”- -     literal '-'
   j   -     join

IỊ¬1;œṗ⁸¹ÇL<¥?€F - Main link: list L, number N
I                - incremental differences
 Ị               - insignificant? (<=1)
  ¬              - not
   1;            - prepend a 1
       ⁸         - chain's left argument, L
     œṗ          - partition (L) at truthy indexes
              €  - for €ach row, R, in L:
             ?   -   if:
            ¥    -   condition: last two links as a dyad:
          L      -     length of R
           <     -     is less than N?
        ¹        -   then: identity - do nothing, yields R
         Ç       -   else: call the last link (1) as a monad with argument  R
               F - flatten into a single list

ลิงค์ monadic
Leun Nun

เฮ้และอีกหนึ่ง "พิเศษ" ในตอนนั้น
Jonathan Allan


สิ่งที่ดีขอบคุณ @EriktheOutgolfer!
Jonathan Allan

4

Pyth, 23 ไบต์

sm?<ldvzd[hd\-ed).ga=hZ

ลองออนไลน์

มันทำงานอย่างไร

sm?<ldvzd[hd\-ed).ga=hZkQ

                        Q    autoinitialized to eval(input())
                 .g          group by k ↦
                    =hZ          Z += 1, returning new value (Z is autoinitialized to 0)
                   a   k         absolute difference with k
 m                           map d ↦
  ?                              if
    ld                               length of d
   <  vz                             less than eval(z) (z is autoinitialized to input())
        d                        then d
         [hd\-ed)                else [d[0], '-', d[-1]]
s                            concatenate

3

Japt , 24 ไบต์

óÈÄ¥Yîl ¨V?Zv +'-+Zo :Z

ลองออนไลน์!

คำอธิบาย

óÈ   Ä ¥ YÃ ®   l ¨ V?Zv +'-+Zo :Z
óXY{X+1==Y} mZ{Zl >=V?Zv +'-+Zo :Z}   Ungolfed
                                      Implicit: U = input array, V = input integer
óXY{      }                           Group U into runs such that for each pair X, Y:
    X+1==Y                              Y is exactly 1 more than X.
            mZ{                   }   Map each run Z to:
               Zl >=V?                  If Z has at least V items:
                      Zv     Zo           Z.unshift() and Z.pop() (the first and last items)
                         +'-+             joined with a hyphen.
                                :       Otherwise:
                                 Z        just Z.
                                      Implicit: output result of last expression



1

PHP 7, 137 136 134 117 110 108 ไบต์

for($a=$argv,$i=2;$n=$a[$i++];$k<$a[1]||array_splice($a,$i,$k-2,"-"))for($k=print"$n ";$a[$i+$k]-++$k==$n;);

นำLมาจากการโต้แย้งแรกรายการองค์ประกอบหลังจากนั้น ทำงานด้วย-nrหรือลองออนไลน์

แทนที่$L=($a=$argv)ด้วย$a=$argv,$L=(+1 ไบต์) สำหรับ PHP <7

ทำให้พังถล่ม

for($a=$argv,$i=2;              # import input
    $n=$a[$i++];                # loop $n through list elements
    $k<$a[1]||                      # 3. if streak length ($k) is >=L ($a[1])
        array_splice($a,$i,$k-2,"-")    # then replace with "-"
)
for($k=print"$n ";                  # 1. print element and space
    $a[$i+$k]-++$k==$n;);           # 2. find consecutive numbers

1

เรติน่า 101 ไบต์

\d+
$*
\b(1+) (?=1\1\b)
$1X
T`X` `\b((X)|1)+\b(?=.*¶(?<-2>1)+(?(2)(?!))11)
T`X`-
-1+(?=-)|¶1+

1+
$.&

ลองออนไลน์! รับรายการที่คั่นด้วยช่องว่างLในบรรทัดแรกและจำนวนเต็มNในบรรทัดที่สอง คำอธิบาย: ขั้นตอนแรกจะแปลงอินพุตให้เป็นนารี Xขั้นตอนที่สองการเปลี่ยนแปลงช่องว่างระหว่างจำนวนเต็มติดต่อกันนั้น ขั้นตอนที่สามจะค้นหาจำนวนเต็มที่ต่อเนื่องซึ่งมีความยาวน้อยกว่าNและเปลี่ยนXกลับเป็นช่องว่าง สเตจที่สี่เปลี่ยนXs เป็น-(นี่คือ 3 ไบต์ที่สั้นกว่าการใช้-s ในตอนแรก) สเตจที่ห้าจะลบจำนวนเต็มทั้งหมดที่ยังคงอยู่ในระหว่างการวิ่งเช่นเดียวกับNในขณะที่สเตจสุดท้ายแปลงกลับเป็นทศนิยม



1

J , 40 ไบต์

;@((](,_,{:)/)^:(<:#)&.>]<;.1~1,1<}.-}:)

ลองออนไลน์!

ใช้แทน_-

คำอธิบาย

;@((](,_,{:)/)^:(<:#)&.>]<;.1~1,1<}.-}:)  Input: integer N (LHS), array L (RHS)
                                  }.      Behead L
                                     }:   Curtail L
                                    -     Subtract elementwise to get the increments
                                1<        Test if greater than 1
                              1,          Prepend a 1
                        ]                 Get L
                         <;.1~            Partition L into boxes using the previous array
                     & >                  Operate on each box (partition) with N
              ^:                            If
                   #                          The length of the partition
                 <:                           Is greater than or equal to N
   (](     )/)                                Reduce (right-to-left) it using
         {:                                     Tail
       _,                                       Prepend _
      ,                                         Append to LHS
                     &.>                    Box the result
;@                                        Raze - join the contents in each box

0

เยลลี่39 37 36 ไบต์

IỊṣ0;€1ṁ@
ÇL€<Ɠ¬TịÇḊ€Ṗ€F;€”-FyµŒgQ€F

ลองออนไลน์

รับอาร์เรย์ผ่านอาร์กิวเมนต์และจำนวนเต็มผ่าน STDIN ลิงก์ TIO ใช้ส่วนท้ายÇGดังนั้นผลลัพธ์จะถูกคั่นด้วยช่องว่าง

อย่างไร? (อาร์เรย์: aจำนวนเต็ม: n)

(`f`)
IỊṣ0;€1ṁ@
I          Deltas of `a`
 Ị         Insignificant (x -> abs(x)<=1) applied to each element
  ṣ0       Split at occurrences of `0`.
    ;€1    Append `1` to each element
       ṁ@  `a` shaped like that
ÇL€<Ɠ¬TịÇḊ€Ṗ€F;€”-FyµŒgQ€F
Ç                            `f`
 L€                          Length of each element
   <Ɠ                        x -> x < n applied to each element
     ¬                       Logical not of each element (because Jelly doesn't have <= nor >= atoms)
      T                      Nonzero indexes
       ịÇ                    Index `f` at those indexes
         Ḋ€Ṗ€                x -> x[1:-1] applied to each element
             F               Flatten
              ;€”-           Append a hyphen to each element
                  F          Flatten
                   y         Translate (replaces all elements to be deleted with a hyphen)
                    µ        Start a new monadic link
                     Œg      Group runs of equal elements
                       Q€    Uniquify each element (make runs of hyphens one hypen)
                         F   Flatten, yet again.

ฉันเดาว่าฉันล้มลง ... แบนลงบนอันนี้


0

JavaScript (ES6), 126 119 ไบต์

(e,c)=>{for(i=0,R='';i<e.length;R+=(R&&',')+(u-m>=c?m+'-'+--u:e.slice(z,i))){m=u=e[i],z=i;while(e[++i]==++u);}return R}

ฟังก์ชั่นที่ไม่ระบุชื่อ รับอินพุตตามลำดับArray L, Integer Nและส่งคืนผลลัพธ์เป็นสตริงที่คั่นด้วยเครื่องหมายจุลภาค


e=>c=>ใช้ความดีความชอบในการบันทึกไบต์
TheLethalCoder

0

Dyalog APL v16.0, 82 80 78 76 75 65 62 62 ไบต์

{S/⍨1,⍨2≠/S←'-'@(⍸⊃∨/(-0,⍳⍺-3)⌽¨⊂(⍴⍵)↑∧/¨(⍺-1),/¯1⌽1=-2-/⍵)⊢⍵}

ว้าวนี่คือ ... ไม่ดี อาจมีวิธีแก้ปัญหาที่สั้นกว่ามากกับ stencil

ลองออนไลน์!

ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ!


ใช่แล้วมันเป็นอย่างไร
Zacharý

ขออภัยสถานที่ผิด
อดัม

^ คุณหมายถึงอะไร
Zacharý

ความคิดเห็นของฉันขึ้นอยู่กับความท้าทายที่แตกต่าง
Adám

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