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.