Tam, zepsułem to (nożyczkami)

15

Wyzwanie

Biorąc pod uwagę ciąg opisujący regułę cięcia i inny ciąg, wytnij części z drugiego ciągu, używając reguły opisanej przez pierwszy ciąg.

Oba ciągi znaków będą się składały z liter a-zlub A-Zdowolnego z nich (nie muszą być reprezentowane w ten sam sposób). Sposób modyfikacji drugiego ciągu opisano poniżej:

Algorytm

Weź pierwszy ciąg i wyobraź sobie wypełnianie luk między niesąsiadującymi (rosnącymi) literami za pomocą =; na przykład abcfg=> abc==fg. Następnie wyrównaj dwa ciągi i zwróć wszystkie znaki z pierwszego ciągu, które nie są powyżej znaku równości. Na przykład dane podane abcfgi qrstuvwjako dane wejściowe:

qrstuvw - Modify
abc==fg - Modifier

qrs--vw -> qrsvw

Jeśli modyfikator jest krótszy po wypełnieniu znakami równości, należy uwzględnić wszystkie końcowe znaki w drugim ciągu. Jeśli modyfikator jest dłuższy, końcowe znaki są ignorowane.

Modyfikator nie ma gwarancji sortowania.

Przypadki testowe

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

Implementacja referencyjna (używana do generowania przypadków testowych) -> TIO

Zasady

  • Obowiązują standardowe luki
  • Możesz przyjmować dane wejściowe jako dwa ciągi, dwie listy znaków, macierz znaków itp. (Akceptowalny jest dowolny inny rozsądny format)
  • Możesz wyprowadzać dane jako ciąg znaków lub listę znaków (lub inny standardowy format ciągów znaków)
  • To jest , więc najkrótsza odpowiedź w bajtach w każdym języku zostaje ogłoszona zwycięzcą dla swojego języka. Żadna odpowiedź nie zostanie zaakceptowana.
  • Każdy ciąg może być pusty.

Wesołego golfa!

Zainspirowany dwoma ostatnimi wyzwaniami Kevina Cruijssena: „Naprawiłem to (za pomocą taśmy / liny )”

HyperNeutrino
źródło
2
widzę tutaj bardzo popularny trend
L_Church
@L_Church wyzwania czasem podążają za trendami. opublikowano dwa powiązane wyzwania, więc postanowiłem kontynuować ten trend: DI zamierzał opublikować kolejne wyzwanie „Naprawiłem”, ale a) lubię rozwiązywać problemy 2) Nie mogę wymyślić innego kreatywnego i wystarczająco wyraźnego ”naprawiłem to „idea: P
HyperNeutrino
16
Następne wyzwanie:There, I blew it up (with a segfault)
Magic Octopus Urn
1
@MagicOctopusUrn Someone beat you to it :(
caird coinheringaahing

Odpowiedzi:

5

JavaScript (ES6), 81 80 bajtów

Pobiera dane wejściowe w składni curry (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):''

Wypróbuj online!

Skomentował

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
Arnauld
źródło
3

Python 3 , 99 bajtów

lambda a,b:[x for x,y in zip(a,''.join(d+(ord(c)+~ord(d))%26*'='for c,d in zip(b[1:],b))+a)if'='<y]

Wypróbuj online!

ovs
źródło
3

05AB1E , 20 17 bajtów

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

Wypróbuj online!


Oblicza odległość ASCII między każdym znakiem, przygotowując tyle spacji, jeśli jest dodatnia. Ujemna odległość powoduje dodanie 0 spacji, zgodnie ze specyfikacją. Następnie pcham wszystkie znaki o tych samych indeksach w ciągu 2, co spacje w pierwszym manipulowanym ciągu.


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% pewności, że mogę stracić kolejne 2-3 bajty, nie używając spacji, ale przesuwając znak do indeksu N. W tej chwili pracuję nad tym wariantem ... Co mój „lepszy pomysł” skończył jako:

05AB1E , 18 bajtów

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

Wypróbuj online!

Czuję się jakbym czegoś brakuje, jeśli widzisz na poprawę ε1‚Z}, ʒ²g‹}czy 0¸ìLMK ...

Ç¥ε1‚Z}ηO0¸ìèbyło 13, ale kiedy zawija n > |input_2|do input_2[n%|input_2|]...

Urna Magicznej Ośmiornicy
źródło
Drugą wersją może być Ç ¥ ε1M}. ¥ ʒ²g ‹} è , ale wydaje się, że żadna z trzech wersji nie działa dla tych danych wejściowych.
Emigna,
Powyższą wersję można naprawić, dodając IgÅ1«, ale może jest lepszy sposób?
Emigna,
2

Stax , 15 bajtów

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

Uruchom i debuguj

To jest reprezentacja ascii.

:-Z+{v0|Mt|cB]pFp
  1. Uzyskaj różnice par.
  2. Podaj zero.
  3. Przewiduj różnicę, powtórz
    1. Odejmij 1 i weź maksimum z zerem.
    2. Usuń tyle znaków z początku łańcucha.
    3. Zatrzymaj, jeśli ciąg jest pusty.
  4. Wydrukuj resztę ciągu.
rekurencyjny
źródło
1
Podoba mi się, jak mówi kod╟╣i
Uriel,
2

Galaretka , 14 bajtów

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

Dyadyczny link akceptujący modyfikator jako listę znaków po lewej stronie oraz listę znaków do modyfikacji po prawej stronie, zwracający listę znaków.

Wypróbuj online!

W jaki sposób?

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']
Jonathan Allan
źródło
Użyłem ¬podstępu w mojej odpowiedzi. :) (technicznie mamy ten sam algorytm, ale zrobiliście krócej, dobrze!)
Erik the Outgolfer
Och tak, zamierzałem skomentować ¬, ale zapomniałem, kiedy zrobiłem gruby palec w telefonie komórkowym niegotowej jeszcze 13-bajtowej próby.
Jonathan Allan
2

JavaScript (ES6), 79 bajtów

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

Używa tego samego algorytmu do obliczania odległości między literami, co moja ostatnia odpowiedź .

Przypadki testowe:

Rick Hitchcock
źródło
2

K (ngn / k) , 27 24 25 bajtów

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

Wypróbuj online!

{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
ngn
źródło
1

Węgiel drzewny , 29 28 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Na podstawie mojej odpowiedzi na Tam naprawiłem to taśmą. Wyjaśnienie:

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

Uwaga: Powinno to wynosić 28 bajtów, ale Andjest zepsute w momencie pisania.

Neil
źródło
0

Java 8, 117 bajtów

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;}

Wyjaśnienie:

Wypróbuj online.

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
Kevin Cruijssen
źródło