在那里,我用剪刀把它弄碎了


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 '18

@L_Church的挑战有时会跟随潮流。发表了两个相关的挑战,所以我决定继续发展:DI将发布另一个“我解决它”挑战,但是a)我喜欢更好地解决问题2)我想不出另一个创意又足够鲜明的“解决它” :P
HyperNeutrino,

16
下一个挑战:There, I blew it up (with a segfault)
魔术章鱼缸

1

Answers:


5

JavaScript(ES6),81个 80字节

以currying语法接受输入(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

05AB1E20 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%的人确定不使用空格,而是将char推到索引N会丢失另外2-3个字节。

05AB1E,18个字节

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

在线尝试!

如果您发现或lmk 有所改善ε1‚Z},我觉得我正在丢失某些东西。ʒ²g‹}0¸ì

Ç¥ε1‚Z}ηO0¸ìè13岁时,但它包装时n > |input_2|,以input_2[n%|input_2|]...


您的第二个版本可能是Ç¥ε1M}。¥ʒ²g‹}è,但是这三个版本似乎都不适合这些输入。
Emigna '18

可以通过添加来修复以上版本IgÅ1«,但是也许有更好的方法?
Emigna

2

Stax,15 个字节

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

运行并调试

这是ascii表示。

:-Z+{v0|Mt|cB]pFp
  1. 获取成对差异。
  2. 前面加一个零。
  3. Foreach差异,重复
    1. 减去1,取最大值为零。
    2. 从字符串开头删除许多字符。
    3. 如果字符串为空,则停止。
  4. 打印其余的字符串。

1
我喜欢代码怎么说╟╣i
Uriel

2

果冻,14 字节

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

双向链接,在左侧接受修饰符作为字符列表,在右侧接受修改的字符列表返回字符列表。

在线尝试!

怎么样?

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']

¬在我的答案中使用了把戏。:)(从技术上讲,我们有相同的算法,但是您做得更短,做得更好!)
Egg the Outgolfer

哦,是的,我要发表评论¬,但是忘了当我在尚未完成的13字节尝试中做手机胖手指帖子时。
乔纳森·艾伦

2

JavaScript(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κ

在线尝试!链接是详细版本的代码。根据对There的回答,我用胶带将其固定。说明:

       ⭆θ⁺×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

Java 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.