Giải thích phạm vi lỏng lẻo


13

Giải thích phạm vi lỏng lẻo

ListSharp là ngôn ngữ lập trình được diễn giải có nhiều tính năng, một trong những tính năng đó là trình tạo phạm vi dựa trên 1 chỉ mục hoạt động như sau:

Bạn xác định một phạm vi là (INT) TO (INT)hoặc chỉ (INT)nơi cả hai hoặc một int có thể đi từ giá trị min đến max int32

Sau đó, bạn có thể sử dụng các phạm vi đó để trích xuất các phần tử của một mảng mà không sợ vượt qua các ranh giới của nó


vì thế:

1 TO 5 tạo ra: {1,2,3,4,5}

3 tạo ra: {3}

Phạm vi có thể được thêm vào bằng cách sử dụng ANDtoán tử

1 TO 5 AND 3 TO 6 tạo ra: {1,2,3,4,5,3,4,5,6}

hãy nhớ điều này cũng có tác dụng với số âm

3 TO -3 tạo ra: {3,2,1,0,-1,-2,-3}


Thách thức là như sau:

Đầu vào

Một mảng ký tự và mệnh đề phạm vi được xác định trước đó dưới dạng một chuỗi

Đầu ra

Các phần tử tại vị trí dựa trên 1 chỉ mục của phạm vi (chỉ mục không tồn tại / tiêu cực chuyển thành ký tự trống)


Làm thế nào để chiến thắng

Là một thử thách bạn phải tạo chương trình với số byte ngắn nhất để giành chiến thắng


Nó đã được chỉ ra rằng các ký tự trống không tồn tại, do đó bạn nên bỏ qua chúng (tôi chỉ hiển thị chúng ở đây để dễ hiểu hơn nhưng nó làm mọi người bối rối)

Các trường hợp thử nghiệm:

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"

3
Chúng ta có được phép sử dụng 0-index thay vì 1-index làm chuỗi đầu vào không? Vậy mệnh đề phạm vi trở thành "0 TO 2"=> {'H', 'e', 'l'}?
Kevin Cruijssen

Bảng ASCII không có ký tự trống (ngoại trừ các ký tự không in được). Có gì sai khi sử dụng không gian?
adrianmp

một mảng char về cơ bản là một chuỗi, do đó, các ký tự trống sẽ không được in hoặc trả lại
downrep_nation

1
Ngoài ra, sẽ ví dụ 3 TO 3 bao giờ là một đầu vào và đầu ra dự kiến ​​là gì?
Jordan

1
Bạn cần một số trường hợp thử nghiệm cho ANDnhiều phạm vi ing. Ngoài ra, Bạn đã không trả lời nếu chúng tôi có thể sử dụng lập chỉ mục dựa trên số không, là tiêu chuẩn trong hầu hết các ngôn ngữ.
mbomb007

Câu trả lời:


5

Python 2 - 239 211 210 byte

Cảm ơn @ mbomb007@Cyoce đã tiếp tục chơi giải pháp này!

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

Phương pháp tiếp cận thẳng. Đã thử các trình tạo và một phiên bản đệ quy, nhưng chúng không thể đánh bại đơn giản cho mỗi vòng lặp. Tôi là một người chơi golf, vì vậy điều này rất có thể sẽ được cải thiện một chút. Ngoài ra, lỗ hổng lớn của đoạn trích này là phạm vi dưới dạng đối tượng danh sách được tính lại mỗi lần một phần tử được lấy từ mảng ký tự (xem dòng cuối cùng, hiểu danh sách). Điều này có nghĩa r(s)len(r(s)) + 1thời gian thực hiện .

Mã bị đánh cắp:

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

Các trường hợp thử nghiệm:

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")

Đầu ra:

['H', 'e', 'l']
['o']
['', '', '', '', '', '', '', '', '', '', '', 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l']
['', 'e', 'l']
['o', 'W', ' ', 'o', 'l', 'l']
['', '']

Câu trả lời tuyệt vời đầu tiên! Chào mừng đến với PPCG!
mbomb007

Bạn có thể hưởng lợi từ việc xem Mẹo chơi gôn trong Python . Bạn có thể thay thế 2 khoảng trắng để thụt đôi bằng một tab duy nhất. Bạn có thể đặt mã theo ifcùng một dòng và phân tách chúng bằng dấu chấm phẩy. Và loại bỏ không gian trong [x] for. Ngoài ra, 1if b else-1có thể được thay thế bằng b and 1or-1hoặc 2*bool(b)-1để lưu một byte.
mbomb007

Cảm ơn! Tôi đã xem xét và (cố gắng) sử dụng.d một số trong số họ. Sẽ có một cái nhìn khác thông qua tất cả các câu trả lời một lần nữa sau. :)
1Darco1

Và tôi nghĩ bạn có thể sử dụng một tên không tên lambda, vì nó không đệ quy.
mbomb007

1
t+=[int(x)]canbecomet+=int(x),
Cyoce

3

Groovy ( 99 97 byte)

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

Dùng thử tại đây: https://groovyconsole.appspot.com/edit/5155820207603712

Giải trình:

  • .replaceAll(" TO ","..") - Thay thế bằng một phạm vi truyền thống.
  • .replaceAll(" AND ", ",") - Thay thế tất cả ands bằng dấu phẩy.
  • "[${...}]" - Bao quanh nó với ký hiệu "danh sách" trong Groovy.
  • Eval.me(...) - Đánh giá chuỗi dưới dạng mã Groovy.
  • .flatten() - Làm phẳng hỗn hợp của mảng 2D và mảng 1D thành mảng 1D.
  • .collect{v[it]} - Thu thập các chỉ số từ mảng thành một cấu trúc duy nhất.

Đây là 115 giải pháp 113 byte loại bỏ null khỏi đầu ra: https://groovyconsole.appspot.com/edit/5185924841340928

Đây là một giải pháp 117 byte nếu bạn nói rằng nó PHẢI được lập chỉ mục ở mức 1 thay vì 0: https://groovyconsole.appspot.com/edit/5205468955803648

Nếu bạn muốn tôi trao đổi bản gốc cho byte 113/117, hãy cho tôi biết.


Nếu bạn không thích tôi sử dụng "null" cho các ký tự không có ở đó, +5 byte ở cuối cho "-null", sẽ loại bỏ tất cả null khỏi tập hợp.
Bạch tuộc ma thuật Urn

1
Tôi yêu sự trùng hợp thông minh này
downrep_nation

Tôi đã học được điều gì đó từ điều này, chưa bao giờ biết Groovy có Eval.me(...)cho đến bây giờ; sử dụng nó trong thực tế sẽ không an toàn một cách lố bịch, vẫn là một điều tuyệt vời để biết.
Bạch tuộc ma thuật Urn

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

Phương pháp Ungolfed:

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

Chương trình đầy đủ với các trường hợp thử nghiệm:

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

Một giải pháp ngây thơ, sử dụng danh sách char, sử dụng ' 'như một ký tự trống và hoàn thành công việc. Hy vọng sẽ sớm cải thiện.


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 "")

Giải trình:

(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 ""
) 

2

Python 2, 156 155 byte

Câu trả lời của tôi có một số ý tưởng tương tự như câu trả lời của 1Darco1 , nhưng bằng cách sử dụng một cách tiếp cận khác với bắt đầu (cắt chuỗi thay vì danh sách), nó đã kết thúc ngắn hơn một chút. Nó sẽ ngắn hơn bốn byte nếu cho phép lập chỉ mục 0.

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

Dùng thử trực tuyến

May mắn thay, tôi có thể phân tích các chuỗi chứa khoảng trắng thành số nguyên. Lập chỉ mục tiêu cực trong các chỉ mục Python từ cuối chuỗi, vì vậy tôi sử dụng i[-1]để giống i[0]hoặc giá trị thứ hai, nếu có một. Sau đó, tôi phải điều chỉnh bất kỳ giá trị phạm vi âm nào thành âm hơn , vì vậy chúng sẽ không gây rối với lát cắt. Nhân giá trị âm với 11**9( 2357947691) sẽ chiếm các phạm vi sử dụng giá trị tối thiểu nguyên. Sau đó, chỉ cần cắt chuỗi, sử dụng lát ngược nếu phạm vi bị đảo ngược.

Với chỉ mục không (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

Làm tốt lắm! Cắt lát chắc chắn là cách để đi đây. rangeCách tiếp cận của tôi về cơ bản chỉ là một hình thức siêu dài của chính xác đó. Và bạn thậm chí đã thoát khỏi toàn bộ if"T"in x: else:phần. +1
1Darco1

2

R, 142 byte

Giả sử tôi hiểu đúng thách thức, ở đây tôi giả sử đó rlà mệnh đề phạm vi được xác định trước ở định dạng chuỗi và mảng đầu vào ("Hello world", trong các ví dụ) được đọc từ 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)

Một số trường hợp thử nghiệm:

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

Ungolfed / giải thích

Dòng 1

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

R có một toán tử infix đẹp :tạo ra các chuỗi. 1:5cho [1, 2, 3, 4, 5], và 0:-2cho [0, -1, -2]. Vì vậy, chúng tôi thay thế TOtrong mệnh đề phạm vi lỏng bằng :.

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

Phiên dịch ANDchỉ là ghép. Chúng ta có thể sử dụng hàm ccho điều đó, một cách khéo léo có thể lấy một số lượng đối số tùy ý, được phân tách bằng dấu phẩy. Vì vậy, chúng tôi thay thế ANDbằng,

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

và sau đó quấn toàn bộ điều trong c(, ).

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

Điều này mang lại một chuỗi ký tự có thể trông như thế nào c( 1 : 5 , 7 ). Chúng tôi gọi parseđể chuyển đổi để gõ "biểu thức" và sau đó evalđể đánh giá biểu thức. Chuỗi kết quả của các số sau đó được gán lại cho biến r.

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

Dòng 2

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

Bây giờ là phần xấu xí - xử lý các chuỗi trong R, vốn trở nên lộn xộn nhanh chóng. Đầu tiên chúng ta xác định elà một chuỗi rỗng (chúng ta sẽ cần điều này sau).

                      e<-""

Chúng tôi đọc từ stdin và chuyển đổi chuỗi ký tự thành một mảng các ký tự riêng lẻ bằng cách tách ở chuỗi trống. (Ví dụ chúng ta đi từ "Hi" tới [ "H", "i"].) Lợi nhuận này một danh sách dài 1, vì vậy chúng tôi phải hỏi cho phần tử đầu tiên [[1]]để có được một mảng mà chúng ta có thể làm việc với. Ugh, tôi đã cảnh báo bạn điều này là lộn xộn.

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

Chỉ số R bắt đầu từ 1 và có một tính năng hay với số âm. Giả sử x['a', 'b', 'c']. Gọi x[1]trả lại không ngạc nhiên 'a'. Gọi x[-1]trả về tất cả x ngoại trừ chỉ mục 1, tức là ['b', 'c']. Đây là một tính năng thú vị, nhưng có nghĩa là chúng ta phải cẩn thận với các chỉ số tiêu cực cho vấn đề này. Vì vậy, bây giờ, chúng ta chỉ trả về các phần tử của mảng đầu vào với chỉ mục >0và gán kết quả cho o.

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

Dòng 3

Tuy nhiên, có một vấn đề! Đối với các chỉ số lớn hơn độ dài của mảng, R chỉ trả về NAcác giá trị. Chúng ta cần nó để trả về chuỗi rỗng. Vì vậy, chúng tôi xác định lại các yếu tố trong ođó is.na(o)TRUEchuỗi rỗng.

o[is.na(o)]=e

Dòng 4

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

Cuối cùng, làm thế nào để chúng ta đối phó với các chỉ số âm (và không)? Tất cả đều cần trả về chuỗi trống, vì vậy chúng tôi lặp lại chuỗi trống N lần, trong đó N là số chỉ mục <1.

  rep(e,sum(r<1))

Cuối cùng, chúng tôi ghép nối odanh sách được xác định trước đó vào danh sách này (có khả năng trống).

c(      ...      ,o)

2

JavaScript (ES6), 141

Hàm không tên có 2 tham số, đầu tiên là mảng ký tự (có thể là một chuỗi), chuỗi thứ hai chứa định nghĩa phạm vi.

Giá trị trả về là một mảng trong đó mỗi phần tử có thể là một ký tự đơn hoặc giá trị js undefined. Khi được xâu chuỗi, kết quả này dẫn đến một chuỗi các ký tự được phân tách bằng dấu phẩy không được xác định là char "trống" - như các trường hợp thử nghiệm trong phiên bản đầu tiên của câu hỏi.
Sử dụng .joinbạn có thể nhận được kết quả chuỗi tương tự như đầu ra của trường hợp thử nghiệm trong phiên bản hiện tại của câu hỏi.

(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

Ít chơi gôn

(
 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

Kiểm tra

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>


1

Perl - 110 byte

Gọi tập lệnh trong dòng lệnh với chuỗi là đối số thứ nhất và phạm vi là đối số thứ hai.

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

Khử nhiễu:

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

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

Tất cả các bài kiểm tra là ở ideone

Tách mệnh đề, strên "VÀ", tách từng mệnh đề con kết quả trên "TO", chuyển đổi các chuỗi kết quả thành intsử dụng map. Mỗi kết quả sẽ có 1 hoặc 2 mục (1 nếu không có "TO" trong mệnh đề phụ).
Xây dựng các phạm vi dựa trên 0 cho từng phạm vi sử dụng tham số bước của phạm vi là 1 hoặc -1 bằng cách kiểm tra các giá trị tại các chỉ mục 0 và -1 (một danh sách có một mục nhập có mục đó ở cả hai chỉ mục).
Chạy qua các phạm vi này và xây dựng một danh sách đầu ra, nếu các chỉ mục được cung cấp là trong phạm vi ( if 0<=i<len(a)).


0

Thạch , 28 27 25 byte

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

Dùng thử (cũng sẽ hoạt động với một chuỗi thay vì một mảng char)

Làm sao?

œṣ⁾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

0

Clojure 232 230 229 byte

Ôi thật là một con quái vật tôi đã tạo ra ... Nhưng thực ra đây là 260 khi tôi chuẩn bị gửi nó.

Chỉnh sửa: loại bỏ một không gian từ #(get r %_""), (if_(< f t)(take-nth 2_%)(thể hiện là _).

(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 "))))))))

Ít chơi gôn hơn:

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

Sử dụng clojure.string/splitđể phân chia bởi "VÀ" và "",take-nth bỏ "TO" giữa các số nguyên, đối số hàm khớp xử lý trường hợp của 1 hoặc 2 đối số và đó là về nó.

Gọi hội nghị: (f "Hello World" "1 TO 3 AND 2 AND 8 TO 2")


Bạn có thể loại bỏ rất nhiều byte bằng cách xóa các khoảng trắng nói chung, đặc biệt là giữa các #ký tự.
clismique

Bạn có chắc chắn tôi có thể loại bỏ một khoảng trống giữa bất kỳ #? Tôi đã thử nó mà không thành công, nó được "hợp nhất" với mã thông báo trước đó. Oh, thêm một không gian để loại bỏ trước %đó.
NikoNyrh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.