ตีความช่วงหลวม


13

ตีความช่วงหลวม

ListSharpเป็นภาษาการเขียนโปรแกรมตีความที่มีคุณสมบัติมากมายหนึ่งในคุณสมบัติเหล่านั้นเป็นผู้สร้างช่วงดัชนี 1 ที่ทำงานเช่นนี้:

คุณกำหนดช่วงเป็น(INT) TO (INT)หรือ(INT)ที่ทั้งสองหรือ int เดียวสามารถไปจากค่า min ถึงmax int32

จากนั้นคุณสามารถใช้ช่วงเหล่านั้นเพื่อแยกองค์ประกอบของอาร์เรย์โดยไม่ต้องกลัวที่จะก้าวล้ำขอบเขตของมัน


ดังนั้น:

1 TO 5 สร้าง: {1,2,3,4,5}

3 สร้าง: {3}

สามารถเพิ่มช่วงได้โดยใช้ANDโอเปอเรเตอร์

1 TO 5 AND 3 TO 6 สร้าง: {1,2,3,4,5,3,4,5,6}

จำได้ว่ามันใช้ได้กับจำนวนลบเช่นกัน

3 TO -3 สร้าง: {3,2,1,0,-1,-2,-3}


ความท้าทายมีดังต่อไปนี้:

อินพุต

อาร์เรย์อักขระและประโยคช่วงที่กำหนดไว้ก่อนหน้าเป็นสตริง

เอาท์พุต

องค์ประกอบที่ 1 ตามดัชนีตำแหน่งของช่วง (ดัชนีที่ไม่อยู่ / ลบที่มีอยู่แปลเป็นอักขระว่าง)


วิธีที่จะชนะ

ในฐานะที่เป็นความท้าทายของคุณควรสร้างโปรแกรมด้วยจำนวนไบต์ที่สั้นที่สุดที่จะชนะ


มันชี้ให้เห็นว่าไม่มีตัวอักษรว่างเปล่าดังนั้นคุณควรเพิกเฉยพวกเขา (ฉันแสดงให้พวกเขาที่นี่เพื่อให้ง่ายต่อการเข้าใจ แต่มันทำให้คนสับสน)

กรณีทดสอบ:

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
เราอนุญาตให้ใช้ 0-index แทน 1-index เป็นสตริงที่ป้อนเข้าได้หรือไม่? ดังนั้นช่วงของช่วงกลายเป็น"0 TO 2"=> {'H', 'e', 'l'}?
Kevin Cruijssen

ตาราง ASCII ไม่มีอักขระว่างเปล่า (ยกเว้นอักขระที่ไม่สามารถพิมพ์ได้) มีอะไรผิดปกติกับการใช้พื้นที่?
adrianmp

อาร์เรย์ถ่านนั้นเป็นสตริงดังนั้นสำหรับตัวอักษรที่ว่างเปล่าจะไม่ถูกพิมพ์หรือส่งคืน
downrep_nation

1
นอกจากนี้เช่น3 TO 3เคยจะเป็นอินพุทและเอาท์พุทที่คาดหวังคืออะไร?
Jordan

1
คุณจำเป็นต้องมีกรณีทดสอบสำหรับANDการเพิ่มช่วงทวีคูณ นอกจากนี้คุณไม่ได้ตอบว่าเราสามารถใช้การทำดัชนีแบบ zero-based ซึ่งเป็นมาตรฐานในภาษาส่วนใหญ่
mbomb007

คำตอบ:


5

Python 2 - 239 211 210 ไบต์

ขอบคุณ@ mbomb007และ@Cyoceสำหรับการตีกอล์ฟต่อไปในโซลูชันนี้!

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

วิธีการตรงไปข้างหน้า เครื่องกำเนิดไฟฟ้าที่พยายามและรุ่นซ้ำ แต่พวกเขาไม่สามารถเอาชนะความเรียบง่ายสำหรับแต่ละวง ฉันเป็นนักเล่นกอล์ฟดังนั้นนี่อาจปรับปรุงได้บ้าง นอกจากนี้ข้อบกพร่องที่สำคัญของตัวอย่างนี้คือช่วงเป็นวัตถุรายการจะถูกคำนวณอีกครั้งทุกครั้งที่องค์ประกอบถูกดึงออกมาจากอาร์เรย์ตัวละคร (ดูบรรทัดสุดท้ายรายการเข้าใจ) วิธีการนี้r(s)จะดำเนินการlen(r(s)) + 1ครั้ง

รหัสไม่ได้รับการตอบกลับ:

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

เอาท์พุท:

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

คำตอบแรกที่ดี! ยินดีต้อนรับสู่ PPCG!
mbomb007

คุณอาจได้รับประโยชน์จากการดูเคล็ดลับสำหรับการเล่นกอล์ฟในหลาม คุณสามารถแทนที่ 2 ช่องว่างสำหรับการเยื้องสองครั้งด้วยแท็บเดียว คุณสามารถใส่รหัสตามifบรรทัดเดียวกันและแยกด้วยเครื่องหมายอัฒภาค [x] forและลบพื้นที่ใน นอกจากนี้ยัง1if b else-1สามารถแทนที่ด้วยอย่างใดอย่างหนึ่งb and 1or-1หรือ2*bool(b)-1เพื่อบันทึกไบต์
mbomb007

ขอบคุณ! ฉันดูแล้วและ (พยายาม) ใช้งานบางส่วน จะได้ดูผ่านคำตอบทั้งหมดอีกครั้งในภายหลัง :)
1Darco1

และฉันคิดว่าคุณสามารถใช้ชื่อlambdaเนื่องจากมันไม่ซ้ำ
mbomb007

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

3

Groovy ( 99 97 ไบต์)

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

ลองที่นี่: https://groovyconsole.appspot.com/edit/5155820207603712

คำอธิบาย:

  • .replaceAll(" TO ","..") - แทนที่ด้วยเป็นช่วงดั้งเดิม
  • .replaceAll(" AND ", ",") - แทนที่ alls ด้วยเครื่องหมายจุลภาค
  • "[${...}]" - ล้อมรอบด้วยสัญกรณ์ "รายการ" ใน Groovy
  • Eval.me(...) - ประเมินสตริงเป็นโค้ด Groovy
  • .flatten() - ปรับส่วนผสมของอาร์เรย์ 2D และ 1D ลงในอาร์เรย์ 1D
  • .collect{v[it]} - รวบรวมดัชนีจากอาร์เรย์ให้เป็นโครงสร้างเดียว

นี่คือวิธีแก้ปัญหา115 113 ไบต์ลบ nulls จากผลลัพธ์: https://groovyconsole.appspot.com/edit/5185924841340928

นี่คือวิธีแก้ปัญหา 117 ไบต์ถ้าคุณบอกว่าจะต้องทำดัชนีที่ 1 แทนที่จะเป็น 0: https://groovyconsole.appspot.com/edit/5205468955803648

หากคุณต้องการให้ฉันแลกเปลี่ยนต้นฉบับสำหรับ 113/117 ไบต์ให้ฉันรู้


หากคุณไม่ชอบให้ฉันใช้ "nulls" สำหรับตัวละครที่ไม่มีอยู่ +5 bytes ที่ส่วนท้ายของ "-null" ซึ่งจะลบ nulls ทั้งหมดออกจากชุด
Magic Octopus Urn

1
ฉันรักความบังเอิญที่ชาญฉลาดนี้
downrep_nation

แม้ว่าฉันจะเรียนรู้อะไรบางอย่างจากนี้ไม่เคยรู้ว่า Groovy มีมาEval.me(...)จนถึงตอนนี้; เมื่อใช้มันในทางปฏิบัติจะไม่ปลอดภัยอย่างน่าขัน แต่ก็ยังเป็นสิ่งที่น่ารู้
Magic Octopus Urn

2

C #, 342 ไบต์

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

วิธี 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();
}

โปรแกรมเต็มรูปแบบพร้อมกรณีทดสอบ:

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

โซลูชันไร้เดียงสาโดยใช้รายการ char ซึ่งใช้' 'เป็นอักขระว่างและทำงานให้เสร็จ หวังว่าจะปรับปรุงในไม่ช้า


2

สกาลา, 165 ไบต์

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

คำอธิบาย:

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

คำตอบของฉันมีความคิดคล้าย ๆ กันกับคำตอบของ 1Darco1 แต่ด้วยการใช้วิธีการที่แตกต่างจากจุดเริ่มต้น (การแบ่งสตริงแทนที่จะเป็นรายการ) มันสิ้นสุดลงค่อนข้างสั้นลงเล็กน้อย มันจะสั้นลงสี่ไบต์หากอนุญาตให้สร้างดัชนีได้ 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

ลองออนไลน์

โชคดีที่ฉันสามารถแยกสตริงที่มีช่องว่างเป็นจำนวนเต็ม การจัดทำดัชนีเชิงลบใน Python จัดทำดัชนีจากจุดสิ้นสุดของสตริงดังนั้นฉันใช้i[-1]เพื่อให้เหมือนกันi[0]หรือค่าที่สองถ้ามี จากนั้นฉันต้องปรับค่าช่วงลบใด ๆ ให้เป็นลบมากขึ้นดังนั้นพวกเขาจะไม่ยุ่งกับการแบ่งส่วน การลบค่าลบคูณด้วย11**9( 2357947691) จะบัญชีสำหรับช่วงโดยใช้ค่า min จำนวนเต็ม จากนั้นก็แบ่งสตริงโดยใช้ย้อนกลับถ้าช่วงที่ถูกย้อนกลับ

ด้วยการทำดัชนีศูนย์ (151 ไบต์):

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

เยี่ยมมาก! การหั่นเป็นวิธีที่จะไปที่นี่อย่างแน่นอน rangeวิธีการของฉันนั้นเป็นเพียงรูปแบบ verbose ที่ยอดเยี่ยม และคุณก็กำจัดif"T"in x: else:ส่วนทั้งหมด +1
1Darco1

2

R, 142 ไบต์

สมมติว่าฉันเข้าใจความท้าทายได้อย่างถูกต้องที่นี่ฉันกำลังสันนิษฐานว่าrเป็นประโยคช่วงที่กำหนดไว้ล่วงหน้าในรูปแบบสตริงและอาร์เรย์อินพุต ("Hello world" ในตัวอย่าง) อ่านจาก 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)

กรณีทดสอบบางส่วน:

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 / อธิบาย

บรรทัด 1

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

R มีตัวดำเนินการมัดที่ดี:ซึ่งสร้างลำดับ 1:5ให้[1, 2, 3, 4, 5]และจะช่วยให้0:-2 [0, -1, -2]ดังนั้นเรามาแทนที่ในช่วงข้อหลวมTO:

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

การตีความหมายANDเพียงการต่อกัน เราสามารถใช้ฟังก์ชั่นcสำหรับสิ่งนั้นซึ่งแยกแยะด้วยเครื่องหมายจุลภาคได้อย่างคล่องแคล่ว ดังนั้นเราจึงแทนที่ANDด้วย,

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

แล้วห่อหุ้มสิ่งทั้งหมดไว้ในc(, ).

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

c( 1 : 5 , 7 )นี้อัตราผลตอบแทนสตริงอักขระที่จะมีลักษณะเหมือน เราเรียกparseให้แปลงเป็นประเภท "expression" จากนั้นevalประเมินค่านิพจน์ ลำดับของผลลัพธ์ที่ได้จะถูกกำหนดให้กับตัวแปรrอีกครั้ง

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

บรรทัด 2

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

ตอนนี้สำหรับส่วนที่น่าเกลียด - การจัดการกับสตริงใน R ซึ่งได้รับยุ่งอย่างรวดเร็ว อันดับแรกเราจะกำหนดeให้เป็นสตริงว่าง (เราจะต้องใช้ในภายหลัง)

                      e<-""

เราอ่านจาก stdin และแปลงสตริงอักขระเป็นอาร์เรย์ของอักขระแต่ละตัวโดยแยกที่สตริงว่าง (เช่นเราไปจาก "Hi" ถึง ["H", "i"]) สิ่งนี้จะส่งกลับรายการความยาว 1 ดังนั้นเราต้องขอองค์ประกอบแรก[[1]]เพื่อรับอาร์เรย์ที่เราสามารถทำงานได้ เอ่อฉันเตือนคุณว่านี่ยุ่ง

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

ดัชนี R เริ่มต้นที่ 1 และมีคุณสมบัติที่ดีพร้อมตัวเลขติดลบ สมมติว่ามีx ['a', 'b', 'c']โทรผลตอบแทนที่น่าแปลกใจx[1] 'a'โทรx[-1]ผลตอบแทนทั้งหมดx ยกเว้นดัชนีคือ1 ['b', 'c']นี่คือคุณสมบัติที่ยอดเยี่ยม แต่หมายความว่าเราจะต้องระมัดระวังกับดัชนีลบของเราสำหรับปัญหานี้ ดังนั้นตอนนี้เราก็กลับมาองค์ประกอบของอาร์เรย์การป้อนข้อมูลที่มีดัชนีและกำหนดผลให้>0o

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

บรรทัดที่ 3

อย่างไรก็ตามมีปัญหา! สำหรับดัชนีที่มากกว่าความยาวของอาร์เรย์ R จะส่งคืนNAค่า เราต้องการมันเพื่อส่งคืนสตริงว่าง ดังนั้นเราจึง redefine องค์ประกอบของoที่is.na(o)เป็นTRUEจะเป็นสตริงที่ว่างเปล่า

o[is.na(o)]=e

บรรทัด 4

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

ในที่สุดเราจะจัดการกับดัชนีลบ (และศูนย์) ได้อย่างไร พวกเขาทั้งหมดต้องกลับสตริงที่ว่างเปล่าดังนั้นเราจึงทำซ้ำว่างครั้งสตริง N ซึ่ง N <1คือจำนวนของดัชนีที่มี

  rep(e,sum(r<1))

ในที่สุดเราเชื่อมต่อรายการที่กำหนดไว้ก่อนหน้าoนี้ (อาจว่างเปล่า) ก่อนหน้านี้

c(      ...      ,o)

2

JavaScript (ES6), 141

ฟังก์ชั่นที่ไม่มีชื่อกับพารามิเตอร์ 2 ตัวแรกคืออาเรย์ตัวละคร

undefinedค่าตอบแทนเป็นอาร์เรย์ที่แต่ละองค์ประกอบสามารถเป็นได้ทั้งตัวอักษรตัวเดียวหรือมูลค่า js เมื่อมีการทำให้เป็นสตริงผลลัพธ์นี้จะเรียงตามลำดับตัวอักษรที่คั่นด้วยเครื่องหมายจุลภาคโดยไม่ได้กำหนดซึ่งแสดงเป็นอักขระ "ว่าง" - เป็นกรณีทดสอบในคำถามรุ่นแรก
การใช้.joinคุณสามารถรับผลลัพธ์สตริงคล้ายกับเอาต์พุตกรณีทดสอบในคำถามรุ่นปัจจุบัน

(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

น้อย golfed

(
 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

ทดสอบ

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 ไบต์

การเรียกใช้สคริปต์ในบรรทัดคำสั่งด้วยสตริงเป็นอาร์กิวเมนต์แรกและช่วงเป็นวินาที

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

ยกเลิกการทำให้งง:

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 ไบต์

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

การทดสอบทั้งหมดอยู่ที่ideone

แยกประโยคsใน "และ" แยกแต่ละที่เกิดข้อย่อยใน "กับ" แปลงสตริงผลการใช้int mapผลลัพธ์แต่ละรายการจะมี 1 หรือ 2 รายการ (1 หากไม่มี "TO" แสดงอยู่ในส่วนย่อย)
สร้างช่วงที่อิง 0 สำหรับแต่ละช่วงโดยใช้พารามิเตอร์ขั้นตอนของช่วงเป็น 1 หรือ -1 โดยการตรวจสอบค่าที่ดัชนี 0 และ -1 (รายการที่มีหนึ่งรายการมีรายการนั้นที่ดัชนีทั้งสอง)
วิ่งผ่านช่วงเหล่านี้และสร้างรายการเอาท์พุทถ้าดัชนีที่มีอยู่ในช่วง ( if 0<=i<len(a))


0

เยลลี่ , 28 27 25 ไบต์

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

TryItOnline (จะทำงานกับสตริงแทนอาร์เรย์อักขระ char)

อย่างไร?

œṣ⁾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 ไบต์

โอ้สัตว์ประหลาดที่ข้าสร้างขึ้น ... แต่จริงๆแล้วมันคือ 260 ตอนที่ข้าจะส่งมัน

แก้ไข: ลบออกพื้นที่จาก#(get r %_""), (if_(< f t)และ(take-nth 2_%)(แสดงเป็น_)

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

หักกอล์ฟ:

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

ใช้clojure.string/splitเพื่อแยกโดย "AND" และ ""take-nthปล่อย "ถึง" ระหว่างจำนวนเต็ม, การจับคู่การทำงานของอาร์กิวเมนต์จะจัดการกับกรณีของอาร์กิวเมนต์ 1 หรือ 2 อาร์กิวเมนต์และที่เกี่ยวกับมัน

แบบแผนการโทร: (f "Hello World" "1 TO 3 AND 2 AND 8 TO 2")


คุณสามารถลบ heck จำนวนมากโดยการลบช่องว่างโดยทั่วไปโดยเฉพาะระหว่าง#ตัวอักษร
clismique

คุณแน่ใจว่าฉันจะลบช่องว่างระหว่างใด#? ฉันพยายามมันไม่สำเร็จมันจะ "รวม" กับโทเค็นก่อนหน้า โอ้อีกหนึ่งช่องว่างที่จะลบก่อนหน้า%นั้น
NikoNyrh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.