Inversione interlacciata


20

Data una stringa, invertirla in modo incrociato. Ecco come farlo per abcdefghie abcdefghij, indicizzato 0:

  1. Separare i caratteri ad indici pari dai caratteri ad indici dispari:
    Acegi
     bdfh
    Acegi bdfhj
  2. Invertire i caratteri negli indici dispari:
    Acegi
     hfdb
    Acegi jhfdb
  3. Interlaccia di nuovo in una stringa:
    ahcfedgbi 
    ajchefgdib

Regole

  • È necessario supportare stringhe sia di lunghezza pari che di lunghezza dispari.
  • Per quanto riguarda l'indice 0, è necessario invertire i caratteri a indici dispari, nemmeno pari.
  • Per quanto riguarda l'indice, ovviamente, devi invertire i caratteri con indici pari, non dispari.
  • L'input consisterà in ASCII stampabile (punti di codice 32-126), senza nuove righe.
  • È possibile accettare input come stringa o come elenco di caratteri (NON stringhe da 1 carattere). Ad esempio String/ char[]o char*sono consentiti, ma String[]/ char[][]o char**non lo sono.

Casi test

Input
Output

Hello, World!
HdlroW ,olle!

Hello World!
H!llooW rlde

ABCDEFGHIJKLMNOPQRSTUVWXYZ
AZCXEVGTIRKPMNOLQJSHUFWDYB

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
 }"{$y&w(u*s,q.o0m2k4i6g8e:c<a>_@]B[DYFWHUJSLQNOPMRKTIVGXEZC\A^?`=b;d9f7h5j3l1n/p-r+t)v'x%z#|!~

P
P

AB
AB

xyz
xyz

Per la stringa vuota, restituisce la stringa vuota stessa.



Ricordo che si trattava di un tipo di "codice segreto" (un po 'come il latino di maiale) che abbiamo imparato da bambini negli anni '80 o '90, qualcosa a che fare con la parola "recinto" o qualcosa del genere, ma la mia memoria è un po' confusa. Io ei miei amici avrebbero usato questo per codificare i messaggi segreti, e io non credo che l'adulti che hanno trovato le nostre lettere mai fatto capire fuori ...
phyrfox

@phyrfox potresti pensare alla cifra del recinto ferroviario , che è simile a questo.
Carmeister,

Ah, mi ricordo di averlo fatto.
Me21,

Risposte:


7

Gelatina , 7 byte

s2ZU2¦Z

Questo è un programma completo.

Provalo online!

Come funziona

s2ZU2¦Z  Main link. Argument: s (string)

s2       Split s into pairs.
  Z      Zip/tranpose, grouping characters by the parity of their indices.
     ¦   Sparse application:
   U         Upend; reverse both strings in the pair.
    2        Replace the second string with the reversed string.
      Z  Zip/transpose, interleaving the two strings.

È esattamente la mia soluzione byte per byte ...
Erik the Outgolfer

3
Allo stesso modo le menti pensano alla grande. ;)
Dennis,

12

MATL , 8 byte

t2L)P5M(

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

t     % Implicit input. Duplicate
      % STACK: 'abcdefghi', 'abcdefghi'
2L    % Push [2, 2, 1j]. This represents 2:2:end when used as an index
      % STACK: 'abcdefghi', 'abcdefghi', [2, 2, 1j]
)     % Get entries at those indices
      % STACK: 'abcdefghi', 'bdfh'
P     % Flip
      % STACK: 'abcdefghi', 'hfdb'
5M    % Push [2, 2, 1j] again
      % STACK: 'abcdefghi', 'hfdb', [2, 2, 1j]
(     % Write entries at those indices. Implicit display
      % STACK: 'ahcfedgbi'

5
Così 2Lè "Push [2,2,1j]", ed 5Mè "Push [2,2,1j] di nuovo" ... E alcune persone dicono che le lingue del golf non sono leggibili!
Leone,

3
@Leo :-D 2Lproduce un valore letterale predefinito. 5Mè un blocco per appunti automatico che memorizza input per chiamate di funzione recenti. Potrebbe effettivamente essere sostituito da 2Lper lo stesso conteggio di byte
Luis Mendo,

7

Alice , 10 byte

/ZY
\IOR@/

Provalo online!

La metà dei byte di questo programma viene spesa per formattare correttamente l'origine, i comandi effettivi sono giusti IYRZO , perché Alice ha i giusti comandi per questa attività.

Spiegazione

Come ho detto, i mirror ( /\), la newline e @sono lì solo per far muovere l'ip nella giusta direzione e terminare il programma alla fine. Il codice attuale, linearizzato, è il seguente:

IYRZO
I      Input a line
 Y     Unzip it into its even positions and its odd ones
  R    Reverse the odd positions
   Z   Zip it back again
    O  Output

Abbastanza semplice, direi.


Se solo potessi capire come funzionano gli specchi negli angoli ...
Luis Mendo

@LuisMendo prima passi attraverso lo specchio, il che ti fa passare dalla modalità cardinale (orizzontale / verticale) a quella ordinale (diagonale) o viceversa. Quindi se sei in modalità cardinale ti avvolgi dall'altra parte della linea / colonna, mentre se sei in modalità ordinale rimbalzi contro l'angolo. In questo caso lo specchio sud-est si incontra in modalità ordinale, ti fa passare al cardinale e si avvolge all'inizio della seconda linea, dove un altro specchio ti fa tornare all'ordinale e inizia a spostarsi verso nord-est
Leone

Ah, quindi il rimbalzo è solo in diagonale, nella stessa direzione in cui sei venuto. Quindi è più semplice di quanto pensassi. Grazie!
Luis Mendo,

6

Java (OpenJDK 8) , 108 96 94 93 byte

Salvato 1 byte utilizzando @ trucchetto di Neil di utilizzares[s.length+~i|1]

String f(char[]s){int a=s.length,b=0;String c="";for(;b<a;b++)c+=s[b%2<1?b:a+~b|1];return c;}

Provalo online!


1
Java sotto 100 byte ... sembra legittimo.
Erik the Outgolfer,

" Java (OpenJDK 8 ) " Allora perché stai usando un metodo Java 7 senza ricorsione? Utilizzare un lambda Java 8, sostituendo String f(char[]s)con s->.. E è possibile salvare un byte e mettendo il intdi inizializzazione all'interno del ciclo for: for(int a=s.length,b=0;b<a;b++). Provalo online.
Kevin Cruijssen,



3

JavaScript (ES6), 48 byte

f=
s=>s.replace(/./g,(c,i)=>i%2?s[s.length+~i|1]:c)
<input oninput=o.textContent=f(this.value)><pre id=o>


3

Gelatina , 9 byte

Ḋm2U
m2żÇ

Provalo online!

Ḋm2U Helper Link -> Dequeue (return last len-1 elements), take every second element, reverse
m2żÇ Main Link -> Take every second element, then interleave with the result of the helper link

-1 byte grazie a Dennis


Se si sostituisce ¢con Ç, non è necessario il ³collegamento nel supporto.
Dennis,

@Dennis Oh, quello che pensavo di aver fatto la prima volta> _> Nevermind, devo aver rovinato qualcosa. Grazie!
HyperNeutrino,

3

Retina ,17 13 byte

O^$`(?<=\G.).

Provalo online!

Risolto un errore grazie a Neil.

Risparmiato 4 byte grazie a Kobi.

Seleziona ogni lettera preceduta da un numero dispari di caratteri e li inverte. Fa questo usando \Gquale corrisponde alla fine dell'ultima partita.


L'ultima prova è sbagliata. Dovrai usare $invece di #.
Neil,

@Neil Whoops, hai perfettamente ragione. Fisso!
FryAmTheEggman,

Puoi usare \Ginvece sul lookbehind, e puoi rimuovere$ : O^`(?<=\G.).(12 byte)
Kobi,

1
@Kobi Grazie per i suggerimenti! Ma sfortunatamente mi è sembrato di poterlo rimuovere dal $momento che tutti gli input erano in ordine lessicografico ordinato. Ho aggiunto un nuovo caso di test in cui il tuo codice fallirebbe.
FryAmTheEggman,

@FryAmTheEggman - Capito, buon punto. Immagino sia stata solo fortuna.
Kobi,

2

PHP> = 7,1, 58 byte

for(;$i<$l=strlen($a=$argn);$i++)echo$a[$i&1?-$i-$l%2:$i];

Versione online


1
Perfetto. Il sistema operativo dice che devo digitare di più, ma quei 7 caratteri dicono tutto.
Tito,

2

APL (Dyalog) , 9 byte

Richiede ⎕IO←0(impostazione predefinita su molti sistemi) per una corretta definizione di pari e dispari.

⌽@{2|⍳≢⍵}

Provalo online!

 inverso

@ agli elementi filtrati dalla maschera risultano dall'applicazione del

{ funzione anonima

2| il mod-2 di

 gli indici di

 il conteggio (lunghezza) di

 l'argomento

} sull'argomento


La v16 è stata pubblicata anche quando è stata pubblicata questa domanda?
Zacharý,

@ Zacharý Era in beta, ma non ha più importanza .
Adám,

Oh, quindi suppongo che userai la V17 ora?
Zacharý,

1

Röda , 34 byte

f a{a/=""a[::2]<>reverse(a[1::2])}

Provalo online!

Spiegazione

a/=""                    Convert the argument a into an array of length-1 strings
      <>                 Interleave
a[::2]                   Every even element of a with
        reverse(a[1::2]) Every odd element of a reversed

Ecco una soluzione alternativa allo stesso tempo

36 34 byte

{[_/""]|_[::2]<>reverse(_1[1::2])}

Questa è una funzione anonima che accetta l'input come stringa dal flusso di input.




1

Haskell , 63 byte

(_:r)!(a:s)=a:s!r
_!_=[]
f s=([' '|even$length s]++reverse s)!s

Provalo online! Uso:f "some string" .

Per stringhe dispari come abcdefghi, la funzione fpassa la stringa e la sua inversione alla funzione !, che si alterna prendendo i caratteri da entrambe le stringhe. Per le stringhe pari questo non funziona e dobbiamo prima aggiungere un carattere fittizio per ottenere l'offset corretto.


1

C, 69 byte

c,l;f(char*s){l=strlen(s);for(c=0;c<l;++c)putchar(s[c&1?l-l%2-c:c]);}

Abbastanza semplice. Cammina la corda, stampando il carattere corrente o quello opposto.

Ungolfed e spiegato:

f(char *str) {
    int len = strlen(str);      // Get the total length
    for(int c = 0; c<len; ++c)  // Loop over the string
        putchar(s[              // Print the char that is,
            c & 1               // if c is odd,
                ? l - l % 2 - c // c chars from the end (adjusting odd lengths),
                : c             // and at index c otherwise
        ]);
}

1

Mathematica, 82 byte

""<>(f=Flatten)[{#&@@#,Reverse@Last@#}&@f[Characters@#~Partition~UpTo@2,{2}],{2}]&

1

Japt , 14 13 byte

12 byte di codice, +1 per la -Pbandiera.

Salvato 1 byte grazie a @Shaggy

¬ë íU¬Åë w)c

Spiegazione:

¬ë íU¬Åë w)c
¬                   Split the input into an array of chars
 ë                  Get every other char, starting at index 0
   í                Pair with:
    U¬                Input, split into a char array
      Å               .slice(1)
       ë              Get every other char
         w            Reverse
           c       Flatten
-P                 Join into a string

Provalo online!


Hmm, ë2,1è piuttosto brutto. Penso che tu possa fare ó oinvece, forse ...
ETHproductions

@ETHproductions Sì, penso che funzioni Åëanche.
Oliver,

Oh, bello :-)
ETHproductions


1

K (oK) , 18 byte

Soluzione:

{x[w:&2!!#x]:x@|w}

Provalo online!

Esempi:

> {x[w:&2!!#x]:x@|w}"Hello, World!"
"HdlroW ,olle!"
> {x[w:&2!!#x]:x@|w}"Hello World!"
"H!llooW rlde"

Spiegazione:

Interpretati principalmente da destra a sinistra, trova i caratteri degli indici dispari, invertili e rimettili nella stringa

{x[w:&2!!#x]:x@|w} / solution
{                } / lambda function with implicit parameter x
         #x        / count x,    #"Hello, World!" -> 13
        !          / til,        !13 -> 0 1 2 3 4 5 6 7 8 9 10 11 12
      2!           / 2 modulo,   2!0 1 2 3 4 5 6 7 8 9 10 11 12 -> 0 1 0 1 0 1 0 1 0 1 0 1 0
     &             / where true, @0 1 0 1 0 1 0 1 0 1 0 1 0 -> 1 3 5 7 9 11
   w:              / store in variable w
               |w  / reverse w,  |1 3 5 7 9 11 -> 11 9 7 5 3 1
             x@    / index into x at these indices
 x[        ]:      / assign right to x at these indices

1

J, 26 byte

[:,@,./(0 1$~#)]`(|.@])/.]

ungolfed

[: ,@,./ (0 1 $~ #) ]`(|.@])/. ]

spiegazione

  • (0 1$~#)]`(|.@])/.]Utilizzare il tasto /.per dividere l'input nei gruppi pari / dispari: (0 1$~#)crea la definizione del gruppo, ripetendo ciclicamente 0 e 1 per la lunghezza dell'input. Usiamo la forma gerundica di Chiave per il suo verbo principale]`(|.@]) , che applica l'identità al primo gruppo e inverte il secondo gruppo:(|.@]) .
  • Ora che abbiamo i due gruppi, quello dispari invertito, li comprimiamo e li appiattiamo: ,@,./

Provalo online!


21 byte con (\:2|#\)({~/:)#\<.#\.e 19 byte con [:,@,./]]| ./. ~ 2 | # `
miglia

grazie miglia. c'è un errore di battitura nel secondo? Ricevo un errore
Giona

@miles anche il primo: capisco come analizza e tecnicamente cosa sta succedendo, ma non vedo la strategia generale. puoi chiarire?
Giona,

oh sì, dovrebbe essere [:,@,./]]`|./.~2|#\, le zecche sono state analizzate
miglia

17 byte con0,@|:]]`|./.~2|#\
miglia

0

Python 3, 93 87 byte

lambda s:"".join("".join(t)for t in zip(s[::2],reversed(s[1::2])))+("",s[-1])[len(s)%2]

Sostituisci reversed(s[1::2])con s[1::2][::-1]per salvare 4 byte
Mr. Xcoder

Si riduce a 83 byte e golfable, alla fine:f=lambda s,j="".join:j(j(t)for t in zip(s[::2],s[1::2][::-1]))+("",s[-1])[len(s)%2]
Mr. Xcoder

0

Perl 6 ,  63 58  55 byte

{[~] .comb[{flat roundrobin (0,2...^*>=$_),[R,] 1,3...^*>=$_}]}

Provalo

{[~] flat roundrobin .comb[{0,2...*},{$_-1-$_%2,*-2...*}]}

Provalo

{[~] flat roundrobin .comb[{0,2...*},{[R,] 1,3...^$_}]}

Provalo

{  # bare block lambda with implicit parameter 「$_」

  [~]                 # reduce using string concatenation operator

    flat              # make the following a flat list

    roundrobin        # grab one from each of the following 2 lists,
                      # repeat until both are empty

    .comb\            # split the input into graphemes (implicit method call)

    [                 # index into that sequence



      { 0, 2 ... * }, # code block producing every non-negative even number


      {               # code block producing reversed odd numbers
                      # (「$_」 here contains the number of available elements)

        [R,]          # reduce with reversed comma operator
                      # (shorter than 「reverse」)

        1, 3 ...^ $_  # odd numbers stopping before it gets
                      # to the number of input elements
      }


    ]
}

Ho dovuto usare roundrobinpiuttosto che zip, perché si zipferma non appena una delle liste di input è esaurita.




0

GNU APL 1.2, 24 byte

R[X]←⌽R[X←2×⍳⌊.5×⍴R←⍞]◊R

APL funziona da destra a sinistra. ⍴R←⍞assegna l'input dell'utente a Re quindi ne valuta la lunghezza. Dimezzalo moltiplicando per .5e applica la funzione piano. restituisce tutti i numeri da 1 all'argomento.

APL funziona su array, quindi l'array da cui siamo appena arrivati raddoppia ogni elemento, dandoci solo gli indici pari (1-indicizzato, quindi si basa su⎕IO sull'essere 1).

Quando si accede a più indici di un vettore, APL fornisce gli elementi di quegli indici in un vettore. R[X←2×⍳⌊.5×⍴R←⍞]fornisce solo gli elementi con indice pari. inverte gli elementi. Quindi, riassegnare i valori invertiti agli indici pari (assegnando questi indici per Xsalvare 6 byte).

è il separatore di istruzioni. Al termine dell'inversione, valutare Rper stampare il risultato.


0

Perl 5, 46 + 3 per -F flag = 49 byte

while(++$x<@F){print$F[$x%2?$x-1:@F-$x-$#F%2]}

Utilizza il -Fflag per dividere automaticamente l'input in una matrice di caratteri,@F . Passa attraverso l'array e genera quell'elemento per un indice pari o quell'indice (più uno per una stringa di lunghezza dispari) dall'estremità per un input dispari.

Riceve input con una nuova riga finale. Senza la nuova riga finale, puoi semplicemente modificare il pre-incremento in $xun post-incremento.

Un po 'più leggibile:

while(++$x<@F) { #While the index is less than the number of elements in the array. $x is 1-indexing the array despite the fact that perl is 0-indexed because it keeps us from having to use a proper for loop or a do-while loop
    if($x%2) { #If $x is odd
        print $F[$x-1] #Print the element
    } else {
        print $F[@F-$x-$#F%2] #Print from the end. $#F%2 fixes it for odd length strings    
    }
}

0

05AB1E , 21 byte

DgÉi¶«}2ô.BøRćR‚˜øJ¶K

Provalo online!

Sto indovinando il motivo per cui questo non è stato fatto in 05AB1E è perché è disgustoso ...

Ancora un'altra volta zipfa male la funzione auto-drop-last-element anziché aiuta.

PS Se hai suggerimenti di miglioramento sulla mia risposta, pubblica la tua; è probabilmente abbastanza un miglioramento per giustificare il raggiungimento dei punti. Mi vergogno abbastanza di questa risposta.


0

q / kdb +, 70 56 47 38 35 29 27 byte

Soluzione:

{x[w]:x(|)w:(&)#:[x]#0 1;x}

Esempio:

q){x[w]:x(|)w:(&)#:[x]#0 1;x}"Hello, World!"
"HdlroW ,olle!"
q){x[w]:x(|)w:(&)#:[x]#0 1;x}"Hello World!"
"H!llooW rlde"

Spiegazione:

Trova gli indici dispari della stringa, inverti questo elenco, estrai gli elementi in questi punti e quindi riassegnali sul posto alla stringa originale.

{x[w]:x reverse w:where count[x]#0 1;x} / ungolfed
{                                   ; } / lambda function with two lines
                                 0 1    / the list (0;1)
                                #       / take
                        count[x]        / length of input
                  where                 / indices where this is > 0
                w:                      / save in variable w
        reverse                         / reverse this list
      x                                 / index into x at these points
     :                                  / assignment             
 x[w]                                   / assign x at indices with new values
                                     x  / return x

modifiche:

  • -9 byte; passare countper (#:), tilper (!), whereper (&:)e reverseper (|:).

  • -3 byte; passare (#:)per (#), (&:)per (&)e (|:)per(|)

  • -6 byte; riscrittura completa

  • -2 byte; usando il compito piuttosto che applicare


0

05AB1E , 12 byte

RDgÈúøvyNÉè?

Provalo online!

RDgÈúøvyNÉè?   Implicit input: "abcdefghij"
R              Reverse the string: "jihgfedcba"
 DgÈú          Put (length is even?1:0) spaces in front of it " jihgfedcba"
     ø         Zip (reinjects the input implicitly): ["a ", "bj", "ci", ...]
      vy       For each element of the list
        NÉè    Extract&push element[iteration is odd?1:0] 
           ?   Print without newline
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.