Tessitura di mazze da golf


14

Nota: la prima metà di questa sfida proviene dalla precedente sfida di Martin Ender, Visualize Bit Weaving .

Il malefico linguaggio di programmazione esoterico ha un'interessante operazione sui valori di byte che chiama "tessitura".

È essenzialmente una permutazione degli otto bit del byte (non importa da quale fine iniziamo il conteggio, poiché il modello è simmetrico):

  • Il bit 0 viene spostato nel bit 2
  • Il bit 1 viene spostato sul bit 0
  • Il bit 2 viene spostato sul bit 4
  • Il bit 3 viene spostato sul bit 1
  • Il bit 4 viene spostato sul bit 6
  • Il bit 5 viene spostato sul bit 3
  • Il bit 6 viene spostato sul bit 7
  • Il bit 7 viene spostato sul bit 5

Per comodità, ecco altre tre rappresentazioni della permutazione. Come un ciclo:

(02467531)

Come mappatura:

57361402 -> 76543210 -> 64725031

E come un elenco di coppie della mappatura:

[[0,2], [1,0], [2,4], [3,1], [4,6], [5,3], [6,7], [7,5]]

Dopo i 8weavings, il byte viene sostanzialmente resettato.

Ad esempio, la tessitura del numero 10011101(che è 157nella base 10) produrrà 01110110(che è 118nella base 10).

Ingresso

Vi sono solo 256input validi, vale a dire tutti i numeri interi compresi 0e 255compresi. Questo può essere preso in qualsiasi base, ma deve essere coerente e devi specificarlo se la base scelta non è la base dieci.

Si può non pari a zero-pad ingressi.

Produzione

Dovresti produrre il risultato della tessitura dei bit, in qualsiasi base, che deve anche essere coerente e specificato se non in base dieci.

È possibile azzerare le uscite.


Correlati: Visualizza la tessitura dei bit


5
Curiosità: questa è la sfida che volevo pubblicare in origine. Quindi ho disegnato l'arte ASCII per visualizzare la permutazione, e poi Sp3000 ha suggerito che il rendering avrebbe rappresentato una sfida migliore. ;)
Martin Ender,

2
La base di output può essere diversa dalla base di input? Quando dici "coerente" capisco che come "ogni possibile input nella stessa base"
Luis Mendo,

Penso che la rappresentazione come ciclo sarebbe più utile della rappresentazione della mappatura.
mbomb007,

Devo dire che l'arte ASCII è decisamente più divertente.
Insane

2
Questo potrebbe davvero utilizzare alcuni altri casi di test.
James,

Risposte:


32

Python 2.7, 44 -> 36 byte

lambda x:x/4&42|x*2&128|x*4&84|x/2&1

10
Ottima prima risposta, benvenuto in PPCG! :)
Martin Ender,

10
Se usi |invece di +e maschera dopo lo spostamento, puoi radere 8 byte rimuovendo le parentesi.
PellMell,

Dato che sei nuovo, ti faccio notare che puoi prendere il suggerimento di @ PellMell per migliorare il tuo golf e quindi utilizzare il <strike></strike>tuo vecchio punteggio in byte per indicare l'avanzamento :-)
Insane


16

Male, 3 personaggi

rew

Provalo online!

L'ingresso è in base 256, (ad es. ASCII), ad es. Per inserire la cifra 63, inserire ASCII 63 che è ?.

Spiegazione:

r          #Read a character
 e         #Weave it
  w        #Display it

Questo modo si sente come barare.


1
ASCII non è la base 256, è la base 128. Quale codifica viene utilizzata per gli ordinali 128-255? Modifica: sembra che usi solo la codifica del sistema.
Mego,

11

CJam, 15 12 byte

Grazie a FryAmTheEggman per aver salvato 3 byte.

l8Te[m!6532=

Input in base 2. Output anche in base 2, imbottito a 8 bit con zeri.

Provalo qui.

Spiegazione

l      e# Read the input.
8Te[   e# Left-pad it to 8 elements with zeros.
m!     e# Generate all permutations (with duplicates, i.e. treating equal elements
       e# in different positions distinctly).
6532=  e# Select the 6533rd, which happens to permute the elements like [1 3 0 5 2 7 4 6].

7

MATL , 14 byte

&8B[2K1B3D5C])

L'input è in decimale. L'output è binario con riempimento zero.

Provalo online!

Spiegazione

&8B         % Take input number implicitly. Convert to binary array with 8 digits
[2K1B3D5C]  % Push array [2 4 1 6 3 8 5 7]
)           % Index first array with second array. Implicitly display

7

Gelatina, 11 byte

+⁹BḊŒ!6533ị

Traduzione della risposta CJam di Martin. Provalo qui.

+⁹BḊ          Translate (x+256) to binary and chop off the MSB.
              This essentially zero-pads the list to 8 bits.
    Œ!        Generate all permutations of this list.
      6533ị   Index the 6533rd one.

1
Mi piace il trucco zero padding. Elegante.
trichoplax,

7

JavaScript (ES6), 30 byte

f=n=>n*4&84|n*2&128|n/2&1|n/4&42

Bel abuso di precedenza!
Leaky Nun,

1
Sicuramente la precedenza è stata progettata per funzionare in questo modo! Funzionerebbe anche con i bit shift, ma sono più lunghi.
Neil,

6

J, 12 byte

6532 A._8&{.

Utilizza il permute incorporato A.con indice di permutazione 6532che corrisponde all'operazione di tessitura dei bit.

uso

L'input è un elenco di cifre binarie. L'output è un elenco con zero cifre di 8 cifre binarie.

   f =: 6532 A._8&{.
   f 1 0 0 1 1 1 0 1
0 1 1 1 0 1 1 0
   f 1 1 1 0 1 1 0
1 1 0 1 1 0 0 1

Spiegazione

6532 A._8&{.  Input: s
       _8&{.  Takes the list 8 values from the list, filling with zeros at the front
              if the length(s) is less than 8
6532          The permutation index for bit-weaving
     A.       permute the list of digits by that index and return

6

Retina , 39 byte

+`^(?!.{8})
0
(.)(.)
$2$1
\B(.)(.)
$2$1

Ingresso e uscita in base 2, uscita con imbottitura a sinistra.

Provalo online!

Spiegazione

+`^(?!.{8})
0

Questo ha appena lasciato il pad sull'input con zeri. Il +indica che questa fase viene ripetuta finché la corda smette di cambiare. Corrisponde all'inizio della stringa purché contenga meno di 8 caratteri e inserisce a 0in quella posizione.

Ora per la permutazione effettiva. La soluzione diretta è questa:

(.)(.)(.)(.)(.)(.)(.)(.)
$2$4$1$6$3$8$5$7

Tuttavia è dolorosamente lungo e ridondante. Ho trovato una diversa formulazione della permutazione che è molto più facile da implementare in Retina ( Xrappresenta uno scambio di bit adiacenti):

1 2 3 4 5 6 7 8
 X   X   X   X
2 1 4 3 6 5 8 7
   X   X   X
2 4 1 6 3 8 5 7

Ora è molto più facile da implementare:

(.)(.)
$2$1

Questo semplicemente abbina due personaggi e li scambia. Poiché le partite non si sovrappongono, questo scambia tutte e quattro le coppie.

\B(.)(.)
$2$1

Ora vogliamo fare di nuovo la stessa cosa, ma vogliamo saltare il primo personaggio. Il modo più semplice per farlo è richiedere che la corrispondenza non inizi con un limite di parole \B.


6

codice macchina x86, 20 byte

In esadecimale:

89C22455C1E002D0E0D1E880E2AAC0EA0211D0C3

È una procedura che accetta input e restituisce risultati tramite il registro AL

Smontaggio

89 c2                   mov    edx,eax
24 55                   and    al,0x55  ;Clear odd bits
c1 e0 02                shl    eax,0x2  ;Shift left, bit 6 goes to AH...
d0 e0                   shl    al,1     ;...and doesn't affected by this shift
d1 e8                   shr    eax,1    ;Shift bits to their's target positions
80 e2 aa                and    dl,0xaa  ;Clear even bits
c0 ea 02                shr    dl,0x2   ;Shift right, bit 1 goes to CF
11 d0                   adc    eax,edx  ;EAX=EAX+EDX+CF
c3                      ret

5

C (macro non sicura), 39 byte

#define w(v)v*4&84|v*2&128|v/2&1|v/4&42

C (funzione), 41 byte

w(v){return v*4&84|v*2&128|v/2&1|v/4&42;}

C (programma completo), 59 byte

main(v){scanf("%d",&v);return v*4&84|v*2&128|v/2&1|v/4&42;}

(ritorna tramite il codice di uscita, quindi invocare con echo "157" | ./weave;echo $?)

C (programma completo conforme agli standard), 86 byte

#include<stdio.h>
int main(){int v;scanf("%d",&v);return v*4&84|v*2&128|v/2&1|v/4&42;}

C (programma completo conforme agli standard senza avvisi del compilatore), 95 byte

#include<stdio.h>
int main(){int v;scanf("%d",&v);return (v*4&84)|(v*2&128)|(v/2&1)|(v/4&42);}

C (programma completo conforme agli standard senza avvisi del compilatore in grado di leggere da argomenti o stdin e include controllo errori / intervallo), 262 byte

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(int v,char**p){v=v<2?isatty(0)&&puts("Value?"),scanf("%d",&v)?v:-1:strtol(p[1],p,10);exit(*p==p[1]||v&255^v?fprintf(stderr,"Invalid value\n"):!printf("%d\n",(v*4&84)|(v*2&128)|(v/2&1)|(v/4&42)));}

Abbattersi

Più o meno lo stesso di molte risposte esistenti: sposta i bit in posizione usando <<2( *4), <<1( *2), >>1( /2) e>>2 ( /4), quindi| tutto insieme.

Il resto non è altro che sapori diversi di piastra della caldaia.


4

Mathematica, 34 byte

PadLeft[#,8][[{2,4,1,6,3,8,5,7}]]&

Funzione anonima. Prende un elenco di cifre binarie e genera un elenco imbottito di 8 cifre binarie.


3

PowerShell v2 +, 34 byte

("{0:D8}"-f$args)[1,3,0,5,2,7,4,6]

Traduzione della risposta di @ LegionMammal978 . Programma completo. Accetta input tramite argomento della riga di comando come numero binario, output come array binario, con riempimento zero.

La "{0:D8}"-fporzione utilizza stringhe di formato numerico standard per anteporre 0all'input $args. Poiché l' -foperatore supporta l'utilizzo di un array come input e abbiamo esplicitamente dichiarato di utilizzare il primo elemento {0:, non è necessario fare il solito $args[0]. Incapsuliamo quella stringa in parentesi, quindi ci indicizziamo [1,3,0,5,2,7,4,6]con la tessitura. L'array risultante viene lasciato sulla pipeline e l'output è implicito.

Esempi

(il valore predefinito .ToString()per un array ha il separatore come `n, quindi ecco perché l'output è newline separato qui)

PS C:\Tools\Scripts\golfing> .\golf-bit-weaving.ps1 10011101
0
1
1
1
0
1
1
0

PS C:\Tools\Scripts\golfing> .\golf-bit-weaving.ps1 1111
0
0
0
1
0
1
1
1

3

Matlab, 49 48 44 byte

s=sprintf('%08s',input(''));s('24163857'-48)

Accetta input come stringa di valori binari. Uscita imbottita. 4 byte salvati grazie a @Luis Mendo.

Spiegazione:

input('')             -- takes input
s=sprintf('%08s',...) -- pads with zeros to obtain 8 digits
s('24163857'-48)      -- takes positions [2 4 1 6 3 8 5 7] from s (48 is code for '0')

3

V , 17 byte

8é0$7hd|òxplò2|@q

Provalo online!

Questo richiede input e output in binario. Gran parte del conteggio dei byte deriva dal riempimento con 0. Se il riempimento fosse consentito, potremmo semplicemente fare:

òxplò2|@q

Grazie alla soluzione di Martin per il metodo di scambio di caratteri, ad esempio:

1 2 3 4 5 6 7 8
 X   X   X   X
2 1 4 3 6 5 8 7
   X   X   X
2 4 1 6 3 8 5 7

Spiegazione:

8é0                 "Insert 8 '0' characters
   $                "Move to the end of the current line
    7h              "Move 7 characters back
      d|            "Delete until the first character
        ò   ò       "Recursively:
         xp         "Swap 2 characters
           l        "And move to the right
             2|     "Move to the second column
               @q   "And repeat our last recursive command.

3

05AB1E, 14 12 byte

žz+b¦œ6532èJ

Spiegazione

žz+b¦           # convert to binary padded with 0's to 8 digits
     œ6532è     # get the 6532th permutation of the binary number
           J    # join and implicitly print

L'ingresso è nella base 10. L'
uscita è nella base 2.

Prende in prestito il trucco di permutazione dalla risposta CJam di MartinEnder

Provalo online


2

Pyth, 19 personaggi

s[@z1.it%2tzP%2z@z6

Ingresso e uscita sono base 2.

Lontano da un esperto di Pyth, ma dal momento che nessun altro ha risposto con esso, ho provato.

Spiegazione:

s[                # combine the 3 parts to a collection and then join them
  @z1             # bit 1 goes to bit 0
  .i              # interleave the next two collections
    t%2tz         # bits 3,5,7; t is used before z to offset the index by 1
    P%2z          # bits 0,2,4
  @z6             # bit 6 goes to bit 7

Ciò non è valido poiché si presuppone un input a zero.
Leaky Nun,


2

UGL , 50 byte

cuuRir/r/r/r/r/r/r/%@@%@@%@@%@@@%@@%@@%@@@oooooooo

Provalo online!

Rip-mod ripetutamente di 2, quindi %scambiare e @rotolare per farli nel giusto ordine.

Input in base-dieci, output in base-due.


1

vi, 27 byte

8I0<ESC>$7hc0lxp<ESC>l"qd0xp3@q03@q

Dove <ESC>rappresenta il personaggio Escape. L'I / O è binario, l'output è imbottito. 24 byte in vim:

8I0<ESC>$7hd0xpqqlxpq2@q03@q

<ESC>ha bisogno di backtick intorno ad esso. Modificherei, ma non riesco a capire altri 4 byte da modificare ...
Joe,

@SirBidenXVII Grazie, risolto.
Neil,

0

In realtà, 27 byte

'08*+7~@tñiWi┐W13052746k♂└Σ

Provalo online!

Questo programma fa input e output come una stringa binaria (l'output è a zero bit a 8 bit).

Spiegazione:

'08*+7~@tñiWi┐W13052746k♂└Σ
'08*+                        prepend 8 zeroes
     7~@t                    last 8 characters (a[:~7])
         ñi                  enumerate, flatten
           Wi┐W              for each (i, v) pair: push v to register i
               13052746k     push [1,3,0,5,2,7,4,6] (the permutation order, zero-indexed)
                        ♂└   for each value: push the value in that register
                          Σ  concatenate the strings

0

JavaScript, 98 byte

L'input è preso in base-2 come stringa, anche l'output è base-2 come stringa

n=>(n.length<8?n="0".repeat(8-n.length)+n:0,a="13052746",t=n,n.split``.map((e,i)=>t[a[i]]).join``)
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.