Di sana, saya memecahkannya (dengan gunting)

15

Tantangan

Diberikan string yang menggambarkan aturan pemotongan dan string lain, potong bagian dari string kedua menggunakan aturan yang dijelaskan oleh string pertama.

Kedua string akan terdiri dari huruf a-zatau A-Z, mana yang Anda pilih (mereka tidak harus diwakili dengan cara yang sama). Cara string kedua diubah dijelaskan di bawah ini:

Algoritma

Ambil string pertama dan bayangkan mengisi celah antara huruf-huruf yang tidak berbatasan (bertambah) dengan =; misalnya, abcfg=> abc==fg. Lalu, sejajarkan kedua string dan kembalikan semua karakter dari string pertama yang tidak di atas tanda sama dengan. Misalnya, diberikan abcfgdan qrstuvwsebagai input:

qrstuvw - Modify
abc==fg - Modifier

qrs--vw -> qrsvw

Jika pengubah lebih pendek setelah diisi dengan tanda sama dengan, semua karakter tambahan di string kedua harus dimasukkan. Jika pengubah lebih panjang, karakter yang tertinggal diabaikan.

Pengubah tidak dijamin akan diurutkan.

Uji Kasus

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

Implementasi Referensi (digunakan untuk menghasilkan kasus uji) -> TIO

Aturan

  • Celah Standar Berlaku
  • Anda dapat mengambil input sebagai dua string, dua daftar karakter, matriks karakter, dll. (Format wajar lainnya dapat diterima)
  • Anda dapat menampilkan sebagai string atau daftar karakter (atau format standar lainnya untuk string)
  • Ini adalah , jadi jawaban terpendek dalam byte di setiap bahasa dinyatakan sebagai pemenang untuk bahasanya. Tidak ada jawaban yang akan diterima.
  • Salah satu string mungkin kosong.

Selamat Golf!

Terinspirasi oleh dua tantangan Kevin Cruijssen baru-baru ini, "Di sana, saya memperbaikinya (dengan pita / tali )"

HyperNeutrino
sumber
2
tren yang sangat umum saya lihat di sini
L_Church
@L_Church tantangan terkadang mengikuti tren. dua tantangan terkait diposting jadi saya memutuskan untuk melanjutkan sepanjang tren: DI akan memposting tantangan "Saya memperbaikinya" yang lain tetapi a) Saya suka memecahkan hal-hal yang lebih baik 2) Saya tidak dapat memikirkan hal lain yang kreatif dan cukup berbeda "memperbaikinya "ide: P
HyperNeutrino
16
Tantangan berikutnya:There, I blew it up (with a segfault)
Magic Octopus Guci
1
@MagicOctopusUrn Seseorang mengalahkan Anda untuk itu :(
caird coinheringaahing

Jawaban:

5

JavaScript (ES6), 81 80 byte

Mengambil input dalam sintaks 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):''

Cobalah online!

Berkomentar

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
sumber
3

Python 3 , 99 byte

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]

Cobalah online!

ovs
sumber
3

05AB1E , 20 17 byte

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

Cobalah online!


Menghitung jarak ASCII antara masing-masing karakter, menambahkan banyak spasi jika positif. Jarak negatif menghasilkan penambahan 0 spasi, sesuai spesifikasi. Setelah itu, saya mendorong semua karakter pada indeks yang sama di string 2 sebagai spasi di string yang dimanipulasi pertama.


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% yakin saya bisa kehilangan 2-3 byte lagi dengan tidak menggunakan spasi, tetapi mendorong char pada index N. Masih mengerjakan varian ini saat ini ... Apa "ide yang lebih baik" saya berakhir sebagai:

05AB1E , 18 byte

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

Cobalah online!

Saya merasa seperti kehilangan sesuatu, jika Anda melihat peningkatan ε1‚Z}, ʒ²g‹}atau 0¸ìlmk ...

Ç¥ε1‚Z}ηO0¸ìèberusia 13, tetapi membungkus kapan n > |input_2|harus input_2[n%|input_2|]...

Guci Gurita Ajaib
sumber
Versi kedua Anda mungkin Ç ¥ ε1M}. ¥ ʒ²g ‹} è , tetapi tidak satu pun dari ketiga versi tersebut yang berfungsi untuk input ini.
Emigna
Versi di atas dapat diperbaiki dengan menambahkan IgÅ1«, tetapi mungkin ada cara yang lebih baik?
Emigna
2

Stax , 15 byte

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

Jalankan dan debug itu

Ini adalah representasi ascii.

:-Z+{v0|Mt|cB]pFp
  1. Dapatkan perbedaan berpasangan.
  2. Sebutkan nol.
  3. Perbedaan Foreach, ulangi
    1. Kurangi 1, dan ambil maksimum dengan nol.
    2. Hapus banyak karakter dari awal string.
    3. Hentikan jika string kosong.
  4. Cetak sisa string.
rekursif
sumber
1
Saya suka bagaimana kode mengatakan╟╣i
Uriel
2

Jelly , 14 byte

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

Tautan diad yang menerima pengubah sebagai daftar karakter di sebelah kiri dan daftar karakter untuk dimodifikasi di sebelah kanan mengembalikan daftar karakter.

Cobalah online!

Bagaimana?

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
sumber
¬Trik yang digunakan dalam jawaban saya. :) (secara teknis kami memiliki algoritma yang sama, tetapi Anda melakukan lebih pendek, dilakukan dengan baik!)
Erik the Outgolfer
Oh ya, saya akan berkomentar tentang itu ¬, tetapi lupa ketika saya melakukan posting lemak-jari ponsel dari upaya 13 byte yang belum siap.
Jonathan Allan
2

JavaScript (ES6), 79 byte

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

Menggunakan algoritma yang sama untuk menghitung jarak antar huruf sebagai jawaban terakhir saya .

Kasus uji:

Rick Hitchcock
sumber
2

K (ngn / k) , 27 24 25 byte

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

Cobalah 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
sumber
1

Perl 5 , 45 byte

s/./v0.$;x(ord($')-1-ord$&)/eg;$_|=<>;s/\W//g

Cobalah online!

Ton Hospel
sumber
1

Arang , 29 28 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Berdasarkan jawaban saya di sana, saya memperbaikinya dengan kaset. Penjelasan:

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

Catatan: Ini harus 28 byte, tetapi Andrusak pada saat penulisan.

Neil
sumber
0

Java 8, 117 byte

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

Penjelasan:

Cobalah 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
sumber