스플릿 마크 마크


21

도전

마크는 N한 줄에 연결된 방식으로 마크 를받는 학생입니다 .

문제는 각 마크가 0또는 1또는 2또는 3또는 4또는 5또는 6또는 7또는 8또는9 또는 일10 .

입력

N 자연수와 한 줄.

산출

자연수의 집합입니다.

N, One line------------------> Set of marks
3, '843'---------------------> [8, 4, 3]
1, '0'-----------------------> [0]
2, '1010'--------------------> [10,10]
3, '1010'--------------------> [1,0,10] or [10,1,0] 
4, '1010'--------------------> [1,0,1,0]
9, '23104441070'-------------> [2, 3, 10, 4, 4, 4, 10, 7, 0]
12,'499102102121103'---------> [4, 9, 9, 10, 2, 10, 2, 1, 2, 1, 10, 3]
5, '71061'-------------------> [7, 1, 0, 6, 1]
11,'476565010684'------------> [4, 7, 6, 5, 6, 5, 0, 10, 6, 8, 4]
4, '1306'--------------------> [1, 3, 0, 6]
9, '51026221084'-------------> [5, 10, 2, 6, 2, 2, 10, 8, 4]
14,'851089085685524'---------> [8, 5, 10, 8, 9, 0, 8, 5, 6, 8, 5, 5, 2, 4]
11,'110840867780'------------> [1, 10, 8, 4, 0, 8, 6, 7, 7, 8, 0]
9, '4359893510'--------------> [4, 3, 5, 9, 8, 9, 3, 5, 10]
7, '99153710'----------------> [9, 9, 1, 5, 3, 7, 10]
14,'886171092313495'---------> [8, 8, 6, 1, 7, 10, 9, 2, 3, 1, 3, 4, 9, 5]
2, '44'----------------------> [4, 4]
4, '9386'--------------------> [9, 3, 8, 6]

규칙

  • 여러 개의 출력이 가능한 경우 하나의 출력 만 제공하십시오.
  • 가치 마크 만 10 소수점 두 자리에 있고 다른 은 소수점 한 자리에 있습니다.
  • 입력 및 출력은 편리한 형식으로 제공 될 수 있습니다.
  • 유효하지 않은 입력을 처리 할 필요가 없습니다
  • 전체 프로그램 또는 기능이 허용됩니다. 함수 인 경우 출력하지 않고 출력을 반환 할 수 있습니다.
  • 가능하면 다른 사람들이 귀하의 코드를 시험해 볼 수 있도록 온라인 테스트 환경에 대한 링크를 포함하십시오!
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

다음 n, 'string'은 복사하여 붙여 넣은 예제 텍스트 블록에서 쌍 을 가져 오는 데 사용한 Python 스 니펫입니다 .spl = [item.split('-')[0] for item in text.split('\n')]
Gigaflop

3
다운 투표에 대한 몇 가지 의견 Plz ...
mdahmoune

다운 보트는 이유로 인해 의견을 남기지 않아도됩니다. 이 문제에 대해 개선 할 수있는 것은 없습니다.
user202729

따라서 걱정하지 마십시오.
user202729

출력은 입력과 순서가 동일해야합니까?

답변:


6

Brachylog , 23 21 바이트

Fatalize 덕분에 -2 바이트

h~c.{ịℕ≤10&ịṫ?∧}ᵛ&t~l

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

입력은 쌍 [Line, N]입니다.

이것은 나의 첫 번째 Brachylog 프로그램이므로 개선의 여지가 많을 것입니다.

줄 길이가 7보다 길면 속도가 매우 느립니다.

설명:

h~c.{ịℕ≤10&ịṫ?∧}ᵛ&t~l
h                         The first element in the input
 ~c                       is formed by concatenating
   .                      the elements in the output array
   .{         ∧}ᵛ     AND For every element in the output array holds that
     ị                      The element converted to an integer
      ℕ                       is a natural number
       ≤10                    and less than or equal to 10
          &ịṫ?              and it has no leading zeroes (*)
                 &t   AND The second element of the input
                   ~l     is the length of the output 

(*) ịṫ?는 선행 0이 없는지 확인합니다. 문자열을 정수로 변환 한 다음 다시 문자열로 변환하여 원래 문자열과 비교합니다.


숫자를 문자열로 입력 할 필요는 없으며 정수만 사용하십시오. 이것은 모든 사람들 과 선행 제로 체크 의 필요성을 완화시킵니다 h~c.{ℕ≤10}ᵛ&t~l. 제약 조건을 통해 알 수없는 정수조차도 정수의 연결 해제가 작동해야하기 때문에 속도가 느려져 비효율적입니다.
페이탈 라이즈

또한 첫 번째 / 마지막 요소 를 사용 h하고 t사용 하는 것이 둘 다 사용 하는 것보다 효율적입니다 (대부분의 프로그램에서는 작동하지 않음).
페이탈 라이즈

@ Fatalize 입력 줄에 선행 0이 포함될 수 있으므로 정수를 입력으로 사용할 수 없다는 것을 이해했습니다.
fergusq

맞아, 그건 짜증나 ..
치명적인

5

펄 6 , 25 바이트

->\a,\b{b~~/(10|.)**{a}/}

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

숫자와 문자열을 가져 와서 Match 개체로 반환하는 익명 코드 블록입니다.

설명:

->\a,\b{                }  # Anonymous code block taking params a and b
        b~~/           /   # Match using b
            (10|.)           # 10 or a single digit
                  **{a}      # Exactly a times, being greedy


5

V , 17 , 12 바이트

\ÓòÀGjí1“î…0

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

나는 17 바이트로 만족했지만 05AB1E보다 13이 나왔으므로 도전에 답하지 못했습니다. :디

\Ó                      " Put each character on it's own line
  ò                     " Recursively (repeat until an error happens)...
   ÀG                   "   Go to the "n"th line
     j                  "   Move down a line (this will error if there are exactly "n" lines)
      í                 "   Remove...
       1                "     a '1'
        <0x93>          "     START THE MATCH HERE
              î         "     a newline
               <0x85>   "     END THE MATCH HERE
                   0    "     a '0'

16 진 덤프 :

00000000: 5cd3 f2c0 476a ed31 93ee 8530            \...Gj.1...0

대체 솔루션 :

\ÓòÀGjç1î0/J

불행히도 이것은 다음으로 대체 10됩니다.1 0


4

루비 , 57 바이트

->n,m{m.sub!"10",?A while m[n];m.chars.map{|c|c.to_i 16}}

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

이것은하지 golfiest 접근으로 판명 수 있지만 일시적으로 대체 할 수있는 재미있는 아이디어처럼 보이는 10헥스에 대한 A부수적으로도 높은 상표입니다, (우리는 : AF 등급 시스템을 고려하는 경우)




4

파이썬 3 , 71 68 59 바이트

ovs 덕분에 또 다른 9 바이트가 줄어 들었습니다.

lambda n,s:[int(c,11)for c in s.replace('10','a',len(s)-n)]

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

처음에는 str.partition()재귀 적 으로 사용하려고 했지만 replace너무 오래지 않아 얼굴 을 때렸습니다. 누구든지 이것을 개선 할 수 있습니까?

또한 테스트 사례를 더 복사 / 붙여 넣을 수 있도록 만드는 데 사용한 TIO 링크가 있습니다.


1
-3 바이트 : 드롭 공간을 사이에 : [c'x' else10 for
mdahmoune

@mdahmoune 주목 해 주셔서 감사합니다. 함께 뭉개지는 것을 기억하기가 어렵습니다.
Gigaflop

8
일반적인 경험 법칙 : 기본적으로 두 글자를 제외한 모든 것을 함께 사용할 수 있습니다. 구문 오류가 발생하면 작동 할 때까지 임의의 공백을 추가하십시오.)
Quintec

다음과 같은 몇 가지 예외가있다 <number>e, <letter><number>, f'.
user202729 2016

3
10을 a로 바꾸고 각 문자를 기본 11 int로 읽는 59 바이트 : lambda n,s:[int(c,11)for c in s.replace('10','a',len(s)-n)].
ovs

3

하스켈 , 98 바이트

n!x=[y|y<-s x,y==take n y]!!0
s('1':'0':x)=do y<-s x;[1:0:y,10:y]
s(x:y)=(read[x]:)<$>s y
s _=[[]]

온라인으로 시도 하거나 모두 테스트하십시오!

설명

이 기능은 s예를 들어, 모든 가능한 분할을 수행 "1010"하게된다 [[1,0,1,0],[10,1,0],[1,0,10],[10,10]](때문에 가장 긴 분할이 시작 부분에 끝낼 방법을 참고 1:0:y전에 온다 10:y).

이를 염두에두고이 값을 모두 가져와 필요한 것보다 짧은 스플릿을 유지 y하는 위치 y == take n y를 필터링 할 수 있습니다 . 예를 들어 4목록을 동일하게 둡니다 [[1,0,1,0],[10,1,0],[1,0,10],[10,10]].

이제 입력이 항상 유효하기 때문에 목록에서 첫 번째 요소를 얻을 수 있습니다 (예 : 5!"1010"[1,0,1,0]수도 있지만 처리 할 필요는 없습니다).

참고 : 어떻게 든 잘못 계산되었습니다 .. y==take n y길이는 length y==n: S 와 같습니다.




2

05AB1E , 13 바이트

.œsù.ΔïTÝÃJ¹Q

온라인으로 사용해보십시오! 또는 테스트 스위트

설명

.œ              # partitions of the first input
  sù            # of a length equal to the second input
    .Δ          # find the first partition that returns true when:
      ï         # each element is converted to integer
       TÝÃ      # and only numbers in [0 ... 10] are kept
          J     # then join it together
           ¹Q   # and compare it to the first input for equality

2

자바 스크립트 (Babel Node) ,  70 69  59 bytes

로 입력을 (n)(line)받습니다.

n=>s=>(a=s.match(/10|./g)).flatMap(x=>x>9&&!a[--n]?[1,0]:x)

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

댓글

n => s =>                       // given n and s
  (a = s.match(/10|./g))        // split s into marks; a '1' followed by a '0' is always
                                // interpreted as '10'
  .flatMap(x =>                 // for each mark x:
    x > 9 &&                    //   if x = '10',
    !a[--n] ?                   //   then decrement n; if a[n] is undefined:
      [1, 0]                    //     yield [1, 0]
    :                           //   else:
      x                         //     yield the mark unchanged
  )                             // end of flatMap()

자바 스크립트 (ES6),  64  59 바이트

@ guest271314 덕분에 5 바이트 절약

로 입력을 (n)(line)받습니다.

n=>g=([...s])=>1/s[n]?g(eval(`[${s}]`.replace('1,0',10))):s

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

댓글

n =>                            // main function, taking n
  g = ([...s]) =>               // g = recursive function, taking s
                                //     (which is either a string or an array)
    1 / s[n] ?                  // if s[n] is defined (i.e. we have too many marks):
      g(                        //   do a recursive call to g:
        eval(                   //     build a new array by evaluating ...
          `[${s}]`              //       ... the string representation of s[] where the
          .replace('1,0', 10)   //       first occurrence of '1,0' is replaced with '10'
        )                       //     end of eval()
      )                         //   end of recursive call
    :                           // else:
      s                         //   return s

N = 3 및 line = '1010'의 출력이 혼합 유형 [1, 0, '10'] 인 이유는 무엇입니까?
mdahmoune

s.match()는 문자열 배열을 반환하지만 의 콜백 함수에서 a "10"[1,0](2 개의 정수) 로 분할 될 수 있습니다 flatMap().
Arnauld

1
+1 바이트 동안 모든 것을 정수로 강제 변환 할 수 있습니다 .
Arnauld

59 바이트eval(`[${s}]`.replace('1,0',10))
guest271314

감사합니다! 잘 잡았다.
Arnauld

2

자바 (OpenJDK 8) , 78 바이트

스트림 API를 사용하는 멋진 원 라이너.

(n,l)->l.join(":",l.split("10",l.length()-n+1)).chars().map(i->i-48).toArray()

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


작동 원리

(n,l)->                     // Lambda function taking int and string
  l.join(":",               // Join the following array with colons
    l.split("10",           // Split the original string on "10"...
      l.length()-n+1))      // But limit the parts to the difference between the length
                            // and expected length, to only remove  required number of 10s              
  .chars()                  // Convert to an intstream of codepoints
  .map(i->i-48)             // Remove 48 to get the numeric value of each codepoint
  .toArray()                // Return an int array

2

R , 63 바이트

줄의 길이가 n 길지만 다음에 도달하는 10을 ":"(9 이후의 ASCII 문자)로 대체하십시오 . 그런 다음 문자열에서 각 문자의 ASCII 값을 사용하여 숫자로 나눕니다.

function(n,x){while(nchar(x)>n)x=sub(10,":",x);utf8ToInt(x)-48}

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



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.