Mappa del panettiere discreta


15

introduzione

La mappa di Baker è un importante sistema dinamico che mostra un comportamento caotico. È una funzione dall'unità quadrata a se stessa definita intuitivamente come segue.

  • Taglia il quadrato verticalmente a metà, risultando in due rettangoli di dimensioni 0.5×1.
  • Impila la metà destra sopra la sinistra, ottenendo un rettangolo di dimensioni 0.5×2
  • Comprimi il rettangolo in un 1×1quadrato.

In questa sfida, implementerai una versione discreta di questa trasformazione.

Ingresso e uscita

Il tuo input è un array 2D di caratteri ASCII stampabili e spazi bianchi di dimensioni 2m×2nper alcuni m, n > 0. L'output è un array simile ottenuto come segue, utilizzando l' 6×4array

ABCDEF
GHIJKL
MNOPQR
STUVWX

come esempio. Innanzitutto, impila la metà destra dell'array sopra la metà sinistra:

DEF
JKL
PQR
VWX
ABC
GHI
MNO
STU

Quindi, dividi le colonne in coppie di caratteri e ruota indipendentemente ogni coppia di 90 gradi in senso orario, "comprimendo" il rettangolo alto alla forma originale:

JDKELF
VPWQXR
GAHBIC
SMTNUO

Questo è l'output corretto per l'array sopra.

Regole

I formati di input e output sono flessibili. È possibile utilizzare stringhe delimitate da newline, elenchi di stringhe o matrici 2D di caratteri. Tuttavia, l'input e l'output devono avere lo stesso formato esatto: devi essere in grado di ripetere il tuo invio un numero arbitrario di volte su qualsiasi input valido.

È possibile scrivere un programma completo o una funzione. Vince il conteggio di byte più basso e non sono consentite scappatoie standard.

Casi test

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*||_ _     

Risposte:


11

Pyth, 25 19 18 byte

msC_dcs_Cmck/lk2Q2

Dimostrazione online . Utilizza una matrice 2D di caratteri.

La matrice di stringhe è più lunga di un carattere (19 byte). Dimostrazione online

Spiegazione:

         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

All'inizio l'ultima parte è un po 'confusa. Supponiamo di avere la tupla ['DEF', 'JKL'](utilizzo l'esempio dall'OP).

    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
Non ti sto prendendo in giro, ho solo scritto in modo indipendente l' esatto stessa soluzione come avete fatto. Ho cercato tutte le risposte per farmi un'idea, ma nulla di dettagliato.
orlp,

@orlp Sì, è abbastanza frequente che l'approccio diretto in Pyth sia il più breve. Quindi più persone lo trovano facilmente.
Jakube,

@orlp Btw, ha appena fatto una richiesta pull al repository Pyth (non ancora accettato). In futuro puoi semplicemente fare c2kinvece di ck/lk2. c2kdivide la stringa in due parti uguali.
Jakube,

9

Julia, 136 byte

Un'implementazione molto semplice. Non è un ingresso particolarmente competitivo, ma è stato divertente!

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)

Ciò crea una funzione lambda che accetta un array bidimensionale come input e restituisce un array bidimensionale trasformato.

Ungolfed + spiegazione:

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

Per chiamarlo, assegnare un nome alla funzione, ad es f=A->(...).

Esempio di output:

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

E prova che può essere arbitrariamente incatenato:

julia> f(f(B))

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

I suggerimenti sono ben accetti come sempre e sarò felice di fornire ulteriori spiegazioni.


8

CJam, 25 24 byte

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

Implementazione diretta delle specifiche. Spiegazione:

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";

Provalo online qui


7

JavaScript (ES6), 104 141

Modifica Rivedendo le specifiche, ho scoperto che il numero di righe deve essere pari (l'ho perso prima). Quindi non è troppo complicato trovare la posizione di origine corretta per ogni carattere nell'output in un unico passaggio.

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

Test nella console Firefox / FireBug

;[["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')))

Produzione

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 byte

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

J ha una funzione di tassellatura (taglio ;.) che aiuta molto.

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

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

Vedi la mia risposta per un altro modo di risolvere la sfida in J.
FUZxxl,

4

Haskell, 128 127 byte

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]

Utilizzo: f ["12", "34"]->["42","31"]

Come funziona:

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

Modifica: @Zgarb ha trovato un byte da salvare.


Bello! È possibile salvare 1 byte facendo g x=xper il caso elenco vuoto.
Zgarb,

3

GNU sed -r, 179 byte

Il punteggio include +1 per l' -rarg su sed.

Mi ci è voluto un po 'per capire come farlo sed, ma penso di averlo ora:

# 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

Nota tutti gli spazi bianchi sopra dovrebbero essere singoli tabcaratteri. I commenti non sono inclusi nel punteggio del golf.

Si noti inoltre che questo fa ampio uso di :caratteri marker. Se il flusso di input contiene :, si verificherà un comportamento indefinito. Questo può essere mitigato sostituendo tutto :con qualche carattere non stampabile (es. BEL) senza alcun costo per il punteggio di golf.

Input e output sono un elenco di stringhe separate da tabulazioni:

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

3

J, 33 32 caratteri

Un verbo monadico.

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

Spiegazione

Cominciamo definendo Ydi essere il nostro input di esempio.

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

La prima parte ( -:@#@{. (}. ,. {.) |:) si divide Ya metà e poi aggiunge:

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

Nella seconda parte ( _2 |.\"1) lo dividiamo in coppie di due e li invertiamo:

   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│
└──┴──┴──┴──┘

Infine ( 0 2 ,.@|:), trasponiamo la matrice secondo necessità e scartiamo l'asse finale:

   ] 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

L'intera espressione con spazi bianchi inseriti:

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

E come verbo esplicito:

3 : ',. 0 2 |: _2 |.\"1 (-: # {. y) (}. ,. {.) |: y'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.