Там я ее сломал (ножницами)


15

Вызов

Имея строку, описывающую правило резки, и другую строку, вырежьте части из второй строки, используя правило, описанное в первой строке.

Обе строки будут состоять из букв a-zили A-Zтого, что вы выберете (они не должны быть представлены одинаково). Способ изменения второй строки описан ниже:

Алгоритм

Возьмите первую строку и представьте, что заполняете пробелы между несмежными (увеличивающимися) буквами =; например, abcfg=> abc==fg. Затем выровняйте две строки и верните все символы из первой строки, которые не находятся выше знака равенства. Например, учитывая abcfgи в qrstuvwкачестве входных данных:

qrstuvw - Modify
abc==fg - Modifier

qrs--vw -> qrsvw

Если модификатор короче после заполнения знаками равенства, все завершающие символы во второй строке должны быть включены. Если модификатор длиннее, завершающие символы игнорируются.

Модификатор не гарантированно будет отсортирован.

Тестовые случаи

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

Реализация ссылок (используется для генерации тестовых случаев) -> TIO

правила

  • Применяются стандартные лазейки
  • Вы можете воспринимать ввод как две строки, два списка символов, матрицу символов и т. Д. (Любой другой приемлемый формат приемлем)
  • Вы можете вывести в виде строки или списка символов (или некоторого другого стандартного формата для строк)
  • Это , поэтому самый короткий ответ в байтах на каждом языке объявляется победителем для своего языка. Ответ не будет принят.
  • Любая строка может быть пустой.

Счастливого гольфа!

Вдохновленный двумя последними проблемами Кевина Круйссена, «Там я исправил это (с лентой / веревкой



2
очень распространенная тенденция, которую я вижу здесь
L_Church

Проблемы @L_Church иногда следуют тенденциям. были опубликованы две связанные задачи, поэтому я решил продолжить эту тенденцию: DI собирался опубликовать еще одну задачу «Я исправил это», но а) мне нравится ломать вещи лучше 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

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% уверены, что я могу потерять еще 2-3 байта, не используя пробелы, но помещая символ в индекс N. Все еще работаю над этим вариантом в данный момент ... Что моя «лучшая идея» закончилась так:

05AB1E , 18 байт

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

Попробуйте онлайн!

Я чувствую, что что-то упустил, если вы видите улучшения ε1‚Z} , ʒ²g‹}или 0¸ìЛМК ...

Ç¥ε1‚Z}ηO0¸ìèбыло 13, но это оборачивает , когда n > |input_2|к input_2[n%|input_2|]...


Ваша вторая версия может быть Ç ¥ ε1M}. ¥ ʒ²g ‹} è , но ни одна из трех версий не работает для этих входных данных.
Эминья

Версию выше можно исправить, добавив IgÅ1«, но, может быть, есть лучший способ?
Эминья

2

Stax , 15 байт

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

Запустите и отладьте его

Это представление ascii.

:-Z+{v0|Mt|cB]pFp
  1. Получите попарные различия.
  2. Добавить ноль.
  3. Разница по каждому, повторить
    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 (нгн / к) , 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

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.