연속 정수 축소


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 = 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 다른 기호로 바이트를 절약 할 수 있습니까?
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.