Odwróć niektóre przełączniki na tablicy rozdzielczej

23

Zainspirowany tym wyzwaniem .

Cel:

Biorąc pod uwagę wstępnie skonfigurowaną centralę i listę indeksów, odwróć przełączniki przy podanych indeksach.

Rozdzielnica składa się z pewnej liczby przełączników ( vlub ^) owiniętych w -i rozmieszczonych w rzędach o różnej długości. Oto przykładowa centrala:

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

Aby odwrócić / przerzucić środki przełączające zmieniając go od vdo ^, lub od ^do v.

Przełączniki są indeksowane od lewej do prawej, od góry do dołu. Np. W powyższym przykładzie ostatni vw pierwszym rzędzie byłby w pozycji 3, a ^w środkowym rzędzie miałby 4 (przy użyciu indeksowania 1).

Wkład:

  • Ciąg (lub lista ciągów) reprezentujący centralę. Gwarantowane jest dopasowanie do wyrażenia regularnego ((-[v^])+-)(\n(-[v^])+-)*.
  • Prawdopodobnie pusta lista liczb reprezentujących indeksy, może być zindeksowana 0 lub 1 (lub dowolna liczba dowolna). Są to przełączniki, które należy przełączyć.

Wydajność:

  • Tablica rozdzielcza w tym samym kształcie co wejście z określonymi przełącznikami odwróconymi. Wszelkie nieokreślone przełączniki powinny zachować swój stan początkowy.

Zasady:

  • Dane wejściowe zawsze będą poprawnie sformatowane i żadne podane indeksy nie będą poza zakresem.
  • Lista indeksów zostanie posortowana i nie będzie miała duplikatów.
  • Podaj w swojej odpowiedzi, jakiego indeksowania używasz, czy to 0, 1, czy jakiś dowolny.
  • Końcowe białe znaki są w porządku, o ile dane wyjściowe wyglądają jak dane wejściowe.
  • To jest więc wygrywa najkrótszy kod.

Przykłady:

#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
źródło
Czy możemy wyprowadzić prostokątną tablicę znaków, wypełniając krótsze linie spacjami? Czy możemy również brać udział w tej formie?
Luis Mendo
@LuisMendo Powiem „Nie”, biorąc to za wkład. Końcowe białe znaki są w porządku, o ile wyglądają jak dane wejściowe.
Veskah
2
Wskazówka dla tych, którzy sprawdzają, czy znaki są >"-": Ponieważ gwarantowany jest ciąg wejściowy -, możesz sprawdzić parametr / argument / nazwę zmiennej, której używasz do tego.
Kudłaty

Odpowiedzi:

11

Vim, 60, 46, 38 , 37 bajtów / naciśnięć klawiszy

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

<esc>i <C-r>oba mają 1 bajt / naciśnięcie klawisza. Licznik bajtów

Przypadek testowy 1 (tryb pełny)

Przypadek testowy 2 (tryb pełny)

Dzięki Grimy za pomysły, które doprowadziły do ​​zmniejszenia 22 bajtów :)

DJMcMayhem
źródło
2
@Veskah ughhhhhh vim jest super wybredny w sprawach „zrób coś 0 razy”. Zobacz edycję
DJMcMayhem
Nie mogło :s/\%V./\='v^'[submatch(0)=='v']być cl<C-R>='v^'['<C-R>"'=='v']na -13 bajtów? (każdy <CR> to tylko jeden bajt).
Grimmy
2
@Grimy Ooh, dobry pomysł. Także s == cltak -14ogólnie.
DJMcMayhem
Inne pomysły: s^v!<Esc>?\<C-R>"<CR>xhf!xlub s<CR>^v<Esc>:s/\V<C-R>"<CR>kgJ.
Grimmy
1
Myślałem o tym, ale nie powiedzie się, jeśli znak, który ma być odwrócony, znajduje się na końcu linii… ale wtedy specyfikacja wejściowa gwarantuje, że po nim następuje znak „a” -, więc to naprawdę działa! Duh.
Grimmy
6

JavaScript, 63 59 bajtów

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

Wypróbuj online!

Zaoszczędź 4 bajty dzięki Arnauldowi .

Kudłaty
źródło
4

K (oK) , 31 27 bajtów

Rozwiązanie:

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

Wypróbuj online!

Wyjaśnienie:

Szybka odpowiedź, spróbuje zagrać w golfa. 0-indeksowane.

`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

Uwagi:

  • -4 bajty dzięki >93trickowi
Streetster
źródło
3

Python 3 , 140 134 103 bajtów

(-30 dzięki DJMcMayhem ♦, -1 więcej dzięki 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:]

Wypróbuj online!


O, druga próba gry w golfa w ogóle. To po prostu używa raczej niewyszukanej pętli w ciągu, używając xdo śledzenia bieżącego indeksu przełącznika. Wykorzystuje indeksowanie 1.

Nie golfowany:

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='')
Transformacja Fouriera Rina
źródło
107 bajtów
DJMcMayhem
106 bajtów
Black Owl Kai
Lub 104, jeśli python 3 jest akceptowalny
DJMcMayhem
@DJMcMayhem Ooh, dzięki za zastąpienie catch xd. Czy chciałbyś opublikować Python 3 jako osobną odpowiedź, czy uważasz, że jest wystarczająco podobny, aby dodać do niego edycję?
Transformacja Fouriera Rin
1
Nie krępuj się go dodać :) Mogę opublikować odpowiedź na python 3, ale prawdopodobnie najpierw spróbuję wymyślić własne podejście.
DJMcMayhem
3

Galaretka , 12 bajtów

O^%5T⁴ịƲ¦40Ọ

Pełny program akceptujący ciąg i listę liczb całkowitych, które wypisują wynik.

Wypróbuj online!

W jaki sposób?

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
źródło
3

Python 3.8 (wersja wstępna) , 80 , 78 , 77 , 71 , 70 bajtów

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

-1 bajt, dzięki @Shaggy

Wypróbuj online!

Jonas Ausevicius
źródło
1
c>s zapisuje bajt.
Kudłaty
3

Perl 6 , 31 bajtów

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

Wypróbuj online!

(-2 bajty dzięki Jo King)

Operator podstawienia w Perlu 6 Sdogodnie przyjmujenth przysłówek, który akceptuje nie tylko jeden indeks, przy którym ma zostać wykonana zamiana, ale listę ich, dokładnie tak, jak jest to potrzebne tutaj.

Zamiennikiem jest $/ ~^ '(', gdzie $/dopasowany tekst (albo vlub ^), ~^jest ciągowym operatorem wyłączności lub operatorem i (jest znakiem, którego bity zamieniają vsię ^i odwrotnie.

Sean
źródło
31 bajtów
Jo King
2

Galaretka , 14 bajtów

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

Wypróbuj online!

Pełny program

To wydaje się zbyt długie ...

Erik the Outgolfer
źródło
Nie znam Jelly, więc nie mogę wymyślić, jak go wypróbować, ale czy możesz zastąpić ”-nazwą pierwszego argumentu ( ³?), Który na pewno zaczyna się od -litery?
Kudłaty
@Shaggy Nope, ponieważ >wektoryzuje. Można zobaczyć, że to nie działa .
Erik the Outgolfer,
ah, właśnie tego próbowałem :) Nie wiedziałem jednak, czy przyczyną był mój brak wiedzy na temat galaretki. Czy nie przypuszczasz, że wbudowany jest jeden znak, aby uzyskać pierwszy znak pierwszego argumentu?
Kudłaty
@Shaggy Erm ... jedyne wbudowane argumenty wiersza poleceń to ³: , , i , po raz pierwszy do piątego CLA odpowiednio. Możesz przeczytać stronę Atomy, aby dowiedzieć się, czy istnieje określona funkcja wbudowana.
Erik the Outgolfer,
Ach, cóż, było warto spróbować. Pewnego dnia, będą nurkować w galarecie prawidłowo.
Kudłaty
2

Stax , 13 bajtów

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

Uruchom i debuguj

Korzysta z indeksów opartych na 0.

  1. Znajdź wszystkie wskaźniki wyrażenia regularnego [v^] .
  2. Indeks do tablicy indeksów, używając danych wejściowych.
  3. Przy każdym wyniku x lub kod ascii wejścia za pomocą 40. Jest xor('v', '^').
rekurencyjny
źródło
2

Czysty , 93 bajty

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

Wypróbuj online!

Definiuje funkcję $ :: [Int] -> [Char] -> [Char] pobierającą listę indeksów o indeksie zerowym i zwracającą funkcję, która pobiera ciąg i zwraca zmieniony ciąg.

Obrzydliwe
źródło
2

V , 20 bajtów

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

Wypróbuj online!

Wykorzystuje kilka nowych funkcji, takich jak Ñ, która jest niezwykle przydatna.

DJMcMayhem
źródło
1

JavaScript, 111 bajtów

Kod

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

Pobiera dane wejściowe w formacie f (x) (y), gdzie x to wskaźniki, a y to tablica rozdzielcza. Indeksy są indeksowane 0

Wypróbuj online!

Wyjaśnienie

Dla każdego indeksu

x.map(i=>...

konstruuj wyrażenie regularne, które znajdzie indeks + 1-ty „^” lub „v”

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

wstaw go do ciągu, aby zastąpić go przeciwnym symbolem „v” <-> „^”

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

następnie oceń ciąg jako funkcję

eval(...)

Po iteracji po indeksach, aby przełączyć, zwróć tablicę rozdzielczą

return y
Fəˈnɛtɪk
źródło
1

Galaretka , 17 bajtów

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

Wypróbuj online!

Pełny program przyjmujący indeksy jako pierwszy i ciąg znaków jako drugi argument. Drukuje wydruk z zaznaczonymi przełącznikami.

Nick Kennedy
źródło
1

Retina 0.8.2 , 66 62 bajtów

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

Wypróbuj online! Link zawiera przypadek testowy. 1-indeksowany. Wyjaśnienie:

\d+
$*

Konwertuj liczby wejściowe na unary.

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

Transliterate pomiędzy vi ^wszystkie znaki z własności, że liczba vS i ^S tak daleko (włącznie) równa się jeden z numerów wejściowych.

1A`

Usuń wprowadzone liczby.

Neil
źródło
1

Węgiel , 23 bajty

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

Wypróbuj online! Link jest do pełnej wersji kodu. 0-indeksowane. Wyjaśnienie:

 η                      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
źródło
1

Japt , 15 bajtów

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

Spróbuj

®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)
Wcielenie ignorancji
źródło
1

Japt , 16 14 bajtów

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

Spróbuj

Ë>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
Kudłaty
źródło
Aw, twój kod nie jest już szczęśliwy (stracił :D)
Veskah