Menafsirkan rentang longgar

13

Menafsirkan rentang longgar

ListSharp adalah bahasa pemrograman yang ditafsirkan yang memiliki banyak fitur, salah satu fitur tersebut adalah pencipta rentang berbasis 1 indeks yang berfungsi seperti ini:

Anda mendefinisikan rentang sebagai (INT) TO (INT)atau hanya di (INT)mana keduanya atau int tunggal dapat pergi dari nilai min ke max int32

Lalu Anda bisa menggunakan rentang itu untuk mengekstrak elemen array tanpa takut melampaui batasnya


karena itu:

1 TO 5 menghasilkan: {1,2,3,4,5}

3 menghasilkan: {3}

Kisaran dapat ditambahkan menggunakan ANDoperator

1 TO 5 AND 3 TO 6 menghasilkan: {1,2,3,4,5,3,4,5,6}

ingat ini bekerja dengan angka negatif juga

3 TO -3 menghasilkan: {3,2,1,0,-1,-2,-3}


Tantangannya adalah sebagai berikut:

Memasukkan

Array karakter dan klausa rentang yang didefinisikan sebelumnya sebagai string

Keluaran

Elemen-elemen di lokasi berbasis indeks 1 rentang (indeks tidak ada / negatif menerjemahkan ke karakter kosong)


Bagaimana cara menang

Sebagai tantangan Anda seharusnya membuat program dengan jumlah byte terpendek untuk menang


Telah ditunjukkan bahwa karakter kosong tidak ada, oleh karena itu Anda harus mengabaikannya (saya hanya menunjukkannya di sini untuk membuatnya lebih mudah dipahami namun membingungkan orang)

Kasus uji:

input array is:
{'H','e','l','l','o',' ','W','o','r','l','d'}

range clause:
"1 TO 3" => "Hel"
"5" => "o"
"-10 TO 10" => "Hello Worl"
"0 AND 2 AND 4" => "el"
"8 TO 3" => "oW oll"
"-300 AND 300" => ""
"1 TO 3 AND 3 TO 1" => "HelleH"
"-20 TO 0 AND 1 AND 4" => "Hl"
downrep_nation
sumber
3
Apakah kita diperbolehkan menggunakan 0-indeks alih-alih 1-indeks sebagai string input? Jadi klausa rentang menjadi "0 TO 2"=> {'H', 'e', 'l'}?
Kevin Cruijssen
Tabel ASCII tidak memiliki karakter kosong (tidak termasuk karakter yang tidak dapat dicetak). Apa yang salah dengan menggunakan ruang?
adrianmp
array char pada dasarnya adalah sebuah string, karenanya karakter kosong tidak akan dicetak atau dikembalikan
downrep_nation
1
Juga, apakah misalnya 3 TO 3akan menjadi input dan apa output yang diharapkan?
Jordan
1
Anda memerlukan beberapa test case untuk ANDmemasukkan rentang kelipatan. Selain itu, Anda tidak menjawab jika kami dapat menggunakan pengindeksan berbasis nol, yang merupakan standar di sebagian besar bahasa.
mbomb007

Jawaban:

5

Python 2 - 239 211 210 byte

Terima kasih kepada @ mbomb007 dan @Cyoce untuk lebih lanjut golf solusi ini!

def r(s):
 t=[]
 for x in s.split("AND"):
  if"T"in x:a=map(int,x.split("TO"));b=2*(a[0]<a[1])-1;t+=range(a[0],a[1]+b,b)
  else:t+=int(x),
 return t
lambda p,v:[(['']+p+['']*max(map(abs,r(v))))[x]for x in r(v)]

Pendekatan lurus ke depan. Mencoba generator dan versi rekursif, tetapi mereka tidak bisa mengalahkan yang sederhana untuk setiap loop. Saya seorang pemula golf, jadi ini kemungkinan besar dapat ditingkatkan sedikit. Juga, kelemahan utama dari cuplikan ini adalah bahwa rentang sebagai objek daftar dihitung lagi setiap kali elemen diambil dari array karakter (lihat baris terakhir, pemahaman daftar). Ini berarti waktu r(s)dieksekusi len(r(s)) + 1.

Kode tidak dikunci:

def find_range(string):
    result = []

    # Split at each AND and look at each element separately
    for element in string.split("AND"):
        # Element is just a number, so add that number to the result list
        if "TO" not in string:
            result += [int(string)]

        # Generate a list with all the values in between the boundaries 
        # (and the boundaries themselves, of course) and append it to the result list
        else:
            boundaries = map(int, string.split("TO"))
            ascending = boundaries[0] < boundaries[1]

            # range(start, stop, step) returns [start, ..., stop - 1], so extend the stop value accordingly
            # range(8, 3, 1) returns just [], so choose respective step (negative for a descending sequence)
            result += range(boundaries[0], boundaries[1] + (1 if ascending else -1), 1 if ascending else -1)

# Make the char array 1-indexed by appending an empty char in 0th position
# Add enough empty chars at the end so too large and negative values won't wrap around
interpret = lambda chars, range_expr: [(['']+chars+['']*max(map(abs, find_range(range_expr))))[x] for x in find_range(range_expr)]

Kasus uji:

c = list("Hello World")
print interpret(c, "1 TO 3")
print interpret(c, "5")
print interpret(c, "-10 TO 10")
print interpret(c, "0 AND 2 AND 4")
print interpret(c, "8 TO 3")
print interpret(c, "-300 AND 300")

Keluaran:

['H', 'e', 'l']
['o']
['', '', '', '', '', '', '', '', '', '', '', 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l']
['', 'e', 'l']
['o', 'W', ' ', 'o', 'l', 'l']
['', '']
1Darco1
sumber
Jawaban pertama yang bagus! Selamat datang di PPCG!
mbomb007
Anda bisa mendapat manfaat dengan melihat Kiat Golf di Python . Anda dapat mengganti 2 spasi untuk indentasi ganda dengan satu tab. Anda dapat menempatkan kode mengikuti ifgaris yang sama dan memisahkannya dengan titik koma. Dan hapus ruang di [x] for. Juga, 1if b else-1bisa diganti dengan salah satu b and 1or-1atau 2*bool(b)-1untuk menyimpan byte.
mbomb007
Terima kasih! Saya sudah melihat dan (mencoba) menggunakan.d beberapa dari mereka. Akan melihat lagi semua jawaban lagi nanti. :)
1Darco1
Dan saya pikir Anda dapat menggunakan yang tidak disebutkan namanya lambda, karena itu tidak rekursif.
mbomb007
1
t+=[int(x)]canbecomet+=int(x),
Cyoce
3

Groovy ( 99 97 Bytes)

{n,v->Eval.me("[${n.replaceAll(" TO ","..").replaceAll(" AND ",",")}]").flatten().collect{v[it]}}

Cobalah di sini: https://groovyconsole.appspot.com/edit/5155820207603712

Penjelasan:

  • .replaceAll(" TO ","..") - Ganti to dengan rentang tradisional.
  • .replaceAll(" AND ", ",") - Ganti semua ands dengan koma.
  • "[${...}]" - Kelilingi dengan notasi "daftar" di Groovy.
  • Eval.me(...) - Mengevaluasi string sebagai kode Groovy.
  • .flatten() - Ratakan campuran array 2D dan array 1D menjadi array 1D.
  • .collect{v[it]} - Kumpulkan indeks dari array ke dalam satu struktur.

Berikut ini adalah solusi 115 113 byte yang menghilangkan null dari output: https://groovyconsole.appspot.com/edit/5185924841340928

Inilah solusi 117 byte jika Anda mengatakannya HARUS diindeks pada 1 bukannya 0: https://groovyconsole.appspot.com/edit/5205468955803648

Jika Anda ingin saya menukar yang asli dengan byte 113/117, beri tahu saya.

Guci Gurita Ajaib
sumber
Jika Anda tidak menyukai saya menggunakan "nulls" untuk karakter yang tidak ada, +5 byte di akhir untuk "-null", yang menghapus semua nol dari set.
Magic Gurita Guci
1
Saya suka kebetulan pintar ini
downrep_nation
Saya belajar sesuatu dari ini, tidak pernah tahu Groovy telah Eval.me(...)sampai sekarang; diberi menggunakannya dalam praktek akan sangat tidak aman, masih merupakan hal yang keren untuk diketahui.
Magic Gurita Guci
2

C #, 342 byte

a=>r=>{var s=r.Replace(" AND","").Replace(" TO ","|").Split();int b=a.Length,i=0,n,m,j,o;var c=new List<char>();for(;i<s.Length;){var d=s[i++].Split('|');if(d.Length<2)c.Add(b<(n=int.Parse(d[0]))||n<1?' ':a[n-1]);else{o=(m=int.Parse(d[0]))<(n=int.Parse(d[1]))?1:-1;for(j=m;o>0?j<=n:j>=n;j+=o)c.Add(b<j||j<1?' ':a[j-1]);}}return c.ToArray();};

Metode yang tidak digabungkan:

static char[] f(char[] a, string r)
{
    var s=r.Replace(" AND","").Replace(" TO ","|").Split();
    int b=a.Length,i=0,n,m,j,o;
    var c=new List<char>();
    for(;i<s.Length;)
    {
        var d=s[i++].Split('|');
        if(d.Length<2)
            c.Add(b<(n=int.Parse(d[0]))||n<1?' ':a[n-1]);
        else
        {
            o=(m=int.Parse(d[0]))<(n=int.Parse(d[1]))?1:-1;
            for(j=m;o>0?j<=n:j>=n;j+=o)
                c.Add(b<j||j<1?' ':a[j-1]);
        }
    }

    return c.ToArray();
}

Program lengkap dengan uji kasus:

using System;
using System.Collections.Generic;

namespace InterpretLooseRanges
{
    class Program
    {
        static void PrintCharArray(char[] a)
        {
            for (int i=0; i<a.Length; i++)
                Console.Write(a[i]);
            Console.WriteLine();
        }

        static void Main(string[] args)
        {
            Func<char[],Func<string,char[]>>f= a=>r=>{var s=r.Replace(" AND","").Replace(" TO ","|").Split();int b=a.Length,i=0,n,m,j,o;var c=new List<char>();for(;i<s.Length;){var d=s[i++].Split('|');if(d.Length<2)c.Add(b<(n=int.Parse(d[0]))||n<1?' ':a[n-1]);else{o=(m=int.Parse(d[0]))<(n=int.Parse(d[1]))?1:-1;for(j=m;o>0?j<=n:j>=n;j+=o)c.Add(b<j||j<1?' ':a[j-1]);}}return c.ToArray();};

            char[] ar = {'H','e','l','l','o',' ','W','o','r','l','d'};

            PrintCharArray(f(ar)("1 TO 3"));
            PrintCharArray(f(ar)("5"));
            PrintCharArray(f(ar)("-10 TO 10"));
            PrintCharArray(f(ar)("0 AND 2 AND 4"));
            PrintCharArray(f(ar)("8 TO 3"));
            PrintCharArray(f(ar)("-300 AND 300"));
        }
    }
}

Solusi naif, menggunakan daftar char, yang digunakan ' 'sebagai karakter kosong dan menyelesaikan pekerjaan. Berharap untuk segera membaik.

adrianmp
sumber
2

Scala, 165 byte

(s:String,r:String)=>r split "AND"map(_ split "TO"map(_.trim.toInt))flatMap{case Array(a,b)=>if(a<b)a to b else a to(b,-1)
case x=>x}map(i=>s lift(i-1)getOrElse "")

Penjelasan:

(s:String,r:String)=> //define a function
r split "AND"         //split the range expression at every occurance of "AND"
map(                  //map each part...
  _ split "TO"          //split at to
  map(                  //for each of these splitted parts, map them to...
    _.trim.toInt          //trim all whitespace and parse as an int
  )                    
)                     //now we have an Array[Array[Int]]
flatMap{              //map each inner Array...
  case Array(a,b)=>if(a<b)a to b else a to(b,-1) //if it has two elements, create a Range
  case x=>x             //otherwise just return it
}                     //and flatten, so we get an Array[Int]
map(i=>               //for each int
  s lift(i-1)         //try to get the char with index i-1, since Scala is zero-based
  getOrElse ""        //otherwise return ""
) 
corvus_192
sumber
2

Python 2, 156 155 byte

Jawaban saya memiliki beberapa ide yang mirip dengan jawaban 1Darco1 , tetapi dengan menggunakan pendekatan yang berbeda dari awal (string mengiris daripada daftar), itu berakhir sedikit lebih pendek. Akan lebih pendek empat byte jika pengindeksan 0 diizinkan.

s,r=input()
o=""
for x in r.split("AND"):
    i=map(int,x.split("TO"));d=2*(i[0]<i[-1])-1
    for _ in-1,0:i[_]-=11**9*(i[_]<0)
    o+=s[i[0]-1:i[-1]+d-1:d]
print o

Cobalah online

Untungnya, saya dapat mengurai string yang berisi spasi menjadi bilangan bulat. Pengindeksan negatif dalam indeks Python dari akhir string, jadi saya gunakan i[-1]untuk menjadi sama dengan i[0]atau nilai kedua, jika ada. Maka saya harus menyesuaikan nilai rentang negatif menjadi lebih negatif, sehingga tidak akan mengacaukan pengirisan. Mengalikan nilai negatif dengan 11**9(2357947691 ) akan menjelaskan rentang menggunakan nilai min integer. Kemudian, cukup iris string, menggunakan irisan terbalik jika rentangnya terbalik.

Dengan pengindeksan nol (151 byte):

s,r=input()
o=""
for x in r.split("AND"):
    i=map(int,x.split("TO"));d=2*(i[0]<i[-1])-1
    for _ in-1,0:i[_]-=11**9*(i[_]<0)
    o+=s[i[0]:i[-1]+d:d]
print o
mbomb007
sumber
Kerja bagus! Mengiris pasti adalah cara untuk pergi ke sini. rangePendekatan saya pada dasarnya hanya bentuk super verbose dari itu. Dan Anda bahkan menyingkirkan seluruh if"T"in x: else:bagian. +1
1Darco1
2

R, 142 byte

Dengan asumsi saya memahami tantangan dengan benar, di sini saya berasumsi itu radalah klausa rentang yang ditentukan sebelumnya dalam format string, dan bahwa array input ("Halo dunia", dalam contoh) dibaca dari stdin.

r=eval(parse(t=paste("c(",gsub("AND",",",gsub("TO",":",r)),")")))
o=strsplit(readline(),e<-"")[[1]][r[r>0]]
o[is.na(o)]=e
c(rep(e,sum(r<1)),o)

Beberapa test case:

r="1 TO 3"
[1] "H" "e" "l"

r="5"
[1] "o"

r="-10 TO 10"
[1] ""  ""  ""  ""  ""  ""  ""  ""  ""  ""  ""  "H" "e" "l" "l" "o" " " "w" "o" "r" "l"

r="0 AND 2 AND 4"
[1] ""  "e" "l"

r="8 TO 3"
[1] "o" "w" " " "o" "l" "l"

r="-300 AND 300"
[1] "" ""

Tidak diikat / dijelaskan

Baris 1

r=eval(parse(t=paste("c(",gsub("AND",",",gsub("TO",":",r)),")")))

R memiliki operator infiks yang bagus :yang menghasilkan urutan. 1:5memberi [1, 2, 3, 4, 5], dan 0:-2memberi [0, -1, -2]. Jadi, kami mengganti TOklausa rentang longgar dengan :.

                                         gsub("TO",":",r)

Menafsirkan ANDhanyalah penggabungan. Kita dapat menggunakan fungsi cuntuk itu, yang dengan mudah dapat mengambil sejumlah argumen, dipisahkan oleh koma. Jadi kami ganti ANDdengan,

                          gsub("AND",",",      ...       )

dan kemudian membungkus semuanya dalam c(, ).

               paste("c(",              ...               ,")")

Ini menghasilkan string karakter yang bisa terlihat seperti c( 1 : 5 , 7 ). Kami memanggil parseuntuk mengonversi untuk mengetik "ekspresi" dan kemudian evaluntuk mengevaluasi ekspresi. Urutan angka yang dihasilkan kemudian ditugaskan kembali ke variabel r.

r=eval(parse(t=                     ...                        ))

Baris 2

o=strsplit(readline(),e<-"")[[1]][r[r>0]]

Sekarang untuk bagian yang jelek - berurusan dengan string dalam R, yang menjadi berantakan dengan cepat. Pertama kita mendefinisikan emenjadi string kosong (kita akan membutuhkan ini nanti).

                      e<-""

Kami membaca dari stdin dan mengonversi string karakter menjadi array karakter individual dengan membelah string kosong. (Misalnya kita beralih dari "Hai" ke ["H", "i"].) Ini mengembalikan daftar panjang 1, jadi kita harus meminta elemen pertama [[1]]untuk mendapatkan array yang dapat kita kerjakan. Ugh, aku memperingatkanmu ini berantakan.

  strsplit(readline(), ... )[[1]]

Indeks R mulai dari 1, dan memiliki fitur yang bagus dengan angka negatif. Misalkan xadalah ['a', 'b', 'c']. Panggilan x[1]kembali tidak mengejutkan 'a'. Memanggil x[-1]mengembalikan semua x kecuali indeks 1, yaitu ['b', 'c']. Ini adalah fitur keren, tetapi berarti kita harus berhati-hati dengan indeks negatif kita untuk masalah ini. Jadi untuk saat ini, kami hanya mengembalikan elemen array input dengan indeks >0, dan menetapkan hasilnya o.

o=               ...             [r[r>0]]

Baris 3

Namun, ada masalah! Untuk indeks yang lebih besar dari panjang array, R hanya mengembalikan NAnilai. Kami membutuhkannya untuk mengembalikan string kosong. Jadi kita mendefinisikan unsur-unsur oyang is.na(o)merupakan TRUEmenjadi string kosong.

o[is.na(o)]=e

Baris 4

c(rep(e,sum(r<1)),o)

Akhirnya, bagaimana kita berurusan dengan indeks negatif (dan nol)? Mereka semua harus mengembalikan string kosong, jadi kami mengulangi string kosong N kali, di mana N adalah jumlah indeks yang ada <1.

  rep(e,sum(r<1))

Akhirnya, kami menggabungkan daftar yang sebelumnya ditentukan oke daftar ini (berpotensi kosong).

c(      ...      ,o)
rturnbull
sumber
2

JavaScript (ES6), 141

Fungsi tanpa nama dengan 2 parameter, yang pertama adalah array karakter (bisa berupa string juga), yang kedua adalah string yang berisi definisi rentang.

Nilai kembali adalah array di mana setiap elemen dapat berupa karakter tunggal atau nilai js undefined. Ketika dirumuskan, ini menghasilkan urutan karakter yang dipisahkan koma, yang tidak ditentukan ditampilkan sebagai karakter "kosong" - sebagai kasus uji dalam versi pertama pertanyaan.
Menggunakan .joinAnda bisa mendapatkan hasil string yang mirip dengan output kasus uji dalam versi pertanyaan saat ini.

(l,r,u,z=[])=>(r+' E').replace(/\S+/g,x=>x>'T'?u=t:x>'A'?[...Array((t-(w=(u=u||t)-(d=+u<t?1:-1)-1)-1)*d)].map(_=>z.push(l[w+=d]),u=0):t=x)&&z

Kurang golf

(
 l, r, // input paramaters, array/string and string
 u,    // local variable start at 'undefined'
 z=[]  // local variable, will contain the ouput
) => 
  (r+' E') // add an end marker
  .replace( /\S+/g, x=> // execute for each nonspace substring
    x > 'T' // check if 'TO'
    ? u = t // if 'TO' save first value in u (it's a string so even 0 is a truthy value)
    : x > 'A' // check if 'AND' or 'E'
      ? (
          u = u||t, // if u is falsy, it's a single value range t -> t
          d = +u < t ? 1 :-1, // direction of range up or down,comparison has to be numeric, so the leading +
          w = u - d - 1, // starting value (decrement by 1 as js array are 0 based)
          u = 0, // set u to falsy again for next round
          [...Array((t - w - 1) * d)] // build the array of required number of elements
          .map(_ => z.push(l[w+=d])) // iterate adding elements of l to z
        )
      : t = x // if not a keyword, save value in t
  ) && z // return output in z

Uji

f=
(l,r,u,z=[])=>(r+' E').replace(/\S+/g,x=>x>'T'?u=t:x>'A'?[...Array((t-(w=(u=u||t)-(d=+u<t?1:-1)-1)-1)*d)].map(_=>z.push(l[w+=d]),u=0):t=x)&&z

function run(x)
{
  R.value=x;
  O.textContent=f(L.value,x)
}

run("10 TO 5 AND 5 TO 10")
<table>
<tr><td>Base string</td><td><input id=L value="Hello World"></td></tr>
<tr><td>Custom range</td><td><input id=R ><button onclick='run(R.value)'>-></button></td></tr>
<tr><td>Output</td><td><pre id=O></pre></td></tr>
<tr><td>Test case ranges</td><td>
<select id=T onchange='run(this.value)'>
<option/>  
<option value="1 TO 3">1 TO 3 =&gt; {'H','e','l'}</option>
<option value="5">5 =&gt; {'o'}</option>
<option value="-10 TO 10">-10 TO 10 =&gt; {'','','','','','','','','','','','H','e','l','l','o',' ','W','o','r','l'}</option>
<option value="0 AND 2 AND 4">0 AND 2 AND 4 =&gt; {'','e','l'}
"8 TO 3" => {'o','W',' ','o','l','l'}</option>
<option value="-300 AND 300">-300 AND 300 =&gt; {'',''}</option>
<option value="1 TO 3 AND 3 TO 1">1 TO 3 AND 3 TO 1 =&gt; "HelleH"</option>
<option value="-20 TO 0 AND 1 AND 4">-20 TO 0 AND 1 AND 4 =&gt; "Hl"</option>
</select>
</td></tr>
</table>

edc65
sumber
1

Perl - 110 byte

Memanggil script di baris perintah dengan string sebagai argumen pertama, dan jangkauan sebagai yang kedua.

for(split AND,pop@ARGV){$_>0?print+(split//,"@ARGV")[$_-1]:0for(/(.+)TO(.+)/?($1>$2?reverse$2..$1:$1..$2):$_)}

De-dikaburkan:

for $subrange (split 'AND', $ARGV[1]) {
    for $index ($subrange =~ /(.+)TO(.+)/
        ? ($1 > $2 ? reverse $2..$1 : $1..$2) # All indices of that range
        : $subrange) # Otherwise, an index only
    {
        if ($index > 0) {
            # Here, 'split' returns an array of all characters
            print((split //, $ARGV[0])[$index - 1]);
        }
    }
}
Maxim Bernard
sumber
1

Python 2, 146 byte

lambda s,a:[a[i]for x in[map(int,c.split('TO'))for c in s.split('AND')]for i in range(x[0]-1,x[-1]-2*(x[-1]<x[0]),1-2*(x[-1]<x[0]))if 0<=i<len(a)]

Semua tes ada di ideone

Pisahkan klausa, spada "AND", pisahkan setiap sub-klausa yang dihasilkan pada "TO", mengubah string yang dihasilkan menjadiint menggunakanmap . Hasilnya masing-masing akan memiliki 1 atau 2 item (1 jika tidak ada "TO" ada di sub-klausa).
Buat rentang berbasis 0 untuk masing-masing menggunakan parameter langkah rentang sebagai 1 atau -1 dengan memeriksa nilai pada indeks 0 dan -1 (daftar dengan satu entri memiliki entri tersebut di kedua indeks).
Jalankan melalui rentang ini dan membuat daftar output, jika indeks yang disediakan dalam kisaran ( if 0<=i<len(a)).

Jonathan Allan
sumber
0

Jelly , 28 27 25 byte

œṣ⁾TOj”rV
œṣ“Ñþ»Ç€Ff⁹J¤ị⁹

TryItOnline (juga akan bekerja dengan string alih-alih array char)

Bagaimana?

œṣ⁾TOj”rV - Link 1, construct sub-range: subclause
  ⁾TO     - string "TO"
œṣ        - split on sublists
     j    - join with
      ”r  - character "r"
        V - evaluate as Jelly code
                (r is the Jelly dyad for inclusive range, which works just like TO
                 when no r is present the string evaluates to the number:
                 " -20 "       evaluates to -20;
                 " -20 r -19 " evaluates to [-20,-19];
                 " 3 r -3 "    evaluates to [3,2,1,0,-1,-2,-3]; etc.)

œṣ“Ñþ»Ç€Ff⁹J¤ị⁹ - Main link: range clause, array 
  “Ñþ»          - compression of the string "AND"
œṣ              - split on sublists
      ǀ        - call the last link (1) as a monad for each
        F       - flatten list
            ¤   - nilad and link(s) as a nilad
          ⁹     - right argument (the array)
           J    - range for length [1,2,...,len(array)]
         f      - filter keep
                      (Jelly indexing is modular so keep only in-bound indexes)
             ị⁹ - index into the array
Jonathan Allan
sumber
0

Clojure 232 230 229 byte

Oh, sungguh monster yang telah kubuat ... Tapi sebenarnya ini baru 260 ketika aku akan mengirimkannya.

Edit: menghapus spasi dari #(get r %_""), (if_(< f t)dan (take-nth 2_%)(ditunjukkan sebagai _).

(let[S clojure.string/split](fn[r s](apply str(map #(get r %"")(mapcat #(apply(fn([f][(dec f)])([f t](if(< f t)(range(dec f)t)(reverse(range(dec t)f)))))%)(map #(mapv read-string(take-nth 2%))(map #(S % #" ")(S s #" AND "))))))))

Kurang golf:

(def f (let[S clojure.string/split]
         (fn[r s] (->> (map #(S % #" ") (S s #" AND "))
                       (map #(mapv read-string (take-nth 2 %)))
                       (mapcat #(apply(fn
                                        ([f][(dec f)])
                                        ([f t](if (< f t)
                                                (range (dec f) t)
                                                (reverse (range (dec t) f)))))  %))
                       (map #(get r % ""))
                       (apply str)))))

Menggunakan clojure.string/splituntuk membagi dengan "DAN" dan "",take-nth menjatuhkan "TO" antara integer, pencocokan argumen fungsi menangani kasus 1 atau 2 argumen dan hanya itu saja.

Konvensi panggilan: (f "Hello World" "1 TO 3 AND 2 AND 8 TO 2")

NikoNyrh
sumber
Anda dapat menghapus banyak byte dengan menghapus spasi secara umum, terutama di antara #karakter.
clismique
Apakah Anda yakin saya bisa menghapus ruang di antara #? Saya mencobanya tanpa hasil, itu "digabungkan" dengan token sebelumnya. Oh, satu ruang lagi untuk dihapus sebelum di %sana.
NikoNyrh