거기에서 깨 졌어요 (가위로)


15

도전

절단 규칙과 다른 문자열을 설명하는 문자열이 주어지면 첫 번째 문자열에서 설명한 규칙을 사용하여 두 번째 문자열에서 부분을 잘라냅니다.

두 문자열은 문자 a-z또는 로 구성되며 A-Z, 둘 중 원하는 것을 선택합니다 (동일한 방식으로 표현할 필요는 없습니다). 두 번째 문자열을 수정하는 방법은 다음과 같습니다.

연산

첫 번째 줄을 가져 와서 인접하지 않은 (증가하는) 문자 사이의 간격을 =; 예를 들어 abcfg=> abc==fg입니다. 그런 다음 두 문자열을 정렬하고 등호 위에 있지 않은 첫 번째 문자열의 모든 문자를 반환하십시오. 예를 들어, 주어진 abcfgqrstuvw입력으로 :

qrstuvw - Modify
abc==fg - Modifier

qrs--vw -> qrsvw

등호로 채운 후 수정자가 더 짧은 경우 두 번째 문자열의 모든 후행 문자를 포함해야합니다. 수정자가 더 길면 후행 문자는 무시됩니다.

수정자는 정렬되지 않을 수 있습니다.

테스트 사례

abcfg, qrstuvw -> qrsvw
abqrs, qwertyuiopasdfghjklzxcvbnm -> qwjklzxcvbnm
za, qr -> qr
azazaz, qwertyuioplkjhgfdsazxcvbnmnbvcxzasdfghjklpoiuytrewq -> qmn

참조 구현 (테스트 케이스 생성에 사용)-> TIO

규칙

  • 표준 허점 적용
  • 두 개의 문자열, 두 개의 문자 목록, 문자 행렬 등으로 입력 할 수 있습니다 (다른 합리적인 형식도 허용됨)
  • 문자열 또는 문자 목록 (또는 문자열의 다른 표준 형식)으로 출력 할 수 있습니다
  • 이것은 이므로 각 언어에서 가장 짧은 바이트 단위 답변이 해당 언어의 승자로 선언됩니다. 응답이 없습니다.
  • 문자열이 비어있을 수 있습니다.

행복한 골프!

Kevin Cruijssen의 최근 두 가지 과제에서 영감을 얻었습니다. "저기 고정했습니다 ( 테이프 / 로프 )"



2
가장 일반적인 추세는 여기에보고
L_Church

@L_Church 과제는 때때로 추세를 따릅니다. 두 가지 관련 도전 과제가 게시되어 트렌드에 따라 계속하기로 결정했습니다 .DI는 또 다른 "나는 그것을 고쳤습니다"라는 도전 과제를 게시하려고했지만 a) 나는 더 나은 것을 깨뜨리는 것을 좋아합니다. "idea : P
HyperNeutrino

16
다음 도전 :There, I blew it up (with a segfault)
Magic Octopus Urn

답변:


5

자바 스크립트 (ES6), 81 80 바이트

카레 구문으로 입력을 (modify)(modifier)받습니다.

s=>g=([c,...a],d=i=0,x=s[k=parseInt(c,36),i+=c?d&&(k-d+26)%26:1])=>x?x+g(a,k):''

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

댓글

s =>                       // outer function, taking the string s to modify
  g = (                    // recursive inner function g(), taking:
    [c, ...a],             //   c = current modifier character; a[] = remaining characters
    d = i = 0,             //   d = code of previous modifier character; i = pointer in s
    x = s[                 //   x = i-th character of s
      k = parseInt(c, 36), //     k = code of the current modifier character in [10..35]
      i += c ?             //     update i; if c is defined:
        d &&               //       if d = 0, let i unchanged
        (k - d + 26) % 26  //       otherwise, add the difference between k and d (mod 26)
      :                    //     else:
        1                  //       just pick the next character by adding 1
    ]                      //   end of character lookup in s
  ) =>                     //
    x ?                    // if x is defined:
      x + g(a, k)          //   append x and do a recursive call to g()
    :                      // else:
      ''                   //   stop recursion


3

05AB1E , 20 17 바이트

ćsv¹Ç¥Nè<yú«}SðÊÏ

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


양수인 경우 많은 공백을 추가하여 각 문자 사이의 ASCII 거리를 계산합니다. 음의 거리는 사양에 따라 0 개의 공백을 추가합니다. 그런 다음 첫 번째 조작 문자열의 공백과 문자열 2의 동일한 인덱스에서 모든 문자를 푸시합니다.


Input: [azaz,qwertyuiopasdfghjklzxcvbnm]
--------------------------------------------------------------------------------

ćs                # Remove head, swap                           | [a, zaz]
  v               # Iterate...                                  | ............
   ¹Ç¥            # Push deltas between each char of string 1   | [a,[25,-25,25,-25]]
      Nè          # Push delta at index...                      | [a, 25]
        <         # Decrement (for 1-indexed answer)            | [a, 24]
         y        # Push current char in iteration...           | [a, 24, z]
          ú       # Append b spaces to a...                     | [a, '(spaces)z']
           «      # Concat                                      | [a(spaces)z]
            }     # End loop.                                   | [a(spaces)za(spaces)z]
             SðÊ  # Split, push 1 for non-space elements.       | [Long array of 1/0]
                Ï # Push chars from 2 that aren't spaces in 1.  | ['qmn']

90 %는 공백을 사용하지 않고 인덱스 N에서 char을 푸시하여 2 ~ 3 바이트를 잃을 수 있다고 확신합니다. 현재이 변형에 대해 계속 연구하고 있습니다 ... 내 "더 나은 아이디어"는 다음과 같이 끝났습니다.

05AB1E , 18 바이트

Ç¥ε1‚Z}ηO0¸ìʒ²g‹}è

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

내가 뭔가 빠진 것 같은 당신이 개선 보면 나는 느낌 ε1‚Z}, ʒ²g‹}또는 0¸ìLMK을 ...

Ç¥ε1‚Z}ηO0¸ìè13 살,하지만 때이 랩 n > |input_2|input_2[n%|input_2|]...


두 번째 버전은 Ç ¥ ε1M}. ¥ ʒ²g‹} è 일 수 있지만 세 가지 버전 중 어느 것도 이러한 입력에 작동하지 않는 것 같습니다.
Emigna

위의 버전은을 추가하여 수정할 수 IgÅ1«있지만 더 좋은 방법이 있습니까?
Emigna

2

Stax , 15 바이트

Ç«|¢Äα•è@╟╣i`vF

실행 및 디버깅

이것이 아스키 표현입니다.

:-Z+{v0|Mt|cB]pFp
  1. 쌍별 차이를 얻으십시오.
  2. 0을 추가하십시오.
  3. 차이를 반복
    1. 1을 빼고 0을 최대로합니다.
    2. 문자열의 시작 부분에서 많은 문자를 제거하십시오.
    3. 문자열이 비어 있으면 중지하십시오.
  4. 나머지 문자열을 인쇄하십시오.

1
코드가 말하는 방식이 마음에 ╟╣i
Uriel

2

젤리 , 14 바이트

OI’R¬⁸żFḣL}aḟ0

왼쪽에있는 문자 목록으로 수정자를 허용하고 오른쪽에있는 문자 목록으로 리턴 할 문자 목록으로 수정자를 허용하는 2 진 링크.

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

어떻게?

OI’R¬⁸żFḣL}aḟ0 - Link list of characters Modifier, list of characters InStr
               -                       e.g.  ['a','c','g','a'], ['n','m','l','k','j']
O              - ordinals of Modifier        [97,99,103,97]
 I             - incremental differences     [2,4,-6]
  ’            - decrement                   [1,3,-7]
   R           - range                       [[1],[1,2,3],[]]
    ¬          - NOT (vectorises)            [[0],[0,0,0],[]]
     ⁸         - chain's left argument, Modifier
      ż        - zip together                [['a',[0]],['c',[0,0,0]],['g',[]],['a']]
       F       - flatten                     ['a',0,'c',0,0,0,'g','a']
         L}    - length of right (InStr)     5
        ḣ      - head to index               ['a',0,'c',0,0] (if shorter or equal, no effect)
           a   - AND with InStr (vectorises) ['n',0,'l',0,0]
            ḟ0 - filter out zeros            ['n','l']

¬내 대답에 트릭을 사용했습니다 . :) (우리는 기술적으로 동일한 알고리즘을 가지고 있지만, 당신은 짧은, 잘 않았다!)
에릭 Outgolfer

아 그래,에 대해 언급하려고 ¬했지만 아직 준비가되지 않은 13 바이트 시도의 휴대 전화 지방 손가락 게시물을 할 때 잊어 버렸습니다.
조나단 앨런

2

자바 스크립트 (ES6), 79 바이트

f=([t,...T],s,z=T[0])=>z&&s?s[0]+f(T,s.slice(t>z||(parseInt(t+z,36)-370)%37)):s

마지막 답 과 문자 사이의 거리를 계산하는 데 동일한 알고리즘을 사용합니다 .

테스트 사례 :



2

K (ngn / k) , 27 24 25 바이트

{y[+\0,1|1_-':x,!#y]^" "}

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

{y[+\0,1|1_-':x,!#y]^" "}

{                       } function with x and y as arguments
                 #y       the length of y
                !#y       0 1 2 ... (#y)-1
              x,          x concatenated with
           -':            differences between pairs
         1_               rm extra leading item
       1|                 max between 1 and
     0,                   prepend 0
   +\                     partial sums
 y[                ]      index y with that
                    ^" "  rm spaces due to out-of-bounds indexing




1

, 29 28 바이트

⭆η×ιI§⁺⭆θ⁺×0∧μ⊖⁻℅λ℅§θ⊖μ1⭆η1κ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 거기에 대한 대답을 바탕으로 테이프로 고정했습니다. 설명:

       ⭆θ⁺×0∧μ⊖⁻℅λ℅§θ⊖μ1        Fix it with tape, but map to 1s and 0s
      ⁺                 ⭆η1     Append extra 1s just in case
⭆η                              Map over the second string
     §                     κ    Get the character from the fixed string
    I                           Cast to integer
  ×ι                            Repeat the current character that many times
                                Implicitly print

참고 :이 값은 28 바이트 여야하지만 And쓰기 시점에서 손상되었습니다.


0

자바 8, 117 바이트

a->b->{for(int i=0,j;++i<a.length;b=j>0&b.length()>=i+j?b.substring(0,i)+b.substring(i+j):b)j=a[i]+~a[i-1];return b;}

설명:

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

a->b->{                   // Method with char-array + String parameters and String return
  for(int i=0,j;++i<a.length;
                          //  Loop `i` in range [1; length_of_array)
      b=                  //    After every iteration: change the String-input to:
        j>0               //     If `j` is larger than 0,
        &b.length()>=i+j? //     and the length of `b` is larger or equal to `i+j`:
         b.substring(0,i) //      Take the substring [0; i)
         +b.substring(i+j)//      + the substring [i+j; end_of_string]
        :                 //     Else:
         b)               //      Leave `b` the same
    j=a[i]+~a[i-1];       //   Set `j` to the difference between two adjacent chars - 1
  return b;}              //  Return the modified input-String
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.