Bir Santraldeki Bazı Anahtarları Ters Çevir


23

Bu zorluktan ilham aldık .

Hedef:

Önceden yapılandırılmış bir pano ve bir dizin listesi göz önüne alındığında, anahtarları verilen dizinlerde ters çevirin.

Bir pano, sarım içine sarılmış ve değişken uzunluktaki sıralara yerleştirilmiş bir dizi anahtardan ( vveya ^) oluşur -. İşte örnek bir santral:

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

İnvert / a anahtarı vasıtası onu değiştirmeyi çevirmek viçin ^ya gelen ^etmek v.

Anahtarlar soldan sağa, yukarıdan aşağıya dizine alınır. Örneğin, yukarıdaki örnekte v, ilk satırdaki son konum 3 ^, ortadaki satır 4 (1 indeksleme kullanılarak) olur.

Giriş:

  • Geçiş panosunu temsil eden bir dize (veya dizelerin listesi). Regex ile eşleşmesi garanti edilir ((-[v^])+-)(\n(-[v^])+-)*.
  • Dizinleri temsil eden muhtemel olarak boş bir sayılar listesi, 0 veya 1 (veya isterseniz bazı isteğe bağlı numaralar) dizine alınabilir. Bunlar çevrilmesi gereken anahtarlar.

Çıktı:

  • Belirtilen anahtarlar ters çevrilmiş girişle aynı şekilde bir kontrol paneli. Belirtilmemiş anahtarlar başlangıç ​​durumlarını korumalıdır.

Kurallar:

  • Girdi her zaman doğru biçimde biçimlendirilecek ve verilen dizinler sınırların dışında kalmayacak.
  • Dizinlerin listesi sıralanacak ve yinelenenleri olmayacak.
  • Cevabınızda, hangi indekslemeyi kullandığınızı, 0, 1 ya da bazılarını keyfi bir şekilde belirtin.
  • Çıktı girdi gibi göründüğü sürece izleyen boşluk boş.
  • Bu yani en kısa kod kazanır.

Örnekler:

#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-

Kısa çizgileri boşluklarla sağa doldurarak dikdörtgen bir char dizisi oluşturabilir miyiz? Ayrıca, bu biçimde girdi alabilir miyiz?
Luis Mendo

@LuisMendo Bunu girdi olarak kabul ederken Hayır diyeceğim. Beyaz alanın izini girdi gibi göründüğü sürece gayet iyi.
Veskah

2
Karakter olup olmadığını kontrol edenlere ipucu >"-": Giriş dizesinin başlaması garantili olduğundan -, bunun için kullandığınız parametre / bağımsız değişken / değişken adına göre kontrol edebilirsiniz.
Shaggy

Yanıtlar:


11

Vim, 60, 46, 38 , 37 bayt / tuş vuruşlarını

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

<esc>ve <C-r>her ikisi de 1 bayt / tuş vuruşudur. Bayt Sayacı

Test Durumu 1 (Ayrıntılı mod)

Sınama Durum 2 (Ayrıntılı mod)

22 baytlık bir azalmaya yol açan fikirler için Grimy'e teşekkürler :)


2
@ Veskah ughhhhhh vim "0 kez bir şeyler yap" kenar davaları hakkında süper titiz. Düzenlemeyi gör
DJMcMayhem

Could :s/\%V./\='v^'[submatch(0)=='v']olmak cl<C-R>='v^'['<C-R>"'=='v']-13 bayt için? (her <CR> yalnızca bir bayttır).
Grimmy

2
@ Grimy Ooh, iyi fikir. Ayrıca s == cl, çok -14genel.
DJMcMayhem

Diğer fikirler: s^v!<Esc>?\<C-R>"<CR>xhf!xveya s<CR>^v<Esc>:s/\V<C-R>"<CR>kgJ.
Grimmy

1
Bunu düşündüm, ama ters çevrilecek karakter bir satırın sonundaysa başarısız olur… ama sonra girdi belirtimi a ile takip edildiğini garanti eder -, bu yüzden gerçekten işe yarar! Duh.
Grimmy


4

K (OK) , 31 27 bayt

Çözüm:

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

Çevrimiçi deneyin!

Açıklama:

Hızlı cevap, golf oynamaya çalışacağız. 0 endeksli.

`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

Notlar:

  • >93Hile sayesinde -4 byte

3

Python 3 , 140 134 103 bayt

(-30, DJMcMayhem ♦ sayesinde, -1 Black Owl Kai sayesinde daha fazla)

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

Çevrimiçi deneyin!


Oof, ikinci olarak her şeyi golf oynamaya çalış. Bu, sadece xmevcut anahtar indeksini takip etmek için dize üzerinde oldukça karmaşık olmayan bir döngü kullanır . 1-indeksleme kullanır.

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



Veya 104 python 3 kabul edilebilir ise
DJMcMayhem

@DJMcMayhem Ooh, catch xd yerine bunun için teşekkür ederiz Python 3'ü ayrı bir cevap olarak mı göndermek istersiniz, yoksa buna düzenleme olarak eklemenin yeterince benzer olduğunu mu düşünüyorsunuz?
Rin'in Fourier dönüşümü

1
Eklemek için çekinmeyin :) Bir python 3 cevap gönderebilirim, ama muhtemelen ilk önce kendi yaklaşımımı bulmaya çalışırım.
DJMcMayhem

3

Jöle , 12 bayt

O^%5T⁴ịƲ¦40Ọ

Dizeyi ve sonucu basan tam sayıların listesini kabul eden tam bir program.

Çevrimiçi deneyin!

Nasıl?

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 bayt

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

Çevrimiçi deneyin!

(Jo King sayesinde -2 bayt)

Perl 6'nin ikame operatörü S, nthyalnızca tam olarak ihtiyaç duyulduğu gibi sadece tek bir indeksi değil, aynı zamanda bir listeyi de içeren bir listeyi kabul eden bir zarf alır .

Değişim, eşleşen metnin $/ ~^ '('nerede $/(veya vveya ^) ~^olduğu, dizeye özel veya işleci ve (bitleri tersine vçeviren ^ve tersi olan karakterdir .





2

Jöle , 14 bayt

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

Çevrimiçi deneyin!

Tam program

Bu çok uzun sürüyor ...


Jelly'i tanımıyorum, bu yüzden kendim nasıl deneyeceğimi bilemiyorum ama bunun yerine ”-ilk argümanla ³başlaması garanti edilen ilk argümanın ( ?) İsmini değiştirebilir misiniz -?
Shaggy

@Shaggy Hayır, çünkü >vectorizes. Sen olabilir çalışmıyor görüyoruz .
Outgolfer Erik,

ah, tam olarak denedim bu :) Nedeni olup olmadığına ilişkin Jelly bilgisi eksikliği olup olmadığını bilmiyordum. İlk argümanın ilk karakterini elde etmek için yerleşik tek bir karakter olduğunu düşünmeyin?
Shaggy,

@Shaggy Erm ... komut satırı argümanları için yalnızca yerleşik ins vardır ³, , , ve sırasıyla beşinci CLA'larını ilk için. Belirli bir yerleşik işlev olup olmadığını öğrenmek için Atomlar sayfasını okuyabilirsiniz .
Outgolfer Erik,

Ah, pekala, bir şansa değdi. Bir gün, olacak düzgün Jelly dalmak.
Shaggy

2

Stax , 13 bayt

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

Koş ve hata ayıkla

Bu 0 tabanlı endeksleri kullanır.

  1. Regex'in tüm endekslerini bulun [v^].
  2. İçine Endeksi endeksi girişini kullanarak dizide.
  3. Her sonuçta, girişin ascii kodu ile xor 40. Bu xor('v', '^').

2

Temiz , 93 bayt

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

Çevrimiçi deneyin!

Fonksiyonunu tanımlar $ :: [Int] -> [Char] -> [Char]endeksleri sıfır endeksli liste alıp dize alır ve değişmiş dizesini döndüren bir işlev dönen.




1

JavaScript, 111 bayt

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}

Girdiyi f (x) (y) biçiminde alır; burada x, endekslerdir ve y, santraldir. Endeksler 0 dizinli

Çevrimiçi deneyin!

açıklama

Her endeks için

x.map(i=>...

+ 1'inci "^" veya "v" dizinini bulan regex'i oluşturun

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

"v" <-> "^" zıt sembolüyle değiştirmek için bir dizgeye yerleştirin

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

sonra dizeyi bir işlev olarak değerlendirin

eval(...)

Geçiş yapmak için endeksleri yineledikten sonra geçiş panosunu döndürün

return y

1

Jöle , 17 bayt

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

Çevrimiçi deneyin!

Endeksleri birinci, dize ikinci argüman olarak alan tam bir program. Çıktıyı belirtilen anahtarlar çevrilmiş şekilde yazdırır.


1

Retina 0.8.2 , 66 62 bayt

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

Çevrimiçi deneyin! Bağlantı, test senaryosunu içerir. 1 endeksli. Açıklama:

\d+
$*

Giriş numaralarını unary'ye dönüştürün.

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

Arasındaki alfabe vve ^sayısı o mülkle tüm karakterler vs ve ^bugüne kadar (dahil) s girdi numaralarının biri eşittir.

1A`

Giriş numaralarını silin.


1

Kömür , 23 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. 0 endeksli. Açıklama:

 η                      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 , 15 bayt

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

Dene

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

1

Japt , 16 14 bayt

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

Dene

Ë>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

Aw, kodunuz artık mutlu değil (kaybetti :D)
Veskah
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.