Déchiffrer le format Wechsler étendu

18

Ce défi est basé sur une publication sandbox par user48538 . Puisqu'il n'est plus actif sur ce site, j'ai relevé ce défi.


apgsearch , le programme de recherche de soupe distribuée pour Game of Life de Conway et la base de données de résultats de recherche, Catagolue utilise des codes apg pour classer et indiquer les modèles. Les apgcodes eux-mêmes utilisent le format Wechsler étendu , une extension d'une notation de modèle développée par Allan Wechsler en 1992.

Les exemples suivants et les images sont tirés de LifeWiki .

  1. Une chaîne de n caractères dans l'ensemble correspondant à l'expression régulière [0-9a-v]désigne une bande de cinq lignes, n colonnes de large. Chaque caractère représente cinq cellules dans une colonne verticale correspondant aux chaînes de bits [ 00000, 10000, 01000... 00010, 10010, 01010, 11010... 11111].

    Par exemple, 27deee6correspond à un vaisseau spatial lourd :

27deee6

[01100001101111011111100111100000000]
  1. Le personnage z sépare les bandes contiguës à cinq rangées.

    Par exemple, 0ca178b96z69d1d96correspond à une nature morte de 31 bits:

entrez la description de l'image ici

entrez la description de l'image ici

[000110110001010101010010001011001110000000000011111000100000100101010100011011000000000000]
  1. Les caractères wet xsont utilisés pour abréger 00et000 , respectivement.

    w33z8kqrqk8zzzx33Correspond donc à une navette trans-reine des abeilles :

entrez la description de l'image ici

entrez la description de l'image ici

(10 lignes vierges omises)

entrez la description de l'image ici

[0011000001100000000000000000000000000010000011100010001010111010111110000000000000000000000000000000000000000000000000000000000000000000000000011000001100000000000000000000000]
  1. Finally, the symbols matching the regex y[0-9a-z] correspond to runs of between 4 and 39 consecutive 0s.

    A good example is 31a08zy0123cko, corresponding to a ship on quadpole:

entrez la description de l'image ici

entrez la description de l'image ici

[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]]
alephalpha
la source
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

Réponses:

2

Fusain , 50 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Utilise 1et 0. Explication:

UB0

Définissez l'arrière-plan, c'est-à-dire toutes les cellules non imprimées du rectangle entourant la sortie, sur 0.

≔⁺⭆χιββ

Préfixez les chiffres à l'alphabet minuscule prédéfini.

FS

Boucle sur la chaîne d'entrée.

¿υ

Si la liste vide prédéfinie n'est pas vide ...

×0⁺⊟υ⌕βι

... puis imprimer un nombre de 0s donné par la somme du nombre extrait de la liste et de l'index du caractère courant dans les chiffres et les lettres. Voir ci-dessous pour ce que ce nombre est toujours.

≡ι

Basculez le caractère actuel.

z×⸿⁵

Si c'est un zretour de 5 retours de chariot, nous amenant à la prochaine bande de sortie.

y⊞υ⁴

Si c'est un y, poussez 4vers la liste vide prédéfinie, ce 4+n 0qui entraînera la sortie de s la prochaine fois.

x×0³

Si c'est une xsortie de 3 0s. (Cela se fait par répétition pour éviter que le littéral ne 0touche le xou le littéral suivant.)

w¦00

Si c'est une wsortie alors 2 0s. (Le ¦est nécessaire pour séparer les deux littéraux de chaîne.)

«P↓⮌⍘⌕βι²→

Sinon, indexez le caractère courant dans les chiffres et les lettres, convertissez-le en binaire et imprimez le résultat vers le bas le bit le moins significatif en premier; puis déplacez le curseur vers la droite pour la colonne suivante.

Neil
la source
6

JavaScript (ES8), 197 octets

Prend l'entrée sous forme de chaîne. Renvoie un tableau de chaînes avec '#' et des espaces. La sortie peut inclure des espaces de fin supplémentaires (mais cohérents) sur chaque ligne.

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

Essayez-le en ligne! (sortie prettifiée)

Comment?

Variables globales

  • Le caractère "x"est utilisé plusieurs fois, il vaut donc la peine de le stocker dans la variable x .
  • La fonction parseIntest utilisée deux fois, donc il vaut la peine de stockage dans la variable P .
  • y est l'indice de ligne, initialisé à 0 .
  • w garde une trace de la limite supérieure de la largeur qui est utilisée pour remplir la sortie finale.
  • o [] est le tableau de sortie, initialement vide.

Prétraitement des zéros répétés

Nous remplaçons d'abord tous les modèles "w", "x"et "yX"dans la chaîne d'entrée par le nombre approprié d'espaces. Ces espaces seront ultérieurement interprétés comme "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
  )
)

Décodage

Nous séparons la chaîne résultante, ajoutons une initiale "x"et répétons 5 fois (avec i = 0 à 4 ) sur chaque caractère c :

  • Si c est inférieur à "x", nous ajoutons le motif correspondant aux 5 lignes suivantes.

    o[y + i - 5] += ' #'[P(c, 36) >> i & 1]
  • Si c est supérieur ou égal à "x", nous allouons 5 nouvelles chaînes vides dans o [] et ajoutons 5 à y . Ceci est déclenché par l'initiale "x"qui a été ajoutée au début de la chaîne, ou par n'importe quel élément "z"du contenu d'origine.

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

Rembourrage

Enfin, nous remplissons chaque chaîne dans o [] avec des espaces afin qu'ils aient tous w caractères.

o.map(r => r.padEnd(w))
Arnauld
la source
6

05AB1E , 148 132 98 octets

Je suis un lycéen et c'était ma première fois pour jouer au golf et utiliser 05AB1E, donc les commentaires sont appréciés!

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

Essayez-le en ligne!

Essayez-le en ligne!

Essayez-le en ligne!

Prend l'entrée en majuscules et sort la matrice transposée en plusieurs lignes de sortie de 1 et de 0. Peut ajouter des zéros supplémentaires.

Si vous souhaitez tester avec des chaînes en minuscules, ajoutez l' uen-tête TIO.

Si vous voulez une sortie assez imprimée, ajoutez '1'█:'0'.:le pied de page TIO.

Explication

(J'appelle "lignes" et "colonnes" en face de ce à quoi vous pourriez vous attendre car cela génère la matrice transposée)

L'algorithme de base est:

  1. Remplacer "yy" par 38 0s
  2. Fractionnez sur "y" et développez les 0-runs.
  3. Remplacez "w" et "x"
  4. Calculez la colonne la plus longue (c'est-à-dire la chaîne la plus longue entre les z) et remplissez toutes les autres colonnes pour qu'elles aient cette longueur. (Ceci est nécessaire en raison du fonctionnement de l'algorithme ci-dessous)
  5. Séparer sur z
  6. À ce stade, la chaîne d'entrée est un tableau de colonnes où chaque colonne est une chaîne de [0-9A-V], où chaque colonne a la même longueur.
  7. L'algorithme pour le mettre dans le format de sortie est de
    1. Convertissez les caractères en nombres en utilisant indexOf dans une chaîne de recherche
    2. Convertissez les caractères en binaire puis remplissez-les en longueur 5
    3. S'il s'agit de la première colonne, ajoutez un saut de ligne avant le nombre binaire
    4. Ajoutez un préfixe au début de la chaîne binaire qui stocke la ligne puis la colonne du caractère.
    5. Poussez la chaîne binaire avec préfixe dans le registre / variable "tableau global" de 05AB1E
  8. Triez le tableau global. La chaîne de préfixe, qui détermine l'ordre de tri, s'assurera que tout se termine dans le bon ordre et que les sauts de ligne sont aux bons endroits.
  9. Supprimez la chaîne de préfixe de chaque élément du tableau global
  10. Rejoignez le tableau avec "" et imprimez-le.

Il y a quelques autres détails mineurs que vous pouvez voir ci-dessous dans le code développé. Tout ce qui se trouve après les onglets à la fin d'une ligne est un commentaire et peut être ignoré. (Ce schéma de commentaire ne fait pas partie de 05AB1E, soit dit en passant. Je l'ai fait de cette façon car il avait l'air bien.) Les lignes qui ont des commentaires commençant par "@" sont à des fins de débogage et peuvent être omises sans modifier la sortie 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 
kerwizzy
la source
1
Bonjour et bienvenue chez PPCG; très joli premier post! Concernant votre nombre d'octets: vous avez raison. TIO affiche même facilement que les 148 caractères sont représentés par 148 octets à l'aide de la page de code 05AB1E.
Jonathan Frech
Une petite remarque: la plupart des langues de golf implémentent l'impression implicite; Je pense que vous pouvez oublier votre dernier ,.
Jonathan Frech
Je l'ai regardé et j'ai apporté quelques améliorations. Le comportement ne sera différent (théoriquement) que pour les choses avec plus de 1000 lignes ou colonnes, auquel cas le programme plus petit fera quelque chose d'inattendu.
kerwizzy
Pas le défi le plus simple pour commencer! Beau travail, j'imagine que certains des fidèles 05AB1E donneront des conseils pratiques quand ils passeront.
Jonathan Allan
1
Bienvenue chez PPCG et dans le monde de 05AB1E. Je n'ai pas beaucoup de temps pour le moment et je n'ai commencé à utiliser 05AB1E qu'il y a quelques mois, donc je ne suis pas encore vraiment un pro, mais voici quelques petites choses au golf: "yy"peut être „yy(05AB1E a à la fois une chaîne de 2 caractères et 3 caractères intégrée). >≠peut être Ā(authentifié, 0reste fondamentalement 0et tout le reste devient 1). }}peut être ](fermez toutes les boucles et if-elses). Je suis sûr que certains golfeurs pro 05AB1E sont capables de jouer au golf des choses plus importantes que moi, voire de diviser par deux le nombre d'octets.
Kevin Cruijssen
4

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

merci à H.PWiz pour avoir économisé 7 octets et ngn pour 13 autres 17.

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

Essayez-le en ligne!

NB: Prend l'entrée comme une chaîne majuscule.

Avec une jolie sortie imprimée

Explication

a←⎕D,⎕Aa est la chaîne '0123...89ABCD...XYZ'
'Y.|W|X'⎕R{'0'/⍨+/30 36|a⍳2↑⍵.Match}remplace XW et Yx par le nombre correspondant de '0's (expliqué ci-dessous) 35(≠⊆⊢)a⍳convertit la chaîne en vecteur d'indécies dans aet se divise 35(c'est-à-dire) en 'Z'créant un vecteur imbriqué
convertit le vecteur imbriqué en matrice matelassée se terminant par 0s
(5/2)⊤convertit chacun nombre dans un vecteur binaire résultant en une matrice tridimensionnelle avec des vecteurs binaires le long de l'axe principal
inverse le long de l'axe principal
réduit le rang de la matrice de sorte qu'il est
,⍉remodèle en 2 dimensions le résultat à la sortie appropriée

'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'
jslip
la source
Voici une économie de 7 octets: a←⎕D,⎕A⋄,↓↑{⊖(5/2)⊤a⍳⍵}¨'Z'(≠⊆⊢)('Y.|W|X'⎕R{'0'/⍨{0::2+'WX'⍳⍵⋄4+a⍳1⊃⍵}⍵.Match})⍞. La capture d'erreur ne semble pas non plus très golfée
H.PWiz
Merci @ H.PWiz. Ouais, je n'aime pas non plus la capture d'erreur, mais sinon j'utilisais deux remplacements d'expression régulière.
jslip
@jslip les parenthèses autour ⎕Ret ses opérandes sont inutiles
ngn
2+'WX'⍳⍵->2+'X'=⍵
ngn
{0::2+'X'=⍵⋄4+a⍳1⊃⍵}⍵.Match->30 36|a⍳2↑⍵.Match
ngn
3

Perl 6 ,156 142 octets

14 octets économisés grâce à Jo King. (Correction également d'un petit bug avec l'analyse de yet ajout d'un prettifier.)

Correction de l'analyse de buggy de 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}

Essayez-le en ligne!

Le saut de ligne est là juste pour faire tenir le texte à l'écran. Cela ne fait pas partie du programme.

Comment ça marche

Il s'agit d'une fonction anonyme qui prend une chaîne mutable. (Cela rend l'utilisation de la fonction un peu particulière, car vous ne pouvez lui donner que des variables, pas des littéraux.) Après un certain travail, elle retourne une liste de listes contenant des 0 et des 1, avec la même signification que dans la publication d'origine.

La chaîne d'entrée entre dans la variable $_. Nous commençons par utiliser une série d'instructions de substitution dessus afin de nous débarrasser de tous ces raccourcis pour différents nombres de zéros. Tout d'abord, nous devons trier le y, car dans le cas de yxou yw, le w(ou x) ne constitue pas un raccourci en soi. Nous recherchons y(.)( yet un caractère, dont il se souvient) et le remplaçons par 000{"0"x:36(~$0)}: les trois zéros sont copiés textuellement, puis nous convertissons le caractère suivant de la base 36 en base 10 ( :36(~$0)) et ajoutons beaucoup plus de zéros. Ensuite, nous remplaçons l' wutilisation de s:g/w/00/et l' xutilisation de s:g/x/000/. Enfin, avec s/$/z/, nous ajoutons unzà la fin, en ajoutant beaucoup de lignes vides au fond. (Nous verrons la raison plus tard.)

Le reste n'est qu'une grande déclaration de carte. Nous mappons sur .split("z").map: (*~0 x.chars).comb}), qui est la chaîne d'entrée (sans zéro raccourci), divisée en lignes à z, chaque ligne étant d'abord complétée avec 0 x.chars(des tonnes de zéros, à savoir autant que la longueur totale de la chaîne d'entrée) à droite puis décomposé en une liste de caractères individuels ( .comb). Enfin, nous le transposons avec [Z](réduire avec zip). Le zippage se termine dès que la liste la plus courte est épuisée, ce qui fait que toutes les lignes ont la même longueur. (Le nombre de zéros de fin inutiles à droite est égal à la longueur de la ligne la plus courte. De plus, cette astuce de transposition échoue pour une "matrice" avec une seule ligne. C'est pourquoi nous avons ajouté de force une autre ligne à la fin avant.)

Maintenant, nous mappons simplement les lignes (colonnes de la matrice d'origine) et remplaçons chaque caractère rencontré par les 5 bits correspondants. Cela se fait en utilisant :32($_)(base 32 à base 10) .fmt("%05b")(format comme une chaîne binaire de largeur 5, complétée par des zéros) .flip(inversez la chaîne, car le LSB est dans la ligne du haut, pas dans le bas) .comb(divisez la chaîne en une liste de personnages). Nous avons utilisé .flatmap, qui aplatit la liste résultante (sinon nous obtiendrions une liste de listes dans chaque colonne). La transposition du résultat est alors renvoyée implicitement.

(Je me sens un peu mal à cause de l'abus de la possibilité de traîner les zéros si fort. Mais cela a considérablement réduit le bytecount :—).)

Ramillies
la source
142 octets
Jo King
@JoKing - Oh oui, merci beaucoup!
Ramillies
Échoue pour 1yx1et1yw1
Jonathan Allan
@JonathanAllan, vous avez raison, merci. Je vais le réparer dans un instant. (J'ai d'abord pensé pour une raison quelconque qu'il ne pouvait y en avoir que y[0-9a-v]et quand j'ai trouvé que ce n'était pas le cas, j'ai juste ajouté une solution rapide (et erronée).)
Ramillies
Vous pouvez remplacer le 000dans la substitution y parx
Jo King
2

Gelée , 66 octets

Yowza!

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

Un lien monadique qui donne une version transposée comme une liste de listes (ajouter Zà la fin pour transposer en arrière).

Essayez-le en ligne! Ou voir la suite de tests (avec une jolie sortie imprimée).

Jonathan Allan
la source
2

Rétine , 203 octets

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`.+

Essayez-le en ligne! Le lien inclut des cas de test. Solution alternative, également 203 octets:

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`.+

Essayez-le en ligne! Le lien inclut des cas de test. Explication:

y(.)
#$1

Commencez par gérer le cas délicat de la ycommande. Malheureusement, la lettre après cela peut être un you même un z, nous devons donc faire attention ici. Toutes les magie ys sont d'abord transformées en #s.

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

Une boucle traite ensuite le #s. Tout d'abord, un 0est ajouté au #. S'il s'agit d'un #0alors qui est remplacé par celui 000qui termine l'opération, sinon le caractère après le #est décrémenté et la boucle se répète jusqu'à ce que tous les #s aient été traités.

w
000
x
00

Réparez les ws et xs.

z
¶

Fractionner sur de nouvelles lignes. ( S`zfonctionne également pour le même nombre d'octets.)

%(`.+
$&¶$&¶$&¶$&¶$&
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` # #

Faites 5 copies de chaque ligne, puis effectuez une conversion binaire en mappant les lettres avec le bit approprié #et en effaçant ce bit, tandis que les autres lettres deviennent des espaces. Les bits sont traités dans l'ordre 16, 8, 4, 2, puis la dernière traduction gère l'effacement du 2bit et sa conversion 1en même temps. (La version alternative fait chaque copie individuellement, ce qui coûte plus d'octets mais ceux-ci sont enregistrés car la gestion des bits est simplifiée.)

P`.+

Remplissez toutes les lignes à la même longueur.

Neil
la source
1

Python 2 , 249 244 octets

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

Essayez-le en ligne!

5 octets enregistrés par Jonathan Frech .

Chas Brown
la source
Il y a un espace superflu dedans while 'y'in. Je pense que l'indice [-5:][::-1]peut être joué au golf [:-6:-1]. L'instruction de retour peut être placée sur la ligne précédente.
Jonathan Frech
1

JavaScript (ES8), 192 octets

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

Renvoie la transposition ... qui est ensuite réfléchie sur l'axe vertical; faites-moi savoir si cela invalide cette entrée. La sortie est un tableau de chaînes contenant 0s et 1s.

Essayez-le en ligne!

Explication

Pour chaque caractère c, k+1évalue le nombre de lignes à modifier. k = "wxy".search(c) + 1;, où la searchméthode renvoie l'index ou -1. kest ensuite décrémenté jusqu'à ce qu'il atteigne -1en vérifiant ~k--une valeur véridique.

Si le caractère actuel est "y", définissez un indicateur de sorte que la valeur base-36 du caractère suivant - 1 devienne la valeur de k.

Lors de la rencontre d'un "z", les chaînes de pad vers la gauche, incrémentent la quantité de pad de 5et réinitialisent l'index du tableau sur 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
redondance
la source
Je pense qu'il serait plus logique de ne pas retourner la transposition de l'entrée.
mbomb007
1

Haskell, 399 octets

Installer le splitpackage: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
Евгений Новиков
la source