เพิ่มขึ้นลดลงไม่มีหรือทั้งหมด?


9

รับสองอินพุตเวกเตอร์ / รายการที่ไม่มีตัวเลขที่มีตัวเลข1และ2สตริง (ไม่ใช่คุณไม่สามารถใช้0/1แทนได้) สตริงจะเป็นอย่างใดอย่างหนึ่งต่อไปนี้ (ในตัวพิมพ์เล็กตรงตามที่เขียนด้านล่าง:

increasing
decreasing
ones
twos
all
none

ถ้าสตริงเป็น ____ คุณจะต้องส่งคืนดัชนี ___:

  • increasing... โดยที่รายการเปลี่ยนจาก1เป็น2(ทุกรายการจะ2ติดตามโดยตรงหลังจาก a 1)
  • decreasing... โดยที่รายการเปลี่ยนจาก2เป็น1(ทุกรายการจะ1ติดตามโดยตรงหลังจาก a 2)
  • ones ... ของตัวเลขทั้งหมดนั่นคือ 1
  • twos ... ของตัวเลขทั้งหมดนั่นคือ 2
  • all ... ตัวเลขทั้งหมด
  • none... ไม่มีตัวเลข 0ไม่เป็นไรถ้ารายการถูกทำดัชนี 1 รายการ ตัวเลขติดลบจะใช้ได้ถ้ารายการนั้นเป็นดัชนี 0 คุณสามารถส่งออกรายการหรือสตริงที่ว่างเปล่าได้

กรณีทดสอบ:

สิ่งเหล่านี้เป็น 1 ดัชนี คุณสามารถเลือกได้ว่าต้องการดัชนี 1 ดัชนีหรือ 0 ดัชนี ใช้เวกเตอร์เดียวกันสำหรับสตริงที่แตกต่างกันในกรณีทดสอบ

--------------------------------
Vector:
1 1 2 2 2 1 2 2 1 1 2

String       - Output
increasing   - 3, 7, 11
decreasing   - 6, 9
ones         - 1, 2, 6, 9, 10 
twos         - 3, 4, 5, 7, 8, 11
all          - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
none         - 0 / []

------------------------------------
Vector:
1

String:
ones         - 1
all          - 1
decreasing / increasing / twos / none  - 0 / []

เกณฑ์การให้คะแนน

เช่นนี้คือ คำตอบที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ

คำอธิบายได้รับการสนับสนุน!


@ RobertoGraham ใช่
Stewie Griffin

@KevinCruijssen คุณเป็นผู้เดาที่ดี :)
Stewie Griffin

จนถึงขณะนี้ไม่มีคำตอบใดที่ดูเหมือนจะส่งออกรายการตามที่แสดงในตัวอย่าง (เช่นเข้าร่วมโดย "," โดยไม่มีตัวคั่นต่อท้าย) เนื่องจากข้อความท้าทายไม่ได้บอกว่ารายการมีความยืดหยุ่นได้อย่างไรปกติแล้วสิ่งใดที่เป็นที่ยอมรับสำหรับความท้าทายเช่นนี้
Tahg

ปกติแล้วมันจะมีความยืดหยุ่นสูง ตราบใดที่มันเป็นรายการของตัวเลขคุณก็โอเค
Stewie Griffin

คำตอบ:


7

JavaScript (Firefox 30-57), 74 73 ไบต์

(a,[s],i=0,p)=>[for(e of a)if({i:e>p,d:e<p,o:e<2,t:e>1,a:1}[p=e,i++,s])i]

Array comprehensions เป็นวิธีการรวมที่เป็นระเบียบmapและfilterในครั้งเดียว แก้ไข: บันทึก 1 ไบต์ขอบคุณ @ edc65


3

Python 2 , 136 131 119 108 97 ไบต์

  • บันทึกห้าไบต์ ใช้lambdaฟังก์ชั่น
  • ที่บันทึกไว้สิบสองไบต์ขอบคุณที่TFeld ; ตีสองเงื่อนไข
  • ไบต์สิบเอ็ดที่บันทึกไว้ต้องขอบคุณMr. Xcoder ; ใช้แทนenumerate()range(len())
  • ที่บันทึกไว้สิบเอ็ดไบต์โดยใช้รายการแทนพจนานุกรมและการใช้0-indexing (ในขณะที่คำตอบ TFeld ของ ) และการเล่นกอล์ฟไป"adinot".find(m[0])ord(m[0])/3-32
lambda l,m:[j for j,k in enumerate(l)if[1,j*k<j*l[~-j],0,j*k>j*l[~-j],0,k<2,k>1][ord(m[0])/3-32]]

ลองออนไลน์!


ตั้งแต่การป้อนข้อมูลอยู่เสมอ1หรือ2คุณสามารถเปลี่ยน(l[j]>1)*(l[~-j]<2)ไป(l[j]>l[~-j]) สำหรับ119 ไบต์
TFeld

นอกจากนี้คุณสามารถบันทึกไบต์ด้วยการเปลี่ยนเป็นดัชนี 0
TFeld

@TFeld ขอบคุณ; แม้ว่าฉันคิดว่าฉันจะติดกับ1-exexed
Jonathan Frech

108 bytes , ใช้enumerate()
Mr. Xcoder



2

MATL , 32 31 30 29 ไบต์

dQ~fQGqfOOGofGd1=fQGfO[]Xhjs)

เอาต์พุตเป็นแบบ 1 หรือว่างเปล่า

ลองออนไลน์!

คำอธิบาย

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

ในการเลือกเอาท์พุตจะมีการเพิ่มรหัสจุด ASCII ของอักขระทั้งหมดของอินพุตสตริง ผลที่ตามมาโมดูโล 9 ให้6, 1, 5, 2, 7, 0ตามลำดับ'increasing', 'decreasing', 'ones', 'twos', 'all','none' ,เนื่องจากตัวเลขที่ได้ทั้งหมดนั้นแตกต่างกันจึงสามารถใช้เป็นเกณฑ์การคัดเลือกได้

แทนที่จะทำการดำเนินการแบบโมดูโล 9 จริง ๆ บนผลรวมรายการของอินพุตที่เป็นไปได้จะขยายไปถึง 9 รายการ (บางอันมีดัมมี่) และการทำดัชนีในรายการนั้นจะทำแบบโมดูโล 9 โดยอัตโนมัติ

d     % Implicit input: numeric vector. Push vector of consecutive differences.
      % Contains -1, 0 or 1
Q~    % For each entry: add 1, negate. This turns -1 into 1, other values into 0
f     % Push indices of nonzeros
Q     % Add 1 to each entry (compensates the fact that computing consecutive
      % differences removes one entry). This the output for 'decreasing'
Gq    % Push input again. Subtract 1 from the code points
f     % Push indices of nonzeros. This is the output for 'twos'
OO    % Push two zeros. These are used as placeholders
Go    % Push input and compute parity of each entry
f     % Push indices of nonzeros. This is the output for 'ones'
Gd    % Push input and compute consecutive differences
1=    % Test each entry for equality with 1
f     % Push indices of nonzeros 
Q     % Add 1. This is the output for 'increasing'
Gf    % Push indices for all input (nonzero) entries. This is the output for 'all'
O     % Push zeros. Used as placeholder
[]    % Push empty array. This is the output for 'none'
Xh    % Concatenate stack into a cell array
j     % Input a string
s     % Sum of code points
)     % Use as an index into the cell aray. Implicitly display


1

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

>2\0;
NÇ
Ị
=2

ḟ
⁹Ḣ“hɠ»iµĿT

ลองออนไลน์!

-3 ขอบคุณที่โจนาธานอัลลัน


บันทึกสามไบต์โดยใช้คำในพจนานุกรม "diota" - โปรดทราบว่าลิงก์ 0 ทำให้ถูกต้อง แต่คุณสามารถเรียงลำดับใหม่อีกครั้งและใช้ "ยาแก้พิษ" หรือคำอื่น ๆ และอนุญาตให้ชุดทดสอบของคุณทำงานอีกครั้ง
Jonathan Allan

@JanathanAllan ฉันคิดว่าลิงค์0เป็นลิงค์ที่อยู่ล่างสุด แต่เห็นได้ชัดว่ามันเหมือนÇแต่มันแปลกมากขอบคุณ! (และฉันเพิ่งเรียนรู้คำศัพท์ใหม่: p)
Erik the Outgolfer

1

Husk , 27 ไบต์

`fN!+mmëI=2ε¬moΘẊe><€¨Ÿȧö¨←

ลองออนไลน์!

-9 ขอบคุณที่H.PWiz

ฉันค่อนข้างภูมิใจในคำตอบนี้


แข็งแรงเล่นกอล์ฟโดยส่วนใหญ่ใช้ΘẊ>และΘẊ<และ`fN
H.PWiz

@ H.PWiz ฉันไม่เห็นเหล่านั้นอย่างสุจริต
Erik the Outgolfer

-1 ไบต์รายการดัชนีที่0เป็นองค์ประกอบสุดท้าย
H.PWiz

@ H.PWiz Ooh ฉันคิดว่าสตริงการบีบอัดจะเป็น¨₆Żσa¨แทนนั่นคือเหตุผลที่ฉันไม่ได้ใช้คุณสมบัตินั้นขอบคุณ และตอนนี้ฉันสามารถพูดได้ผูกวุ้น
Erik the Outgolfer

1

Java (OpenJDK 8) , 266 217 213 205 172 171 155 131 131 ไบต์

s->a->{int i=0,l=0,c=s.charAt(0)-97;for(int e:a){if(++i>1&(c==8&e>l|c==3&e<l)|c==14&(l=e)<2|c>18&l>1|c<1)System.out.print(i+",");}}

ลองออนไลน์!


หากคุณกำหนดyเป็นcharคุณทดสอบความเสมอภาคกอล์ฟสามารถชอบy.equals("a")ไปy=='a', หรือแม้กระทั่งy==97 y<98
Jonathan Frech

@JonathanFrech เป็นเพียงการเปลี่ยน :)
Roberto Graham

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

ตั้งแต่19เป็นc's คุ้มค่าสูงสุดเท่ากับc==19 c>18
Jonathan Frech

2
131 ไบต์:s->a->{int i=0,l=0,c=s.charAt(0)-97;for(int e:a){if(++i>1&(c==8&e>l|c==3&e<l)|c==14&(l=e)<2|c>18&l>1|c<1)System.out.print(i+",");}}
2560

1

Jq 1.5 , 131 ไบต์

ตามแนวทางของxcaliตั้งแต่การจับคู่สตริงสั้นกว่ารุ่นอาร์เรย์ของฉัน

def D(s):[.[1]|gsub(" ";"")|match(s;"g").offset+(s|length)];./"
"|{i:D("12"),d:D("21"),o:D("1"),t:D("12"),a:D("."),n:[]}[.[0][0:1]]

ถือว่า jq ถูกเรียกใช้โดยมี-Rsตัวเลือกและอินพุตจะปรากฏในสองบรรทัดเช่น

decreasing
1 1 2 2 2 1 2 2 1 1 2

ขยาย:

def D(s): [
      .[1]                              # find where s appears
    | gsub(" ";"")                      # in the input and add
    | match(s;"g").offset + (s|length)  # length to get ending index
  ]
;

  ./"\n"                                # split on newline
| {i:D("12"),                           # increasing
   d:D("21"),                           # decreasing
   o:D("1"),                            # ones
   t:D("2"),                            # twos
   a:D("."),                            # all
   n:[]                                 # none
  }[.[0][0:1]]

ลองออนไลน์!



1

J, 73 ไบต์

g=.[:I.[=0,2-/\]
(_1 g])`(1 g])`(1=])`(2=])`(i.@#@])`_1:@.('idotan'i.{.@[)

จะอยากรู้อยากเห็นว่าสิ่งนี้สามารถย่ออย่างมีนัยสำคัญ - ฉันเชื่อว่ามันสามารถ (10 ตัวอักษรเพียงสำหรับทุกวาระ parens เหล่านั้น!)

  • g- กริยาช่วยสำหรับการเพิ่มและลดซึ่งเพียงจำนวนเพื่อเปรียบเทียบค่าของการ\ดำเนินการมัดขนาด 2
  • ส่วนที่เหลือเพียงแค่คว้าตัวอักษรแรกจาก "คำสั่ง" และดำเนินการกรณีที่เกี่ยวข้องโดยใช้วาระ @.

ลองออนไลน์!


ทำ1=]และ2=]ไม่ทำงาน นอกจากนี้จะเกิดอะไรขึ้นถ้าgเอาตัวเลขเป็นอาร์กิวเมนต์ซ้ายและรายการเป็นอาร์กิวเมนต์ขวาและส่งกลับดัชนีที่2-/\ ใช้กับรายการเท่ากับอาร์กิวเมนต์ซ้าย ด้วยวิธีนี้คุณสามารถผ่าน_1หรือ1ค้นหาการลดลงและเพิ่มขึ้นแทนที่จะใช้คำวิเศษณ์
โคล

@cole ความคิดเห็นที่ดี ฉันทำการเปลี่ยนแปลงและผลลัพธ์นั้นสะอาดกว่ามากแม้ว่า 73 จะยังคงดูเหมือนจำนวนไบต์สูง ฉันหมายถึง J กำลังผูก JS ที่นี่ .... ความอัปยศ!
โจนาห์

0

Java 8, 233 229 216 ไบต์

l->s->{int i=s.charAt(0)-97,k=0,j=1;for(s=(l+"").replaceAll("[^12]","");s.length()*j>0;System.out.print(j++<0?"":(k+=j)+","),s=s.substring(j))j=i<1?0:s.indexOf(i<4?"21":i<9?"12":i<14?" ":i<15?"1":"2")+(i>2&i<9?1:0);}

วิธีการของ String นี้จบลงได้นานกว่าที่ฉันคาดไว้ .. แต่ถึงแม้ฉันจะคิดออกไปอย่างมหาศาลโดยคำตอบ Java 8 อื่น ๆฉันก็ตัดสินใจโพสต์มันต่อไป
มันสามารถตีกอล์ฟได้อย่างแน่นอนแม้จะใช้วิธีนี้ .. "ไม่มี" และ "การเพิ่ม / ลดลง" ส่วนใหญ่ทำให้การแก้ไขปัญหาบางอย่างที่ค่าใช้จ่ายไบต์บาง ..

ผลลัพธ์จะเป็น 1 ดัชนี

คำอธิบาย:

ลองที่นี่

l->s->{                          // Method with List and String parameters
  int i=s.charAt(0)-97,          //  First character of the String - 97
                                 //   (i=8; d=3; o=14; t=19; a=0; n=13)
      k=0,                       //  Total counter
      j=1;                       //  Index integer
  for(s=(l+"")                   //  toString of the List,
         .replaceAll("[^12]","");//   and leave only the 1s and 2s 
      s.length()*j>0             //  Loop as long as `j` and the size of the String
                                 //  are both larger than 0
      ;                          //   After every iteration:
      System.out.print(          //    Print:
       j++<0?                    //     If `j` is -1:
        ""                       //      Print nothing
       :                         //     Else:
        (k+=j)+",")              //      Print the current index
      ,s=s.substring(j))         //    And then remove the part of the String we've checked
    j=i<1?                       //   If "all":
                                 //    Change `j` to 0
      :                          //   Else:
       s.indexOf(                //    Replace `j` with the next index of:
        i<1?                     //     If "all":
         s.charAt(0)+""          //      The next character
        :i<4?                    //     Else-if "decreasing":
         "21"                    //      Literal "21"
        :i<9?                    //     Else-if "increasing":
         "12"                    //      Literal "12"
        :i<14?                   //     Else-if "none":
         " "                     //      Literal space (any char that isn't present)
        :i<15?                   //     Else-if "one":
         "1"                     //      Literal "1"
        :                        //     Else(-if "two"):
         "2")                    //      Literal "2"
       +(i>2&i<9?1:0);           //     +1 if it's "increasing"/"decreasing"
                                 //  End of loop (implicit / single-line body)
}                                // End of method

0

Perl 5 , 71 + 2 ( -nl) = 73 ไบต์

$p=/l/?'.':/t/?2:/^o/?1:/d/?21:/i/?12:0;$_=<>;s/ //g;say pos while/$p/g

ลองออนไลน์!

ตรรกะที่ได้รับการแก้ไขมีประสิทธิภาพเช่นเดียวกับคำอธิบายด้านล่าง แต่รูปแบบการจับคู่สั้นลง

ก่อนหน้านี้:

$p=/all/?'.':/^o/?1:/^t/?2:/^d/?21:/^i/?12:0;$_=<>;s/ //g;say pos while/$p/g

ลองออนไลน์!

แสดงผลใด ๆ หากเกณฑ์ไม่ตรงกัน

อธิบาย:

$p=          # set the pattern to seach based on the input string
  /all/?'.'  # any character
 :/^o/?1     # starts with 'o', find ones
 :/^t/?2     # starts with 't', find twos
 :/^d/?21    # starts with 'd', find decreasing
 :/^i/?12    # starts with 'i', find increasing
 :0;         # anything else: create pattern that won't match
$_=<>;s/ //g;# read the digits and remove spaces
say pos while/$p/g # output position(s) of all matches
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.