Ayrık Fırıncı Haritası


15

Giriş

Baker'ın haritası kaotik davranış sergileyen önemli bir dinamik bir sistemdir. Birim kareden kendisine aşağıdaki gibi sezgisel olarak tanımlanan bir işlevdir.

  • Kareyi dikey olarak ikiye bölün ve iki boyutta dikdörtgen elde edin 0.5×1.
  • Sağ yarıyı solun üst kısmına yerleştirin ve bir dikdörtgen boyutu elde edin 0.5×2
  • Dikdörtgeni tekrar 1×1kareye sıkıştırın .

Bu zorlukta, bu dönüşümün ayrı bir sürümünü uygulayacaksınız.

Giriş ve çıkış

Girişiniz yazdırılabilir ASCII karakterlerin 2B dizisi ve 2m×2nbazıları için boyut boşluğudur m, n > 0. Çıktınız, diziyi kullanarak aşağıdaki gibi elde edilen benzer bir 6×4dizidir

ABCDEF
GHIJKL
MNOPQR
STUVWX

Örnek olarak. İlk olarak, dizinin sağ yarısını sol yarının üstüne yığınlayın:

DEF
JKL
PQR
VWX
ABC
GHI
MNO
STU

Ardından, sütunları karakter çiftlerine ayırın ve bağımsız olarak her çifti saat yönünde 90 derece döndürerek uzun dikdörtgeni orijinal şekline geri döndürün:

JDKELF
VPWQXR
GAHBIC
SMTNUO

Bu, yukarıdaki dizi için doğru çıktıdır.

kurallar

Giriş ve çıkış formatları esnektir. Yeni satırla sınırlandırılmış dizeleri, dizelerin listelerini veya 2B karakter dizilerini kullanabilirsiniz. Ancak, giriş ve çıkış tam olarak aynı biçime sahip olmalıdır : herhangi bir geçerli girişte gönderiminizi isteğe bağlı olarak tekrarlamanız gerekir.

Tam bir program veya bir işlev yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklara izin verilmez.

Test Durumları

Input:
12
34

Output:
42
31

Input:
Hell
!  o
d  -
lroW

Output:
 lol
o W-
!H e
ldr 

Input:
ABCDEF
GHIJKL
MNOPQR
STUVWX

Output:
JDKELF
VPWQXR
GAHBIC
SMTNUO

Input:
*___  ___  o
o|__) |__) *
*|    |    o
o __   __  *
*|    | _  o
o|__  |__| *

Output:
|_____)   *o
 |_ _     *o
||_ __|   *o
o*|_____)   
o* |_ _     
o*||_ _     

Yanıtlar:


11

Pyth, 25 19 18 bayt

msC_dcs_Cmck/lk2Q2

Çevrimiçi tanıtım . 2D karakter dizileri kullanır.

Dize dizisi bir karakter daha uzundur (19 bayt). Çevrimiçi tanıtım

Açıklama:

         m      Q    map each string k in input:
            /lk2        calculate half the line-length: len(k)/2
          ck/lk2        chop k into pieces of length len(k)/2
                        results in two pieces
        C            zip the resulting list
                     results in a tuple ([first half of strings], [second half of strings])
       _             invert the order ([second half of strings], [first half of strings])
      s              sum (combine the two lists to a big one
     c           2   chop them into tuples
m                          for each tuple of strings: 
 sC_d                        invert, zip, and sum

Son bölüm ilk başta biraz kafa karıştırıcı. Diyelim ki bir demetimiz var ['DEF', 'JKL']( OP'den örnek kullanıyorum).

    d  (('D', 'E', 'F'), ('J', 'K', 'L'))   just the pair of strings
   _d  (('J', 'K', 'L'), ('D', 'E', 'F'))   invert the order
  C_d  [('J', 'D'), ('K', 'E'), ('L', 'F')] zipped
 sC_d  ('J', 'D', 'K', 'E', 'L', 'F')       sum (combine tuples)

4
Sana şaka yapmıyorum, sadece İndependantly yazdım tam senin yaptığın aynı çözüm. Bir fikir edinmek için tüm cevapları parlaklaştırdım, ancak ayrıntılı bir şey yok.
orlp

@orlp Evet, genellikle Pyth'teki doğrudan yaklaşım en kısa olanıdır. Böylece birden çok kişi kolayca bulur.
Jakube

@orlp Btw, Pyth repo'ya yeni bir talepte bulundu (henüz kabul edilmedi). Gelecekte c2kbunun yerine basitçe yapabilirsiniz ck/lk2. c2kdizeyi iki eşit parçaya ayırır.
Jakube

9

Julia, 136 bayt

Çok basit bir uygulama. Özellikle rekabetçi bir giriş değil, ama eğlenceliydi!

A->(s=size(A);w=s[2];u=2;C=vcat(A[:,u+1:w],A[:,1:u]);D=cell(s);j=1;for i=1:2:size(C,1) D[j,:]=vec(flipdim(C[i:i+1,:],1));j+=1end;D)

Bu, giriş olarak 2 boyutlu bir diziyi kabul eden ve dönüştürülmüş 2 boyutlu bir dizi döndüren bir lambda işlevi oluşturur.

Ungolfed + açıklaması:

function f(A)

    # Determine bounds
    s = size(A)          # Store the array dimensions
    w = s[2]             # Get the number of columns
    u = w ÷ 2            # Integer division, equivalent to div(w, 2)

    # Stack the right half of A atop the left
    C = vcat(A[:, u+1:w], A[:, 1:u])

    # Initialize the output array with the appropriate dimensions
    D = cell(s)

    # Initialize a row counter for D
    j = 1

    # Loop through all pairs of rows in C
    for i = 1:2:size(C, 1)

        # Flip the rows so that each column is a flipped pair
        # Collapse columns into a vector and store in D
        D[j, :] = vec(flipdim(C[i:i+1, :], 1))

        j += 1
    end

    return D
end

Bunu çağırmak için işleve bir ad verin, örn. f=A->(...) .

Örnek çıktı:

julia> A = ["A" "B" "C" "D" "E" "F";
            "G" "H" "I" "J" "K" "L";
            "M" "N" "O" "P" "Q" "R";
            "S" "T" "U" "V" "W" "X"]
julia> f(A)

4x6 Array{Any,2}:
 "J"  "D"  "K"  "E"  "L"  "F"
 "V"  "P"  "W"  "Q"  "X"  "R"
 "G"  "A"  "H"  "B"  "I"  "C"
 "S"  "M"  "T"  "N"  "U"  "O"

julia> B = ["H" "e" "l" "l";
            "!" " " " " "o";
            "d" " " " " "-";
            "l" "r" "o" "W"]
julia> f(B)

4x4 Array{Any,2}:
 " "  "l"  "o"  "l"
 "o"  " "  "W"  "-"
 "!"  "H"  " "  "e"
 "l"  "d"  "r"  " "

Ve keyfi olarak zincirlenebileceğinin kanıtı:

julia> f(f(B))

4x4 Array{Any,2}:
 "W"  "o"  "-"  "l"
 "r"  " "  " "  "e"
 "o"  " "  " "  "l"
 "l"  "!"  "d"  "H"

Öneriler her zaman olduğu gibi açıktır ve daha fazla açıklama yapmaktan memnuniyet duyarız.


8

CJam, 25 24 bayt

qN/_0=,2/f/z~\+2/Wf%:zN*

Doğrudan teknik özelliklerin uygulanması. Açıklama:

qN/                       "Split input by rows";
   _0=,2/                 "Get half of length of each row";
         f/               "Divide each row into two parts";
           z              "Convert array of row parts to array of half columns parts";
            ~\+           "Put the second half of columns before the first half and join";
               2/         "Group adjacent rows";
                 Wf%      "Flip the row pairs to help in CW rotation";
                    :z    "Rotate pairwise column elements CW";
                      N*  "Join by new line";

Buradan çevrimiçi deneyin


7

JavaScript (ES6), 104 141

Düzenle Spesifikasyonu gözden geçirerek, satır sayısının çift olması gerektiğini buldum (bunu daha önce özledim). Bu nedenle, çıktıdaki her karakter için tek bir adımda doğru kaynak konumunu bulmak çok karmaşık değildir.

F=a=>a.map((r,i)=>
  [...r].map((c,k)=>
     a[l=i+i]?a[(j=l+1)-k%2][(k+r.length)>>1]:a[l-j-k%2][k>>1]
  ).join('')
)

Firefox / FireBug konsolunda test et

;[["ABCDEF","GHIJKL","MNOPQR","STUVWX"]
 ,["12","34"], ["Hell","!  o","d  -","lroW"]
 ,["*___  ___  o","o|__) |__) *","*|    |    o","o __   __  *","*|    | _  o","o|__  |__| *"]
].forEach(v=>console.log(v.join('\n')+'\n\n'+F(v).join('\n')))

Çıktı

ABCDEF
GHIJKL
MNOPQR
STUVWX

JDKELF
VPWQXR
GAHBIC
SMTNUO

12
34

42
31

Hell
!  o
d  -
lroW

 lol
o W-
!H e
ldr 

*___  ___  o
o|__) |__) *
*|    |    o
o __   __  *
*|    | _  o
o|__  |__| *

|_____)   *o
 |_ _     *o
||_ __|   *o
o*|_____)   
o* |_ _     
o*||_ _     

5

J, 45 39 bayt

   $$[:,@;@|.@|:([:,:~2,2%~1{$)<@|:@|.;.3]

J, ;.çok yardımcı olan bir mozaikleme fonksiyonuna (kesme ) sahiptir.

   ]input=.4 6$97}.a.
abcdef
ghijkl
mnopqr
stuvwx

   ($$[:,@;@|.@|:([:,:~2,2%~1{$)<@|:@|.;.3]) input
jdkelf
vpwqxr
gahbic
smtnuo


4

Haskell, 128 127 bayt

import Control.Monad
f=g.ap((++).map snd)(map fst).map(splitAt=<<(`div`2).length)
g(a:b:c)=(h=<<zip b a):g c
g x=x
h(a,b)=[a,b]

Kullanım: f ["12", "34"]->["42","31"]

Nasıl çalışır:

                                 input list:
                                   ["abcdef", "ghijkl", "mnopqr", "stuvwx"]
==========================================================================

map(splitAt=<<(`div`2).length)   split every line into pairs of halves:
                                   -> [("abc","def"),("ghi","jkl"),("mno","pqr"),("stu","vwx")]
ap((++).map snd)(map fst)        take all 2nd elements of the pairs and
                                 put it in front of the 1st elements:
                                   -> ["def","jkl","pqr","vwx","abc","ghi","mno","stu"]
(    zip b a) : g c              via g: take 2 elements from the list and
                                 zip it into pairs (reverse order), 
                                 recur until the end of the list:
                                   -> [[('j','d'),('k','e'),('l','f')],[('v','p'),('w','q'),('x','r')],[('g','a'),('h','b'),('i','c')],[('s','m'),('t','n'),('u','o')]]
h=<<                             convert all pairs into a two element list
                                 and concatenate:
                                   -> ["jdkelf","vpwqxr","gahbic","smtnuo"]  

Düzenleme: @Zgarb kaydedilecek bir bayt buldu.


Güzel! g x=xBoş liste durumu için 1 bayt kaydedebilirsiniz .
Zgarb

3

GNU sed -r, 179 bayt

Puan, -r arg için sed .

Bunu nasıl yapacağımı anlamak biraz zaman aldı sed, ama sanırım şimdi var:

# Insert : markers at start and end of each row
s/  /:  :/g
s/(^|$)/:/g
# Loop to find middle of each row
:a
# Move row start and end markers in, one char at a time
s/:([^  :])([^  :]*)([^ :]):/\1:\2:\3/g
ta
# Loop to move left half of each row to end of pattern buffer
:b
s/([^   :]+)::(.*)/\2   \1/
tb
# remove end marker
s/$/:/
# double loop to merge odd and even rows
:c
# move 1st char of rows 2 and 1 to end of pattern buffer
s/^([^  :])([^  ]*) ([^ ])(.*)/\2   \4\3\1/
tc
# end of row; remove leading tab and add trailing tab 
s/^ +(.*)/\1    /
tc
# remove markers and trailing tab
s/(:|   $)//g

Yukarıdaki tüm boşlukların tek olması gerektiğini unutmayın tab karakter . Yorumlar golf skoruna dahil değildir.

Bunun, :işaretleyici karakterleri kapsamlı şekilde kullandığını da unutmayın . Giriş akışı içeriyorsa :, tanımlanmamış davranış ortaya çıkacaktır. Tüm bunlar değiştirilerek hafifletilebilir.: , golf skoruna hiçbir ücret ödemeden baskı olmayan karakterlerle (örneğin BEL) .

Girdi ve çıktı sekmeyle ayrılmış bir dize listesidir:

$ echo 'Hell
!  o
d  -
lroW' | paste -s - | sed -rf baker.sed | tr '\t' '\n'
 lol
o W-
!H e
ldr 
$ 

3

J, 33 32 karakter

Monadik bir fiil.

0 2,.@|:_2|.\"1-:@#@{.(}.,.{.)|:

açıklama

YÖrnek girdi olarak tanımlayarak başlayalım .

   ] Y =. a. {~ 65 + i. 4 6          NB. sample input
ABCDEF
GHIJKL
MNOPQR
STUVWX

İlk bölüm ( -:@#@{. (}. ,. {.) |:) ikiye bölünür Yve sonra sona erer:

   # {. Y                            NB. number of columns in Y
6
   -: # {. Y                         NB. half of that
3
   |: Y                              NB. Y transposed
AGMS
BHNT
CIOU
DJPV
EKQW
FLRX
   3 {. |: Y                         NB. take three rows
AGMS
BHNT
CIOU
   3 }. |: Y                         NB. drop three rows
DJPV
EKQW
FLRX
   3 (}. ,. {.) |: Y                 NB. stitch take to drop
DJPVAGMS
EKQWBHNT
FLRXCIOU

İkinci bölümde ( _2 |.\"1) bunu ikiye ayırdık ve tersine çevirdik:

   R =. (-:@#@{. (}. ,. {.) |:) Y    NB. previous result
   _2 <\"1 R                         NB. pairs put into boxes
┌──┬──┬──┬──┐
│DJ│PV│AG│MS│
├──┼──┼──┼──┤
│EK│QW│BH│NT│
├──┼──┼──┼──┤
│FL│RX│CI│OU│
└──┴──┴──┴──┘
   _2 <@|.\"1 R                      NB. reversed pairs
┌──┬──┬──┬──┐
│JD│VP│GA│SM│
├──┼──┼──┼──┤
│KE│WQ│HB│TN│
├──┼──┼──┼──┤
│LF│XR│IC│UO│
└──┴──┴──┴──┘

Son olarak ( 0 2 ,.@|:), matrisi gerektiği gibi aktarırız ve arka ekseni atarız:

   ] RR =. _2 |.\"1 R                NB. previous result
JD
VP
GA
SM

KE
WQ
HB
TN

LF
XR
IC
UO
   0 2 |: RR                         NB. transpose axes
JD
KE
LF

VP
WQ
XR

GA
HB
IC

SM
TN
UO
   ($ RR) ; ($ 0 2 |: RR)            NB. comparison of shapes
┌─────┬─────┐
│3 4 2│4 3 2│
└─────┴─────┘
   ,. 0 2 |: RR                      NB. discard trailing axis
JDKELF
VPWQXR
GAHBIC
SMTNUO

Boşluk eklenmiş tüm ifade:

0 2 ,.@|: _2 |.\"1 -:@#@{. (}. ,. {.) |:

Ve açık bir fiil olarak:

3 : ',. 0 2 |: _2 |.\"1 (-: # {. y) (}. ,. {.) |: y'
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.