Invert Some Switches on a Switchboard

23

Terinspirasi oleh tantangan ini .

Tujuan:

Diberikan switchboard pra-konfigurasi dan daftar indeks, membalikkan switch pada indeks yang diberikan.

Sebuah papan switch terdiri dari sejumlah saklar ( vatau ^) yang dibungkus -dan disusun menjadi barisan dengan panjang yang bervariasi. Berikut ini adalah contoh switchboard:

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

Membalikkan / membalik saklar berarti mengubahnya dari vmenjadi ^, atau dari ^ke v.

Sakelar diindeks dari kiri ke kanan, atas ke bawah. Misalnya, dalam contoh di atas, yang terakhir vdi baris pertama akan berada di posisi 3 dan ^di baris tengah berada di 4 (menggunakan 1-pengindeksan).

Memasukkan:

  • Sebuah string (atau daftar string) mewakili switchboard. Dijamin cocok dengan regex ((-[v^])+-)(\n(-[v^])+-)*.
  • Daftar nomor yang mungkin kosong yang mewakili indeks, mungkin 0 atau 1 (atau nomor arbitrer jika Anda mau) diindeks. Ini adalah sakelar yang perlu dibalik.

Keluaran:

  • Switchboard dalam bentuk yang sama dengan input dengan switch yang ditentukan terbalik. Setiap sakelar yang tidak ditentukan harus mempertahankan status awalnya.

Aturan:

  • Input akan selalu diformat dengan benar dan tidak ada indeks yang diberikan akan di luar batas.
  • Daftar indeks akan diurutkan dan tidak akan memiliki duplikat.
  • Nyatakan dalam jawaban Anda apa pengindeksan yang Anda gunakan, baik itu 0, 1, atau yang sewenang-wenang.
  • Trailing whitespace baik-baik saja selama outputnya terlihat seperti input.
  • Ini adalah sehingga kode terpendek menang.

Contoh:

#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-
Veskah
sumber
Bisakah kita menghasilkan array char persegi panjang, mengisi baris yang lebih pendek dengan spasi? Juga, bisakah kita mengambil input dalam formulir itu?
Luis Mendo
@LuisMendo saya akan mengatakan TIDAK untuk mengambil itu sebagai masukan. Trailing white space baik-baik saja asalkan terlihat seperti input.
Veskah
2
Petunjuk bagi mereka yang memeriksa karakter >"-": Karena string input dijamin untuk memulai -, Anda dapat memeriksa terhadap parameter / argumen / nama variabel yang Anda gunakan untuk itu.
Shaggy

Jawaban:

11

Vim, 60, 46, 38 , 37 bytes / penekanan tombol

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

<esc>dan <C-r>keduanya 1 byte / keystroke. Penghitung Byte

Test Case 1 (mode Verbose)

Test Case 2 (mode Verbose)

Terima kasih kepada Grimy untuk ide-ide yang menyebabkan pengurangan 22 byte :)

DJMcMayhem
sumber
2
@Veskah ughhhhhh vim sangat rewel tentang "melakukan sesuatu 0 kali" kasus tepi. Lihat edit
DJMcMayhem
Tidak :s/\%V./\='v^'[submatch(0)=='v']bisa cl<C-R>='v^'['<C-R>"'=='v']untuk -13 byte? (setiap <CR> hanya satu byte).
Grimmy
2
@ Grim Ooh, ide bagus. Juga s == cl, sangat -14keseluruhan.
DJMcMayhem
Gagasan lain: s^v!<Esc>?\<C-R>"<CR>xhf!xatau s<CR>^v<Esc>:s/\V<C-R>"<CR>kgJ.
Grimmy
1
Saya memikirkan hal itu, tetapi gagal jika karakter yang akan dibalik berada di akhir baris ... tapi kemudian input spec menjamin itu diikuti oleh -, jadi itu benar-benar berfungsi! Duh.
Grimmy
6

JavaScript, 63 59 byte

a=>s=>s.replace(/v|\^/g,x=>"^v"[a.includes(n++)^x>"^"],n=0)

Cobalah online!

Disimpan 4 byte berkat Arnauld .

Shaggy
sumber
4

K (oK) , 31 27 byte

Larutan:

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

Cobalah online!

Penjelasan:

Jawaban cepat, akan mencoba golf itu. Diindeks 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

Catatan:

  • -4 Bytes berkat >93triknya
streetster
sumber
3

Python 3 , 140 134 103 byte

(-30 Berkat DJMcMayhem ♦, -1 lebih banyak terima kasih kepada 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:]

Cobalah online!


Oof, coba lagi golf apa saja. Ini hanya menggunakan loop yang agak tidak canggih di atas string, gunakan xuntuk melacak indeks switch saat ini. Menggunakan pengindeksan 1.

Tidak Disatukan:

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='')
Transformasi Fourier Rin
sumber
107 byte
DJMcMayhem
106 byte
Black Owl Kai
Atau 104 jika python 3 diterima
DJMcMayhem
@DJMcMayhem Ooh, terima kasih untuk itu ganti catch xd Apakah Anda ingin memposting Python 3 sebagai jawaban terpisah, atau menurut Anda cukup mirip untuk menambahkan sebagai edit untuk ini?
Transformasi Fourier Rin
1
Jangan ragu untuk menambahkannya :) Saya mungkin memposting jawaban python 3, tapi saya mungkin akan mencoba untuk datang dengan pendekatan saya sendiri terlebih dahulu.
DJMcMayhem
3

Jelly , 12 byte

O^%5T⁴ịƲ¦40Ọ

Program lengkap yang menerima string dan daftar bilangan bulat yang mencetak hasilnya.

Cobalah online!

Bagaimana?

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
Jonathan Allan
sumber
3

Python 3.8 (pra-rilis) , 80 , 78 , 77 , 71 , 70 byte

lambda x,s,i=0:''.join([c,'^v'[c<'v']][c>s and(i:=i+1)in x]for c in s)

-1 byte, terima kasih kepada @Shaggy

Cobalah online!

Jonas Ausevicius
sumber
1
c>s menghemat satu byte.
Shaggy
3

Perl 6 , 31 byte

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

Cobalah online!

(-2 byte terima kasih kepada Jo King)

Operator substitusi Perl 6 dengan Smudah mengambil nthkata keterangan yang tidak hanya menerima indeks tunggal untuk melakukan penggantian, tetapi juga daftar mereka, persis seperti yang dibutuhkan di sini.

Pengganti adalah $/ ~^ '(', di mana $/teks yang cocok (salah satu vatau ^), ~^adalah operator atau stringwise eksklusif, dan (merupakan karakter yang bit-bitnya berubah vmenjadi ^dan sebaliknya.

Sean
sumber
31 byte
Jo King
2

MATL , 29 byte

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

Cobalah online! Atau verifikasi semua kasus teks .

Input adalah array sel string dan vektor baris angka, dengan pengindeksan berbasis 1. Keluaran diisi dengan benar dengan spasi.

Luis Mendo
sumber
2

Jelly , 14 byte

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

Cobalah online!

Program lengkap.

Ini terasa terlalu panjang ...

Erik the Outgolfer
sumber
Saya tidak tahu Jelly, jadi saya tidak tahu cara mencobanya sendiri, tetapi bisakah Anda menggantinya ”-dengan nama argumen pertama ( ³?), Yang dijamin akan dimulai dengan -, bukan?
Shaggy
@ Shaggy Nggak, karena >vektorisasi. Anda dapat melihat bahwa itu tidak berhasil .
Erik the Outgolfer
ah, itulah yang saya coba :) Tidak tahu apakah itu karena kurangnya pengetahuan Jelly yang menjadi penyebabnya atau tidak. Jangan kira ada satu karakter bawaan untuk mendapatkan karakter pertama dari argumen pertama?
Shaggy
@Shaggy Erm ... satu-satunya built-in untuk argumen baris perintah yang ³, , , dan , untuk pertama kepada PKB kelima masing-masing. Anda dapat membaca halaman Atom untuk mengetahui apakah ada fungsi bawaan tertentu.
Erik the Outgolfer
Ah, well, patut dicoba. Suatu hari, saya akan menyelam ke Jelly dengan benar.
Shaggy
2

Stax , 13 byte

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

Jalankan dan debug itu

Ini menggunakan indeks berbasis 0.

  1. Temukan semua indeks regex [v^] .
  2. Indeks ke dalam array indeks menggunakan input.
  3. Di setiap hasil, masukkan kode ascii input dengan 40. Ini xor('v', '^').
rekursif
sumber
2

Bersihkan , 93 byte

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

Cobalah online!

Menentukan fungsi $ :: [Int] -> [Char] -> [Char]mengambil daftar indeks indeks nol dan mengembalikan fungsi yang mengambil string dan mengembalikan string yang diubah.

Suram
sumber
2

V , 20 byte

ÑñÀ/vüÞ
sv^l?Ö"
xH

Cobalah online!

Menggunakan beberapa fitur baru, seperti Ñyang sangat berguna.

DJMcMayhem
sumber
1

JavaScript, 111 byte

Kode

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

Mengambil input dalam format f (x) (y) di mana x adalah indeks dan y adalah switchboard. Indeks 0 diindeks

Cobalah online!

Penjelasan

Untuk setiap indeks

x.map(i=>...

membangun regex yang menemukan indeks +1 "^" atau "v"

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

masukkan ke string untuk menggantinya dengan simbol yang berlawanan "v" <-> "^"

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

kemudian mengevaluasi string sebagai fungsi

eval(...)

Setelah mengulangi indeks untuk beralih, kembalikan papan tombol

return y
fəˈnɛtɪk
sumber
1

Jelly , 17 byte

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

Cobalah online!

Program penuh mengambil indeks sebagai argumen pertama dan string sebagai argumen kedua. Mencetak output dengan sakelar yang ditunjukkan terbalik.

Nick Kennedy
sumber
1

Retina 0.8.2 , 66 62 byte

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

Cobalah online! Tautan termasuk test case. 1-diindeks. Penjelasan:

\d+
$*

Ubah nomor input menjadi unary.

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

Transliterasi antara vdan ^semua karakter dengan properti yang jumlah vs dan ^s sejauh ini (inklusif) sama dengan salah satu nomor input.

1A`

Hapus nomor input.

Neil
sumber
1

Arang , 23 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Diindeks 0. Penjelasan:

 η                      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
Neil
sumber
1

C # (Visual C # Interactive Compiler) , 73 byte

a=>b=>{int i=0;return a.Select(x=>x>45&&b.Contains(++i)?(char)(x^40):x);}

Cobalah online!

Perwujudan Ketidaktahuan
sumber
1
@ Vaskah Diperbarui untuk memasukkan kasing kosong
Perwujudan Ketidaktahuan
1

Japt , 15 byte

®c^(Z>V©øT° *#(

Cobalah

®c^(Z>V©ø°T *#(    U = Input String, V = Array of Indices
®                  Map each Z in U
 c^                   XOR Z's charcode by
   (Z>V                 Z is 'v' or '^'
      ©                 Short-circuiting Logical and
       øT°              The current Z's index is in V
             *#(        Multiply the boolean with 40 (false = 0, true = 1)
Perwujudan Ketidaktahuan
sumber
1

Japt , 16 14 byte

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

Cobalah

Ë>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
Shaggy
sumber
Ah, kode Anda tidak lagi bahagia (itu kehilangan :D)
Veskah