Decifrare il formato Wechsler esteso


18

Questa sfida si basa su un post sandbox di user48538 . Dal momento che non è più attivo su questo sito, ho accettato questa sfida.


apgsearch , il programma di ricerca della zuppa distribuita per Conway's Game of Life e il database dei risultati di ricerca, Catagolue use codici apg per classificare e indicare modelli. Gli stessi apgcodes utilizzano il formato Wechsler esteso , un'estensione di una notazione di pattern sviluppata da Allan Wechsler nel 1992.

I seguenti esempi e le immagini sono tratte da LifeWiki .

  1. Una stringa di n caratteri nel set che corrisponde al regex [0-9a-v]indica una striscia di cinque righe, larghe n colonne. Ogni carattere denota cinque celle in una colonna verticale corrispondenti alle stringhe di bit [ 00000, 10000, 01000... 00010, 10010, 01010, 11010... 11111].

    Ad esempio, 27deee6corrisponde a un'astronave pesante :

27deee6

[01100001101111011111100111100000000]
  1. Il personaggio zsepara le strisce contigue di cinque file.

    Ad esempio, 0ca178b96z69d1d96corrisponde a una natura morta a 31 bit:

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

[000110110001010101010010001011001110000000000011111000100000100101010100011011000000000000]
  1. I personaggi wex sono usati per abbreviare 00e 000, rispettivamente.

    Quindi w33z8kqrqk8zzzx33corrisponde a una navetta per api trans-regina :

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

(10 righe vuote omesse)

inserisci qui la descrizione dell'immagine

[0011000001100000000000000000000000000010000011100010001010111010111110000000000000000000000000000000000000000000000000000000000000000000000000011000001100000000000000000000000]
  1. Infine, i simboli che corrispondono al regex y[0-9a-z]corrispondono a corse comprese tra 4 e 39 secondi consecutivi 0.

    Un buon esempio è 31a08zy0123cko, corrispondente a una nave su quadpole :

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

[1100000000101000000000000000000010100000000000000000001010000000011000000000011000000001010000000011]

The Challenge

Write a program or a function to parse a string of the extended Wechsler format, defined above, and print (or return) the pattern corresponding to this string.

You may assume that the string is nonempty, and does not start or end with z.

You may use any reasonable output format, e.g., a string, a matrix, a 2d array. You may use any two values to represent 0 and 1, given that you declare them in the answer.

You may omit the trailing zeroes lines in the output, or add extra trailing zeroes lines. You may also add/omit trailing zeroes on each line, as long as all lines have the same length in the output.

You may return the transpose of the array, if that is more convenient.

This is , so the shortest code wins.

Test cases

153 => [[1, 1, 1], [0, 0, 1], [0, 1, 0], [0, 0, 0], [0, 0, 0]]
27deee6 => [[0, 1, 1, 0, 0, 0, 0], [1, 1, 0, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0]]
0ca178b96z69d1d96 => [[0, 0, 0, 1, 1, 0, 1, 1, 0], [0, 0, 1, 0, 1, 0, 1, 0, 1], [0, 1, 0, 0, 1, 0, 0, 0, 1], [0, 1, 1, 0, 0, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 1, 1, 1, 0, 0, 0], [1, 0, 0, 0, 0, 0, 1, 0, 0], [1, 0, 1, 0, 1, 0, 1, 0, 0], [0, 1, 1, 0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]]
w33z8kqrqk8zzzx33 => [[0, 0, 1, 1, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0], [0, 0, 1, 1, 1, 0, 0], [0, 1, 0, 0, 0, 1, 0], [1, 0, 1, 1, 1, 0, 1], [0, 1, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]
31a08zy0123cko => [[1, 1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0, 1, 1]]
o5995ozes88sezw33 => [[0, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 1, 0], [1, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 1], [1, 1, 0, 0, 1, 1], [1, 1, 1, 1, 1, 1], [0, 1, 0, 0, 1, 0], [0, 0, 1, 1, 0, 0], [0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
y3343x6bacy6cab6x343zkk8yy8kkzgo8gywg8ogz0123yw321zzgo4syws4ogzgh1yy1hgz221yy122zy3c2cx6d53y635d6xc2c => [[0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0], [1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1], [0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0], [0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], [1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1], [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

Will z ever occur at the very beginning?
Mr. Xcoder

@Mr.Xcoder The LifeWiki page does not say anything about that. But you can assume here that the string does not start or end with z.
alephalpha

3
Not really a Game of Life pattern, but just for fun: vv99f60vv99f60uv11320uv19rqz33y133y11322310132231
Arnauld

1
"You may return the transpose of the array" - if that's OK, what about other symmetries like upside-down etc...?
Jonathan Allan

1
Two of the first three answers fail for some of these: 1yx1, 1yy1, 1yw1 and 1yz1. Maybe they should be tests.
Jonathan Allan

Risposte:


2

Carbone , 50 byte

UB0≔⁺⭆χιββFS¿υ×0⁺⊟υ⌕βι≡ιz×⸿⁵y⊞υ⁴x×0³w¦00«P↓⮌⍘⌕βι²→

Provalo online! Il collegamento è alla versione dettagliata del codice. Usi 1e 0. Spiegazione:

UB0

Impostare lo sfondo, ovvero eventuali celle non stampate del rettangolo che racchiude l'output, su 0.

≔⁺⭆χιββ

Prefisso le cifre con l'alfabeto minuscolo predefinito.

FS

Passa sopra la stringa di input.

¿υ

Se l'elenco vuoto predefinito non è vuoto ...

×0⁺⊟υ⌕βι

... quindi stampa un numero di 0s dato dalla somma del numero spuntato dall'elenco e dall'indice del carattere corrente nelle cifre e nelle lettere. Vedi sotto per quello che è sempre quel numero.

≡ι

Passa al personaggio attuale.

z×⸿⁵

Se è un zquindi 5 ritorni a capo dell'output, portandoci alla striscia di output successiva.

y⊞υ⁴

Se è a y, quindi spingere 4verso l'elenco vuoto predefinito, facendo sì che 4+n 0s venga emesso la prossima volta.

x×0³

Se è un xoutput quindi 3 0s. (Questo viene fatto tramite ripetizione per evitare che il letterale 0tocchi il xo il seguente letterale.)

w¦00

Se è un woutput quindi 2 0s. ( ¦È necessario per separare i due letterali di stringa.)

«P↓⮌⍘⌕βι²→

Altrimenti, indicizza il carattere corrente nelle cifre e nelle lettere, converti in binario e stampa prima il risultato con il bit meno significativo verso il basso; quindi sposta il cursore a destra per la colonna successiva.


6

JavaScript (ES8), 197 byte

Accetta l'input come stringa. Restituisce una matrice di stringhe con '#' e spazi. L'output può includere spazi finali aggiuntivi (ma coerenti) su ciascuna riga.

s=>[x='x',...s.replace(/w|x|y./g,s=>''.padEnd(s<x?2:s>x?P(s[1],36)+4:3),P=parseInt)].map(c=>[!++w,1,2,3,4].map(i=>c<x?o[y+i-5]+=' #'[P(c,36)>>i&1]:o=[...++y&&o,'']),w=y=o=[])&&o.map(r=>r.padEnd(w))

Provalo online! (uscita preimpostata)

Come?

Variabili globali

  • Il personaggio "x"viene usato più volte, quindi vale la pena memorizzarlo nella variabile x .
  • La funzione parseIntviene utilizzato due volte, quindi vale la pena memorizzare nella variabile P .
  • y è l'indice di riga, inizializzato su 0 .
  • w tiene traccia di un limite superiore della larghezza utilizzato per riempire l'output finale.
  • o [] è l'array di output, inizialmente vuoto.

Pre-elaborazione di zeri ripetuti

Abbiamo prima sostituiamo tutti i modelli "w", "x"e "yX"nella stringa di ingresso con il numero appropriato di spazi. Questi spazi verranno in seguito interpretati come "0".

s.replace(
  /w|x|y./g,
  s => ''.padEnd(
    // w --> 2
    s < x ? 2 :
    // yX --> value of X + 4
    s > x ? P(s[1], 36) + 4 :
    // x --> 3
    3
  )
)

decodifica

Dividiamo la stringa risultante, anteponiamo un'iniziale "x"e ripetiamo 5 volte (con i = da 0 a 4 ) su ciascun carattere c :

  • Se c è inferiore a "x", aggiungiamo il modello corrispondente alle 5 righe successive.

    o[y + i - 5] += ' #'[P(c, 36) >> i & 1]
  • Se c è maggiore o uguale a "x", assegniamo 5 nuove stringhe vuote in o [] e aggiungiamo 5 a y . Questo viene attivato dall'iniziale "x"che è stato aggiunto all'inizio della stringa o da qualsiasi "z"contenuto originale.

    o = [...++y && o, '']

Imbottitura

Infine, inseriamo ogni stringa in o [] con spazi in modo che tutti abbiano w caratteri.

o.map(r => r.padEnd(w))

6

05AB1E , 148 132 98 byte

Sono uno studente di liceo e questa è stata la mia prima volta sia per giocare a golf che per usare 05AB1E, quindi i commenti sono apprezzati!

„YY¾38×:'Yð:žLRDUsð«#εNĀiDнXsk4+s¦sú]'W¾2×:'X¾3×:J'Z¶:.Bð¾:vNUyvDykDNX‚Š32VY‹iY+b¦RX_i¶ì}‚ˆ]¯{€¦˜J

Provalo online!

Provalo online!

Provalo online!

Prende l'input in maiuscolo e restituisce la matrice trasposta come più righe di output di 1 e 0 secondi. Può aggiungere ulteriori zeri.

Se si desidera eseguire il test con stringhe minuscole, aggiungere ul'intestazione TIO.

Se si desidera un output piuttosto stampato, aggiungere '1'█:'0'.:il piè di pagina TIO.

Spiegazione

(Sto chiamando "righe" e "colonne" al contrario di quello che potresti aspettarti perché genera la matrice trasposta)

L'algoritmo di base è:

  1. Sostituisci "yy" con 38 0s
  2. Dividi su "y" ed espandi le corse 0.
  3. Sostituisci "w" e "x"
  4. Scopri la colonna più lunga (ovvero la stringa più lunga tra le z) e riempi tutte le altre colonne in modo che siano lunghe. (Ciò è necessario a causa del funzionamento dell'algoritmo seguente)
  5. Dividi su z
  6. A questo punto, la stringa di input è una matrice di colonne in cui ogni colonna è una stringa di [0-9A-V], in cui ogni colonna ha la stessa lunghezza.
  7. L'algoritmo per farlo nel formato di output è
    1. Converti i caratteri in numeri utilizzando indexOf in una stringa di ricerca
    2. Converti i caratteri in binario e poi pad per la lunghezza 5
    3. Se è la prima colonna, aggiungi un'interruzione di riga prima del numero binario
    4. Aggiungi un prefisso all'inizio della stringa binaria che memorizza la riga e quindi la colonna del carattere.
    5. Inserire la stringa binaria con prefisso nel registro / variabile "matrice globale" di 05AB1E
  8. Ordina l'array globale. La stringa di prefisso, che determina l'ordinamento, farà in modo che tutto finisca nel giusto ordine e che le interruzioni di riga siano nei punti giusti.
  9. Rimuovere la stringa di prefisso da ciascun elemento dell'array globale
  10. Unire l'array con "" e stamparlo.

Ci sono alcuni altri dettagli minori che puoi vedere sotto nel codice espanso. Tutto ciò che segue le schede alla fine di una riga è un commento e può essere ignorato. (A proposito, questo schema di commenti non fa parte di 05AB1E. L'ho fatto in questo modo perché sembrava carino.) Le righe che hanno commenti che iniziano con "@" sono a scopo di debug e possono essere omesse senza modificare l'output finale.

„YY¾38×:                                        Replace "YY" with 38 0's. (y is the 34th character in the index, so need to add 34+4 = 38). ¾ is initialized to zero, which saves one byte from typing '038
'Yð:                                            Replace "Y" with " "                                
"Replaced input Stage1 = "?D,                   @DEBUG

žLR                                             Pushes [0-9A-Za-z]
DU                                              Set X to [0-9A-Za-z] and leave [0-9A-Za-z] on the stack.
s                                               Swap top two elements. Now the stack is [0-9A-Za-z],input

ð«                                              Append a space so the below splitter works even if there are no other spaces.
#                                               Split input on " ", which "Y" has been replaced with
ε                                               Map. This map replaces the y runs
    "Element = "?D,                             @DEBUG
    "N = "?N,                                   @DEBUG
    NĀi                                         If N != 0   
        "Replacing!",                           @DEBUG
        Dн                                      Get the first letter
        X                                       Push X
        s                                       Swap
        k                                       X (which is [0-9A-Za-z]) .indexOf(firstLetter)
        "indexOf run token = "?D,               @DEBUG
        4+                                      Add 4 to the index, now becoming the number of zeros to add
        s                                       Swap. Now top is the string between runs
        ¦                                       Remove the first character
        s                                       Swap again. Now the top is the number of zeros to add.
        ú                                       Add that many spaces (will be replaced with zeros later) to the start of the element.
        "Element Replaced = "?D,                @DEBUG
]
'W¾2×:                                          Need to do this replacement after the Y replacement so stuff like YW gets parsed properly. Again, ¾ is zero.
'X¾3×:
J                                               Join with ""
"Replaced input Stage2 = "?D,                   @DEBUG
'Z¶:                                            Replace "Z" with "¶".
.B                                              "Squarify" command. Splits on \n and appends spaces to the end of each element so each is the same length. In this case, that is equivalent to adding zeros to the end of each column, which is what we want.
ð¾:                                             Replace spaces (which we used for padding above) with zeros.
"Replaced input Stage3 = "?D,                   @DEBUG
"0 Stack top = "?D,                             @SDEBUG
"0 Stack top-1 = "?sD,s                         @SDEBUG
v                                               pop and loop over top element, which is array of column code
    NU                                          Store the column number in X
    yv                                          Loop over each character in the column              
        "1 Stack top = "?D,                     @SDEBUG
        "1 Stack top = "?D,                     @SDEBUG
        D                                       Duplicate top element (which is now [0-9A-Za-z])
        y                                       Push y (special loop variable)
        "Character = "?D,                       @DEBUG
        k                                       Push indexOf y in [0-9A-Za-z]
        "Index = "?D,                           @DEBUG
        "2.1 Stack top = "?D,                   @SDEBUG
        "2.1 Stack top-1 = "?sD,s               @SDEBUG
        D                                       Duplicate index.
        NX‚                                     Push [rowNumber,columnNumber]. This result is used for sorting.
        Š                                       Triple swap. The top of the stack is now sortPrefix, index, index
        32V                                     Set Y to 32
        Y‹i                                     index < 32. This uses up one copy of index
            Y+                                  Add 32 to the index
            b                                   Push the index in binary. This uses the second copy of index. 
            ¦                                   Remove the first character, which will be a 1 because we added 32. The result is now a padded binary string of length 5
            "Binary = "?D,                      @SDEBUG
            R                                   Reverse the binary string. This gives the proper transposed output. 
            X_i                                 This will only run if X (which is set to the column number) == 0. (Runs !X)
                ¶ì                              Stick a linebreak at the beginning of the binary string
            }
            "2.5 Stack top = "?D,               @SDEBUG
            "2.5 Stack top-1 = "?sD,s           @SDEBUG         
            ‚                                   At this point the top of the stack is sortPrefix,binaryString. This will combine the two into a list.
            "Pushing '"?D?"'",                  @DEBUG
            ˆ                                   Push [[rowNumber,columnNumber],binaryString] to global array
            "2.6 Stack top = "?D,               @SDEBUG
            "2.6 Stack top-1 = "?sD,s           @SDEBUG
        ]                                       Close all blocks
¯                                               Push global array

{                                               Sort global array. 
"Sorted Data = "?D,                             @DEBUG
€¦                                              Remove the sort prefix              
˜                                               Flatten. Before doing this, the array is in the format [[<binary string>],[<binary string>],[<binary string>],...]
J                                               Join with ""
'1'█:'0'.:                                      @DEBUG pretty print 

1
Ciao e benvenuto in PPCG; primo post molto bello! Per quanto riguarda il conteggio dei byte: hai ragione. TIO mostra anche che i 148 caratteri sono rappresentati da 148 byte usando la tabella codici 05AB1E.
Jonathan Frech,

Una piccola nota: la maggior parte dei linguaggi del golf implementano la stampa implicita; Penso che puoi ommettere il tuo ultimo ,.
Jonathan Frech,

L'ho esaminato e ho apportato alcuni miglioramenti. Il comportamento sarà diverso (teoricamente) solo per cose con più di 1000 righe o colonne, a quel punto il programma più piccolo farà qualcosa di inaspettato.
Kerwizzy,

Non è la sfida più semplice per iniziare! Bel lavoro, immagino che alcuni degli stalwart 05AB1E forniranno alcuni suggerimenti utili quando arriveranno.
Jonathan Allan,

1
Benvenuti in PPCG e nel mondo di 05AB1E. Non ho molto tempo in questo momento, e ho iniziato a usare 05AB1E solo pochi mesi fa, quindi non sono ancora così tanto un professionista, ma qui alcune piccole cose da giocare a golf: "yy"può essere „yy(05AB1E ha sia una stringa da 2 caratteri che 3 caratteri incorporati). >≠può essere Ā(verificato, sostanzialmente 0rimane 0e tutto il resto diventa 1). }}può essere ](chiudere tutti i loop e if-elses). Sono sicuro che alcuni dei golfisti professionisti 05AB1E sono in grado di giocare a golf cose più sostanziali di me, forse anche dimezzando il conteggio dei byte.
Kevin Cruijssen,

4

APL (Dyalog Unicode) , 87 80 77 67 63 byte

grazie a H.PWiz per aver salvato 7 byte e ngn per un altro 13 17.

a←⎕D,⎕A⋄,⍉↓⊖(5/2)⊤↑35(≠⊆⊢)a'Y.|W|X'R{'0'/⍨30 36|a2↑⍵.Match}⍞

Provalo online!

NB: accetta l'input come stringa maiuscola.

Con uscita piuttosto stampata

Spiegazione

a←⎕D,⎕Aa è la stringa '0123...89ABCD...XYZ'
'Y.|W|X'⎕R{'0'/⍨+/30 36|a⍳2↑⍵.Match}sostituisce XW e Yx con il numero corrispondente di '0's (spiegato più sotto) 35(≠⊆⊢)a⍳converte la stringa in vettore di indecie in ae si divide su 35(cioè) 'Z'creando un vettore nidificato
converte il vettore nidificato in una matrice che termina con 0s
(5/2)⊤converte ciascuno il numero in un vettore binario risultante in una matrice tridimensionale con vettori binari lungo l'asse primario si
inverte lungo l'asse primario
riduce il rango della matrice in modo che sia bidimensionale
,⍉rimodella il risultato all'output appropriato

'Y.|W|X'R{'0'/⍨30 36|a2↑⍵.Match}
'Y.|W|X'R                          Regular expression replace. mathing the string.
                        2↑⍵.Match   Takes matching string (either 'X' 'W' or 'Y.') and pads with spaces to length 2
                      a            Returns the indecies of each charactor in a. on the spaces this is 36 (length of a)
                30 36|              Takes the remainders of the indecies when divided by 30 and 36 respectively. Overall 'W' -> 'W ' -> 32 36 -> 2 0, 'Y2' -> 'Y2' -> 34 2 -> 4 2.
           '0'/⍨                    Make vector of repeating '0's with length equal to the sum of the result. '0'/⍨4 2  '000000'

Ecco un risparmio 7 Byte: a←⎕D,⎕A⋄,↓↑{⊖(5/2)⊤a⍳⍵}¨'Z'(≠⊆⊢)('Y.|W|X'⎕R{'0'/⍨{0::2+'WX'⍳⍵⋄4+a⍳1⊃⍵}⍵.Match})⍞. Anche la cattura dell'errore non sembra molto da
golf

Grazie @ H.PWiz. Sì, non mi piace neanche la cattura dell'errore, ma per il resto stavo usando due sostituti regex.
jslip

@jslip tra parentesi ⎕Re i suoi operandi non sono necessari
ngn

2+'WX'⍳⍵->2+'X'=⍵
ngn,

{0::2+'X'=⍵⋄4+a⍳1⊃⍵}⍵.Match->30 36|a⍳2↑⍵.Match
ngn,

3

Perl 6 ,156 142 byte

14 byte salvati grazie a Jo King. (Risolto anche un piccolo bug con l'analisi di ye aggiunto un prettificatore.)

Risolto il problema relativo all'analisi buggy di y[wxy].

{s:g/y(.)/000{0 x:36(~$0)}/;s:g/x/w0/;s:g/w/00/;s/$/z/;map {
.flatmap:{:32($_).fmt("%05b").flip.comb}},[Z] .split("z").map: (*~0 x.chars).comb}

Provalo online!

L'interruzione di riga è lì solo per adattare il testo sullo schermo. Non fa parte del programma.

Come funziona

È una funzione anonima che accetta una stringa mutabile. (Questo rende l'uso della funzione un po 'strano, perché puoi darle solo variabili, non letterali.) Dopo un po' di lavoro, restituisce un elenco di elenchi contenenti 0 e 1, con lo stesso significato del post originale.

La stringa di input entra nella variabile $_. Iniziamo usando una serie di dichiarazioni di sostituzione su di esso al fine di sbarazzarci di tutte quelle scorciatoie per vari numeri di zero. In primo luogo, dobbiamo risolvere il y, perché nel caso di yxo yw, il w(o x) non costituisce una scorciatoia da solo. Cerchiamo y(.)( ye un carattere, che ricorda) e lo sostituiamo con 000{"0"x:36(~$0)}: i tre zero vengono copiati alla lettera, quindi convertiamo il carattere successivo dalla base 36 alla base 10 ( :36(~$0)) e aggiungiamo molti altri zero. Quindi, sostituiamo l’ wuso s:g/w/00/e l’ xuso s:g/x/000/. Finalmente, cons/$/z/ , aggiungiamo azalla fine, aggiungendo molte righe vuote in fondo. (Vedremo il motivo più tardi.)

Il resto è solo una grande affermazione sulla mappa. Stiamo mappando sopra .split("z").map: (*~0 x.chars).comb}), che è la stringa di input (senza zero shorthands), divisa in linee in z, con ogni riga prima riempita con 0 x.chars(tonnellate di zero, vale a dire quante sono la lunghezza totale della stringa di input) sulla destra e quindi suddiviso in un elenco di singoli caratteri ( .comb). Infine, lo trasponiamo con [Z](riduci con zip). Lo zipping termina non appena viene esaurito l'elenco più breve, con il risultato che tutte le linee hanno la stessa lunghezza. (Il numero di zero finali inutili a destra è uguale alla lunghezza della linea più corta. Inoltre, questo trucco di trasposizione fallisce per una "matrice" con una sola riga. Ecco perché abbiamo aggiunto forzatamente un'altra riga alla fine prima.)

Ora, eseguiamo la mappatura delle righe (colonne della matrice originale) e sostituiamo ogni carattere incontrato con i corrispondenti 5 bit. Questo viene fatto usando :32($_)(dalla base 32 alla base 10) .fmt("%05b")(formatta come una stringa di bit di larghezza 5, riempita di zero) .flip(inverti la stringa, perché l'LSB si trova nella riga superiore, non in quella inferiore) .comb(spezza la stringa in un elenco di personaggi). Abbiamo usato .flatmap, che appiattisce l'elenco risultante (altrimenti otterremmo un elenco di elenchi in ogni colonna). La trasposizione del risultato viene quindi restituita implicitamente.

(Mi sento un po 'male a causa dell'abuso della possibilità di trascinare zeri così duramente. Ma ha ridotto considerevolmente il numero di dipendenti: -).



@JoKing - Oh sì, grazie mille!
Ramillies,

Non riesce 1yx1e1yw1
Jonathan Allan il

@JonathanAllan, hai ragione, grazie. Lo riparerò tra un momento. (Ho pensato per la prima volta che potrebbe esserci solo y[0-9a-v]e quando ho scoperto che non è il caso, ho appena aggiunto una soluzione rapida (e sbagliata).)
Ramillies,

Puoi sostituire la 000sostituzione y conx
Jo King il

2

Gelatina , 66 byte

Yowza!

ØBiⱮ+
Œuœṣ⁾YYj38Żṣ”YµḢç3;)Fṣ”Wj2ṣ”Xj3”0ẋ$¹OƑ?€Fṣ”Zµȯ”0ç31BḊ€UZ)Ẏz0

Un collegamento monadico che produce una versione trasposta come un elenco di elenchi (aggiungere Zalla fine per trasporre indietro).

Provalo online! Oppure guarda la suite di test (con output piuttosto stampato).


2

Retina , 203 byte

y(.)
#$1
{`#
0#
#0
000
)T`dl`_dl`#.
w
000
x
00
z
¶
%(`.+
$&¶$&¶$&¶$&¶$&
T`g-v`#`.+$
T`dl` `.+$
T`g-v`dl
T`89l`#`.+¶.+$
T`d` `.+¶.+$
T`89l`d
T`d`    #`.+¶.+¶.+$
T`4-7`d
T`d`  #`.+¶.+¶.+¶.+$
)T`d` # #
P`.+

Provalo online! Il link include casi di test. Soluzione alternativa, anche 203 byte:

y(.)
#$1
{`#
0#
#0
000
)T`dl`_dl`#.
w
000
x
00
z
¶
%(`.+
$&¶$&
T`g-v`#`¶.+
T`dl` `¶.+
T`g-v`dl
^.+
$&¶$&
T`89l`#`¶.+
T`d` `¶.+
T`89l`d
^.+
$&¶$&
T`d`    #`¶.+
T`4-7`d
^.+
$&¶$&
T`d`  #`¶.+
)T`d` # #
P`.+

Provalo online! Il link include casi di test. Spiegazione:

y(.)
#$1

Per prima cosa gestisci il caso imbarazzante del ycomando. Purtroppo la lettera dopo questa può essere una yo addirittura una z, quindi dobbiamo stare attenti qui. Tutte le ys magiche vengono prima trasformate in #s.

{`#
0#
#0
000
)T`dl`_dl`#.

Un ciclo quindi elabora la #s. Innanzitutto, a 0è anteposto a #. Se questo è un #0allora, questo viene modificato per 000completare l'operazione, altrimenti il ​​carattere dopo il #decrementa e il ciclo si ripete fino a quando tutti gli #s sono stati elaborati.

w
000
x
00

Risolvi wi xproblemi.

z
¶

Dividi su nuove linee. ( S`zfunziona anche per lo stesso conteggio byte.)

%(`.+
$&¶$&¶$&¶$&¶$&
T`g-v`#`.+$
T`dl` `.+$
T`g-v`dl
T`89l`#`.+¶.+$
T`d` `.+¶.+$
T`89l`d
T`d`    #`.+¶.+¶.+$
T`4-7`d
T`d`  #`.+¶.+¶.+¶.+$
)T`d` # #

Crea 5 copie di ogni riga, quindi esegui la conversione binaria mappando le lettere con il bit appropriato #e cancellando quel bit, mentre le altre lettere diventano spazi. I bit vengono elaborati nell'ordine 16, 8, 4, 2, quindi l'ultima traduzione gestisce la cancellazione del 2bit e la conversione del 1bit contemporaneamente. (La versione alternativa rende ogni copia individualmente che costa più byte ma questi vengono salvati perché la gestione dei bit è semplificata.)

P`.+

Riempi tutte le linee della stessa lunghezza.


1

Python 2 , 249 244 byte

def f(s,Z='0'):
 while'y'in s:i=s.find('y');s=s[:i]+4*Z+Z*int(s[i+1],36)+s[i+2:]
 t=s.replace('w',2*Z).replace('x',3*Z).split('z');return map(''.join,zip(*[[(Z*5+bin(int(c,32))[2:])[:-6:-1]for c in r]+[Z*5]*(max(map(len,t))-len(r))for r in t]))

Provalo online!

5 byte salvati da Jonathan Frech .


C'è uno spazio superfluo in while 'y'in. Penso che l'abbonamento [-5:][::-1]possa essere giocato a golf [:-6:-1]. L'istruzione return può essere inserita nella riga precedente.
Jonathan Frech,

1

JavaScript (ES8), 192 byte

s=>[...s,"z"].map(c=>{h=parseInt(c,36);k="wxy".search(c)+1;y?k=h-y--:h-35?y=h>33:m=m.map(P,z+=5,i=k--);for(h=k?0:h;~k--;m[i]=h.toString(2)+P(m[i++]||""));},P=d=>d.padStart(z,0),m=[i=z=y=0])&&m

Restituisce la trasposizione ... che viene quindi riflessa attraverso l'asse verticale; fammi sapere se questo invalida questa voce. L'output è una matrice di stringhe che contengono 0s e 1s.

Provalo online!

Spiegazione

Per ogni personaggio c, k+1valuta il numero di righe da modificare. k = "wxy".search(c) + 1;, in cui il searchmetodo restituisce l'indice o -1. kviene quindi ridotto fino a quando non raggiunge -1verificando ~k--un valore veritiero.

Se il carattere corrente è "y", imposta un flag in modo che il valore base-36 del carattere successivo - 1 diventi il ​​valore per k.

Quando si incontra una "z", stringhe di pad a sinistra, incrementare la quantità di pad di 5e reimpostare l'indice di array su 0.

s =>
    [...s, "z"].map(c => {                  // append a "z" to ensure final output is properly padded
        h = parseInt(c, 36);
        k = "wxy".search(c) + 1;            // note that "y" -> 4 zeroes
        y                                   // if previous char is "y"...
            ? k = h - y--                   //      decrement y after subtracting y=1 since k is decremented to -1 and the previous y already pushed 4 zeroes
        : h - 35                            // else if current char is not "z"...
            ? y = h > 33                    //      set y if current char = "y"
        : m = m.map(P, z += 5, i = k--);    // else if current char is "z", pad
        for (
            h = k ? 0 : h;                  // if k is truthy, push zeroes
            ~k--;
            m[i] = h.toString(2)            // convert to boolean representation
                + P(m[i++] || "")           // prepend to row or to a newly padded row
        );
    },
        P = d => d.padStart(z, 0),
        m = [i = z = y = 0]                 // the logical OR 4 lines above replaces this value with ""
    ) &&
    m

Penso che avrebbe più senso non restituire la trasposizione dell'input.
mbomb007,

1

Haskell, 399 byte

Installa splitpacchetto:cabal install split

import Data.Char
import Data.List.Split
import Data.List
p=map
r=replicate
a c|47<c&&c<58=c-48|96<c&&c<123=c-87
o=a.ord
m l n|l==0=[]|True=(mod n 2):m(l-1)(div n 2)
t a=p(\l->l++r((maximum$p length a)-length l)'0')a
y s|length s==0=""|h=='y'=(r(4+(o$s!!1))'0')++y(drop 2 s)|h=='w'="00"++y t|h=='x'="000"++y t|True=h:y t where h=head s;t=tail s
w=(p concat).transpose.(p$p$(m 5).o).t.(splitOn "z").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.