연속 정수 축소


22

관련 : 몇 가지 수학 문제가 있는지 알려주세요!

도전

엄격하게 양의 오름차순 정수 목록 L과 정수 3 ≤ N ≤ 길이 L이 주어지면 길이 ≥ N 인 L의 연속 정수 런의 중간 정수를 단일 대시로 바꾸십시오 -.

규칙

  • 수평 공백은 관련이 없습니다.
  • 언어 기본 목록 형식의 소개 자, 구분 기호 및 종료 문자를 선택적으로 유지할 수 있습니다. 아래의 형식 예를 참조하십시오 .

데이터 예

이 모든 예제는를 사용 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

N = 4 → 3 5 - 8 10 11 12 14 16 - 22 24

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

N = 8 → 3 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 다른 기호로 바이트를 절약 할 수 있습니까?
— Adám

_J에서 숫자 배열을 계속 사용할 수 있도록 무한대를 사용할 생각입니다.
— miles

@miles 아, 그래, 왜 그렇게하지 않습니까?하지만 그것에 대해 신경 쓰지 말고 귀찮게 할 수 있다면 (더 긴 것으로 가정) 박스형 솔루션을로 작성하십시오 '-'. 대시를 삽입하기 전에 모든 것을 문자열로 묶을 수도 있습니다.
— Adám

다음이 유효합니까? [3,5,-8,10,-12,14,16,-22,24](이것은 유형면에서 가장 적합한 형식 인 것 같습니다)
— Leaky Nun

답변:



6

젤리 ,  26 25  23 바이트

Outgolfer Erik 덕분에 -2 바이트 (if 문을 메인 링크로 가져옴)

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

[3,5,"-",8,10,"-",12,14,16,"-",22,24]형식으로 목록을 리턴하는 2 진 링크 .

온라인으로 사용해보십시오! 바닥 글은 데이터 예제 형식을 인쇄하기 위해 공백으로 구분됩니다.

방법?

Ḣ;Ṫ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

모나 딕 링크?
— Leaky Nun

그와 "특별한"하나.
— Jonathan Allan

물건을 약간 재정렬 하면 -2에 도움이됩니다.
— Outgolfer Erik

감사합니다 @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


2

APL, 38 바이트

{∊⍺{⍺>≢⍵:⍵⋄2⌽'-',2↑¯1⌽⍵}¨⍵⊂⍨1,1≠2-⍨/⍵}

1

PHP 7, 137136134117110108 바이트

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=PHP <7 (1 바이트).

고장

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. 세 번째 단계는 길이가보다 짧은 연속 정수의 런을 찾아 다시 s를 공백으로 N변경 X합니다. 네 번째 단계는 Xs를 변경합니다 -( -처음에는 s를 사용하는 것보다 3 바이트가 더 짧습니다 ). 다섯 번째 단계는 실행 도중에도 남아있는 모든 정수를 삭제 N하고 마지막 단계는 다시 10 진수로 변환합니다.



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

자바 스크립트 (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 바이트

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

와우, 이것은 나쁘다. 스텐실에는 훨씬 짧은 솔루션이있을 것입니다.

온라인으로 사용해보십시오!

골프 제안을 환영합니다!


예, 어때요?
— Zacharý

죄송합니다. 잘못된 장소입니다.
— Adám

^ 무슨 뜻인가요?
— Zacharý

내 의견은 다른 도전에 기초했다.
— Adám

Adám 솔루션이있는 경우 v16 내장 기능을 사용한다고 가정합니다.
— Zacharý
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.