そこで、私は(はさみで)それを壊した


15

チャレンジ

切断規則と別の文字列を記述する文字列が与えられた場合、最初の文字列によって記述された規則を使用して、2番目の文字列から一部を切り取ります。

両方の文字列は、文字a-zまたはのA-Zいずれかを選択します(同じ方法で表す必要はありません)。2番目の文字列を変更する方法を以下に説明します。

アルゴリズム

最初の文字列を取得し、隣接しない(増加する)文字間のギャップを=;で埋めることを想像してください。たとえば、abcfg=> abc==fg。次に、2つの文字列を並べて、等号の上にない最初の文字列のすべての文字を返します。例えば、所与abcfgおよびqrstuvw入力として:

qrstuvw - Modify
abc==fg - Modifier

qrs--vw -> qrsvw

等号で埋めた後の修飾子が短い場合、2番目の文字列のすべての後続文字を含める必要があります。修飾子が長い場合、末尾の文字は無視されます。

修飾子はソートされることを保証されていません。

テストケース

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

参照実装(テストケースの生成に使用)-> TIO

ルール

  • 標準的な抜け穴が適用されます
  • 入力は、2つの文字列、2つの文字のリスト、文字のマトリックスなどとして受け取ることができます(他の合理的な形式も受け入れられます)
  • 文字列または文字のリスト(または文字列の他の標準形式)として出力できます
  • これはであるため、各言語のバイト単位の最短回答がその言語の勝者として宣言されます。回答は受け付けられません。
  • どちらの文字列も空にすることができます。

ハッピーゴルフ!

Kevin Cruijssenの最近の2つの課題に触発され、「そこに、私はそれを修正しました(テープ / ロープで)」



2
ここで見ている非常に一般的な傾向
-L_Church

@L_Churchチャレンジは時々トレンドに従う。2つの関連する課題が投稿されたため、トレンドに沿って続けることにしました。 "アイデア:P
HyperNeutrino

16
次の課題:There, I blew it up (with a segfault)
マジックタコ

回答:


5

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

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%は、スペースを使用せずにインデックスNで文字をプッシュすることで、さらに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|]...


2番目のバージョンはÇ¥ε1M}。¥ʒ²g‹}èである可能性がありますが、3つのバージョンのいずれもこれらの入力に対して機能しないようです。
エミグナ

上記のバージョンはを追加することで修正できますIgÅ1«が、おそらくもっと良い方法がありますか?
エミグナ

2

スタックス、15 バイト

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

実行してデバッグする

これはアスキー表現です。

:-Z+{v0|Mt|cB]pFp
  1. ペアワイズ差分を取得します。
  2. ゼロを付加します。
  3. Foreachの違い、繰り返し
    1. 1を減算し、ゼロで最大にします。
    2. 文字列の先頭からその数の文字を削除します。
    3. 文字列が空の場合は停止します。
  4. 文字列の残りを印刷します。

1
私は、コードがどのように言う好き╟╣i
ウリエル

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

¬私の答えにトリックを使用しました。:)(技術的には同じアルゴリズムを使用していますが、短く、よくやった!)
エリックアウトゴルファー

そうそう、私はについてコメントするつもり¬だったが、まだ準備ができていない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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.