สลับสวิตช์บางตัวบนสวิตช์บอร์ด


23

แรงบันดาลใจจากความท้าทายนี้นี้

เป้าหมาย:

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

สวิตช์บอร์ดประกอบไปด้วยสวิตช์จำนวนหนึ่ง ( vหรือ^) ที่พัน-กันและจัดเรียงเป็นแถวที่มีความยาวต่างกัน นี่คือตัวอย่างสวิตช์บอร์ด:

-v-^-v-
-^-v-
-v-^-v-

ในการสลับกลับ / พลิกสวิตช์หมายถึงการเปลี่ยนจากvเป็น^หรือจาก^เป็นvไป

สวิตช์ถูกทำดัชนีจากซ้ายไปขวา, จากบนลงล่าง เช่นในตัวอย่างด้านบนสุดท้ายvในแถวแรกจะอยู่ในตำแหน่งที่ 3 และ^ในแถวกลางจะอยู่ที่ 4 (โดยใช้การจัดทำดัชนี 1)

การป้อนข้อมูล:

  • สตริง (หรือรายการสตริง) ที่แสดงถึงสวิตช์บอร์ด มันมีการประกันเพื่อให้ตรงกับ ((-[v^])+-)(\n(-[v^])+-)*regex
  • รายการหมายเลขว่างที่อาจเป็นตัวแทนดัชนีอาจเป็น 0 หรือ 1 (หรือบางหมายเลขก็ได้ถ้าคุณต้องการ) จัดทำดัชนี นี่คือสวิตช์ที่จำเป็นต้องพลิก

เอาท์พุท:

  • สวิตช์บอร์ดในรูปร่างเดียวกับอินพุตพร้อมกับสวิตช์ที่ระบุกลับด้าน สวิตช์ที่ไม่ระบุใด ๆ ควรรักษาสถานะเริ่มต้น

กฎ:

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

ตัวอย่าง:

#Using 1-indexing
input: #Empty Case
[],
-v-^-v-

output:
-v-^-v-

input: #Single switch
[1],
-v-

output:
-^-

input: #Skip a line
[3,5],
-^-v-v-
-v-
-^-^-

output:
-^-v-^-
-v-
-v-^-

input: #Flip one in each line + number wrap
[3,4,6],
-^-v-v-
-v-
-^-^-

output:
-^-v-^-
-^-
-^-v-

input: #Flip 'em all
[1,2,3,4,5,6],
-^-v-v-
-v-
-^-^-

output:
-v-^-^-
-^-
-v-v-

เราสามารถส่งออกอาร์เรย์ char แบบสี่เหลี่ยมโดยการเติมด้านขวาของบรรทัดที่สั้นกว่าด้วยช่องว่างได้หรือไม่? นอกจากนี้เราสามารถรับข้อมูลในรูปแบบนั้นได้หรือไม่?
Luis Mendo

@ LuisMendo ฉันจะบอกว่าไม่รับสิ่งนั้นในฐานะอินพุต พื้นที่สีขาวต่อท้ายนั้นใช้ได้ตราบใดที่ดูเหมือนอินพุต
Veskah

2
เคล็ดลับในการตรวจสอบว่าอักขระมี>"-"ดังนี้: เนื่องจากสตริงอินพุตมีการรับประกันว่าจะเริ่มต้นด้วย-คุณสามารถตรวจสอบกับพารามิเตอร์ / อาร์กิวเมนต์ / ชื่อตัวแปรที่คุณใช้แทน
Shaggy

คำตอบ:


11

Vim, 60, 46, 38 , 37 bytes / keystrokes

qq/\d
ggDJ@"/[v^]
sv^<esc>l?\V<C-r>"
x@qq4u@q

<esc>และ<C-r>มีทั้ง 1 ไบต์ / การกดแป้น เคาน์เตอร์ไบต์

กรณีทดสอบ 1 (โหมด verbose)

กรณีทดสอบ 2 (โหมด verbose)

ขอบคุณ Grimy สำหรับแนวคิดที่นำไปสู่การลดลง 22 ไบต์ :)


2
@Veskah ughhhhhh เป็นกลุ่มสุดจู้จี้จุกจิกเกี่ยวกับ "ทำอะไรบางอย่าง 0 ครั้ง" กรณีขอบ ดูการแก้ไข
DJMcMayhem

ไม่สามารถ:s/\%V./\='v^'[submatch(0)=='v']เป็นcl<C-R>='v^'['<C-R>"'=='v']-13 ไบต์ได้ใช่ไหม (<CR> แต่ละรายการมีเพียงหนึ่งไบต์เท่านั้น)
Grimmy

2
@Grimy Ooh ความคิดที่ดี นอกจากนี้ยังs == clดังนั้น-14โดยรวม
DJMcMayhem

ความคิดอื่น ๆ : หรือs^v!<Esc>?\<C-R>"<CR>xhf!x s<CR>^v<Esc>:s/\V<C-R>"<CR>kgJ
Grimmy

1
ฉันคิดเกี่ยวกับเรื่องนี้ แต่มันล้มเหลวถ้าตัวละครที่จะกลับด้านอยู่ในตอนท้ายของบรรทัด ... แต่แล้วข้อมูลจำเพาะอินพุตรับประกันตามด้วย a -ดังนั้นมันใช้งานได้จริง! ดุจ
Grimmy


4

K (oK) , 31 27 ไบต์

วิธีการแก้:

`0:{@[x;(&x>93)y;"^v"94=]};

ลองออนไลน์!

คำอธิบาย:

คำตอบอย่างรวดเร็วจะพยายามเล่นกอล์ฟ 0 การจัดทำดัชนี

`0:{@[x;(&x>93)y;"^v"94=]}; / the solution
`0:                       ; / print to stdout
   {                     }  / lambda taking 2 implicit args x & y
    @[ ;        ;       ]   / apply @[var;index;function]
                     94=    / 94 (ASCII "v") equal to? returns 0 or 1
                 "v^"       / index into "v^" (ie flip switch)
               y            / index into
        (     )             / do this together
          x>93              / x greater than 93 (ASCII "]")
         &                  / indices where true
      x                     / apply to x

หมายเหตุ:

  • -4 ไบต์ขอบคุณที่>93หลอกลวง

3

Python 3 , 140 134 103 ไบต์

(-30 ขอบคุณ DJMcMayhem ♦, และอีก -1 ขอบคุณ Black Owl Kai)

def f(i,y,x=1):
 for c in y:q=c>'-';p=len(i)and x==i[0]*q;print([c,"v^"[c>'^']][p],end='');x+=q;i=i[p:]

ลองออนไลน์!


อืมลองเล่นกอล์ฟอะไรก็ได้เลย นี่ใช้การวนซ้ำที่ค่อนข้างซับซ้อนมากกว่าการใช้สตริงxเพื่อติดตามดัชนีสวิตช์ปัจจุบัน ใช้การจัดทำดัชนี 1 รายการ

Ungolfed:

def f(i,y):
     x = 1
     for c in y:
         nextchar = c # nextchar gets golfed out completely within the print
         if c in 'v^': # golfed as c>'-'
             if len(i) and x==i[0]:
                nextchar = 'v' if c=='^' else '^'
                i = i[1:]
             x += 1
         print(nextchar, end='')



หรือ104ถ้ายอมรับ python 3
DJMcMayhem

@DJMcMayhem Ooh ขอบคุณที่แทนที่ catch xd คุณต้องการโพสต์ Python 3 เป็นคำตอบที่แยกต่างหากหรือคุณคิดว่ามันคล้ายกันพอที่จะเพิ่มเป็นการแก้ไขนี้
ฟูริเยร์ของรินแปลง

1
รู้สึกอิสระที่จะเพิ่มมัน :) ฉันอาจโพสต์คำตอบของหลาม 3 แต่ฉันอาจพยายามหาวิธีของฉันเองก่อน
DJMcMayhem

3

เยลลี่ 12 ไบต์

O^%5T⁴ịƲ¦40Ọ

โปรแกรมเต็มรูปแบบยอมรับสตริงและรายการจำนวนเต็มที่พิมพ์ผลลัพธ์

ลองออนไลน์!

อย่างไร?

O^%5T⁴ịƲ¦40Ọ - Main Link: list of characters, S; inversion indices, I
O            - to ordinals   ('\n':10, '-':45, '^':94, 'v':118)
        ¦    - sparse application...
       Ʋ     - ...to indices: last four links as a monad: f(O(S))
  %5         -   modulo 5   (10:0, 45:0, 94:4, 118:3)
    T        -   truthy indices (giving, X, indices of '^' and 'v' in S)
     ⁴       -   4th command line argument = I
      ị      -   index into X   (giving indices of '^' and 'v' to invert in S)
 ^       40  - ...action: XOR with 40   (94:118, 118:94)
           Ọ - from ordinals
             - implicit print


3

Perl 6 , 31 ไบต์

->$_,\s{S:nth(s){\^|v}=$/~^'('}

ลองออนไลน์!

(-2 ไบต์ขอบคุณ Jo King)

ผู้ประกอบการทดแทน Perl 6 Sใช้เวลาสะดวกnthคำวิเศษณ์ที่ยอมรับไม่เพียง แต่ดัชนีเดียวที่จะเปลี่ยน แต่รายการของพวกเขาตรงตามที่ต้องการที่นี่

การแทนที่คือ$/ ~^ '('ตำแหน่งที่$/ข้อความที่จับคู่ (อย่างใดอย่างหนึ่งvหรือ^) ~^เป็น stringwise exclusive-or operator และ(เป็นตัวละครที่บิตเปลี่ยนvเป็น^และกลับกัน



2

MATL , 29 ไบต์

c!tt45>o2yfi)(2=XK)t106-E-K(!

ลองออนไลน์! หรือตรวจสอบกรณีข้อความทั้งหมดตรวจสอบกรณีที่ข้อความทั้งหมด

อินพุตเป็นอาร์เรย์เซลล์ของสตริงและเวกเตอร์แถวของตัวเลขพร้อมการจัดทำดัชนีแบบ 1 ผลลัพธ์จะถูกเสริมด้วยช่องว่าง



2

เยลลี่ขนาด 14 ไบต์

⁾^vḟ$€>”-T⁹ịƲ¦

ลองออนไลน์!

โปรแกรมเต็มรูปแบบ

ความรู้สึกนี้ยาวเกินไป ...


ฉันไม่รู้ว่า Jelly จะไม่สามารถลองด้วยตนเองได้ แต่คุณสามารถแทนที่”-ด้วยชื่อของอาร์กิวเมนต์แรก ( ³?) ซึ่งรับประกันได้ว่าจะเริ่มต้นด้วย a -แทนหรือไม่
Shaggy

@Shaggy Nope เพราะ>vectorizes คุณสามารถเห็นได้ว่ามันไม่ทำงาน
Erik the Outgolfer

อานั่นคือสิ่งที่ฉันพยายามอย่างแน่นอน :) ไม่ทราบว่าเป็นเพราะฉันขาดความรู้ด้านเยลลี่ที่เป็นสาเหตุหรือไม่ อย่าคิดว่ามีตัวละครในตัวเพื่อรับตัวละครตัวแรกของการโต้แย้งครั้งแรก?
Shaggy

@Shaggy เอ่อ ... เพียงตัว ins สำหรับอาร์กิวเมนต์บรรทัดคำสั่งมี³, , , และสำหรับแรกที่ CLAs ห้าตามลำดับ คุณสามารถอ่านหน้าAtomsเพื่อดูว่ามีฟังก์ชันในตัวเฉพาะอยู่หรือไม่
Erik the Outgolfer

อืมก็คุ้มค่ากับการยิง วันหนึ่งฉันจะดำดิ่งลงในเจลลี่อย่างถูกต้อง
Shaggy

2

Stax , 13 ไบต์

¿╫╦ÜΦ1▌X○!ΩTæ

เรียกใช้และแก้ไขข้อบกพร่อง

สิ่งนี้ใช้ดัชนีที่อิง 0

  1. ค้นหาดัชนีทั้งหมดของ [v^]regex
  2. ดัชนีลงในอาร์เรย์ดัชนีโดยใช้อินพุต
  3. ในแต่ละผลให้แฮคเกอร์รหัส ASCII 40การป้อนข้อมูลที่มี xor('v', '^')นี่คือ

2

ทำความสะอาด , 93 ไบต์

import StdEnv
$i=foldl(\s c=s++[if(any((==)(sum[1\\k<-s|k>'-']))i&&c>'-')if(c>'^')'^''v'c])[]

ลองออนไลน์!

กำหนดฟังก์ชั่น$ :: [Int] -> [Char] -> [Char]รับรายการดัชนีดัชนี zeroed และกลับฟังก์ชั่นที่ใช้สตริงและส่งกลับสตริงการเปลี่ยนแปลง


2

JavaScript (Node.js) , 101 98 93 91 77 67 ไบต์

a=>s=>[...s].map(c=>t+=c>s?"^v"[a.includes(i++)^c>"^"]:c,t=i=``)&&t

ลองออนไลน์!

10 ไบต์ขอบคุณข้อเสนอแนะโดยปุย

ท่าเรือของฉันคำตอบหลาม ไม่คุ้นเคยกับการเล่น javascript!



หรือ67 ไบต์โดยจ่ายไปข้างหน้าการประหยัด Arnauld ให้ฉัน
Shaggy

@Shaggy: เคล็ดลับชื่นชม! อ่านตอนนี้ ...
Chas Brown


1

จาวาสคริปต์, 111 ไบต์

รหัส

x=>y=>{x.map(i=>eval(`y=y.replace(/(((v|\\^)[^^v]*){${i}})(v|\\^)/,(a,b,c,d,e)=>b+(e<"v"?"v":"^"))`));return y}

ใช้อินพุตในรูปแบบ f (x) (y) โดยที่ x คือดัชนีและ y คือสวิตช์บอร์ด ดัชนีดัชนี 0

ลองออนไลน์!

คำอธิบาย

สำหรับแต่ละดัชนี

x.map(i=>...

สร้าง regex ที่ค้นหาดัชนี + 1 th "^" หรือ "v"

`.../(((v|\\^)[^^v]*){${i}})(v|\\^)/...`

แทรกลงในสตริงเพื่อแทนที่ด้วยสัญลักษณ์ตรงกันข้าม "v" <-> "^"

y=y.replace(...,(a,b,c,d,e)=>b+(e<"v"?"v":"^"))

จากนั้นประเมินสตริงเป็นฟังก์ชัน

eval(...)

หลังจากวนซ้ำผ่านดัชนีเพื่อสลับให้ส่งคืนสวิตช์บอร์ด

return y

1

เยลลี่ขนาด 17 ไบต์

⁾^vK;`©⁹e€ky@€⁸¦®

ลองออนไลน์!

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


1

เรติน่า 0.8.2 , 66 62 ไบต์

\d+
$*
T`v^`^v`.(?<=\b(?(3)$)(?<-3>1)+(,1+)*(-|¶|(v|\^))+)
1A`

ลองออนไลน์! ลิงก์มีกรณีทดสอบ 1 การจัดทำดัชนี คำอธิบาย:

\d+
$*

แปลงหมายเลขอินพุตเป็นเอก

T`v^`^v`.(?<=\b(?(3)$)(?<-3>1)+(,1+)*(-|¶|(v|\^))+)

ทับศัพท์ระหว่างvและ^อักขระทั้งหมดด้วยคุณสมบัติที่จำนวนvs และ^s (รวม) เท่ากับหนึ่งในหมายเลขอินพุต

1A`

ลบหมายเลขอินพุต


1

ถ่าน 23 ไบต์

⭆η⎇№θ⌕ΦLη№v^§ηλκ§v^⁼vιι

ลองออนไลน์! การเชื่อมโยงคือการสร้างรหัสเวอร์ชัน 0 การจัดทำดัชนี คำอธิบาย:

 η                      Input string
⭆                       Map over characters and join
  ⎇                     If
   №                    Count of (i.e. exists)
     ⌕                  Index of
               κ        Current index in
       L                Length of
        η               Input string
      Φ                 Implicit range filtered by
         №              Count of (i.e. exists)
             η          Input string
            §           Indexed by
              λ         Current value
          v^            In literal string `v^`
    θ                   In input list
                 v^     Then literal `v^`
                §       Indexed by
                     ι  Current character
                   ⁼    Equal to
                    v   Literal `v`
                      ι Else current character




1

Japt , 16 14 ไบต์

Ëc^#(*(D>V©øT°

ลองมัน

Ë>V©øT° ?Dc^#(:D     :Implicit input of multi-line string U & integer array V
Ë                    :Map each D in U
 >V                  :  Greater than V? (Coerces V to a string and, conveniently, all digits are > "\n" & "-" and < "^" & "v")
   ©                 :  Logical AND with
    ø                :  Does V contain
     T°              :    T (initially 0) postfix incremented
        ?            :  If true
         Dc          :  Charcode of D
           ^#(       :  XOR with 40
              :D     :  Else D

อ๊ะโค้ดของคุณไม่มีความสุขอีกต่อไป (มันหายไป:D)
Veskah
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.