Números para letras

15

Existe un cifrado muy simple que reemplaza una letra con su posición en el alfabeto. Por ejemplo, abcse convertiría 1 2 3en este cifrado.

Este desafío es una versión alternativa de este cifrado.


El reto

Cree un programa que tome una entrada de caracteres ASCII y genere una cadena separada por espacios de:

  • enteros a -26través de26

  • cartas a através dej

La salida debe venir a través de STDOUT o la alternativa más cercana a su idioma.


Especificaciones

  • Las letras mayúsculas deben ser negadas. Una capital, Dpor ejemplo, sería -4, mientras que una minúscula dsería 4.

  • Los dígitos deben cambiarse a sus homólogos alfa. 1ser a, y así sucesivamente. Cualquier ceros en la entrada será j.

  • Todos los caracteres no alfanuméricos (excepto los espacios) deben ignorarse.

  • Los espacios son 0.

  • Los espacios adyacentes en la salida deben reducirse a un solo espacio.

    Input: You + Me
    Correct Output: -25 15 21 0 -13 5
    Incorrect Output: -25 15 21 0 0 0 -13 5
    
  • Se permite un solo espacio final o nueva línea.


Ejemplos

Input: programming puzzles
Output: 16 18 15 7 18 1 13 13 9 14 7 0 16 21 26 26 12 5 19

Input: Code Golf
Output: -3 15 4 5 0 -7 15 12 6

Input: Programming Puzzles & Code Golf
Output: -16 18 15 7 18 1 13 13 9 14 7 0 -16 21 26 26 12 5 19 0 -3 15 4 5 0 -7 15 12 6

Input: C0d3 G0lf
Output: -3 j 4 c 0 -7 j 12 6

Input: abc_ABC
Output: 1 2 3 -1 -2 -3

Marcador

Para que su puntaje aparezca en el tablero, debe estar en este formato:

# Language, Bytes

Los tachados no deberían causar un problema.

Puertas de Zach
fuente
¿Puede la salida tener un espacio final?
Dennis
Si. Se permite un solo espacio final o nueva línea. @Dennis
Zach Gates
¿Es una función que devuelve / imprime una cadena una respuesta válida? ¿También puede agregar un caso de prueba como "abc_ABC" para descartar todas las expresiones regulares [^ \ w] y [\ W]?
Max
No estaba completamente seguro de lo que estaba preguntando, pero agregué ese caso de prueba. Espero que sea lo que estabas buscando; si no, házmelo saber. @Max
Zach Gates

Respuestas:

10

CJam, 58 57 54 51 50 49 bytes

Justo cuando escribí la explicación, noté que una de las versiones alternativas de 50 bytes se puede acortar por un byte ...

q_el_eu&S-A,s--S%S*{i_32md\2*5-*48md@)A%'a+\?}%S*

Pruébalo aquí.

Soluciones de 50 bytes:

q_el_eu&S-A,s--S%S*{_A,s&\i_)A%'a+\32md\2*5-*?}%S*
q_el_eu&S-A,s--S%'`*{i32md:D;(_(2*(D*D3+A%'a+?}%S*
q_el_eu&S-A,s--S%'`*{i32md\(_@_@(2*(*\3+A%'a+?}%S*
q_el_eu&S-A,s--S%'`*{i32md\(_(2*(g@*_z3+A%'a+?}%S*

Explicación

q         e# Read input.
_el_eu&   e# Intersect a lower-case version with an upper-case version to remove
          e# all letters.
S-        e# Remove spaces from that string.
A,s-      e# Remove digit characters from that string. It now contains all the
          e# the characters from the input we should ignore.
-         e# Remove these characters from the input.
S%S*      e# Split on runs of spaces and join by spaces, collapsing multiple into one.
{         e# Map this block onto each character...
  i_      e#   Convert to character code and make a copy.
  32md    e#   Get divmod 32. Note that digits have character codes 32 + something,
          e#   the upper case letters have character codes 64 + n (where n is the 
          e#   absolute value we want), while lower case letters have codes 96 + n. 
          e#   So the div gives 2 or 3 to distinguish capitalisation (and 1 for digits) 
          e#   and the mod gives the correct absolute value for letters.
          e#   As it happens, the mod also gives 0 for spaces.
  \2*5-   e#   Pull up the div, duplicate, subtract 5. Turns 2 into -1 and 3 into 1. 
          e#   It also turns 1 (digits) into -3.
  *       e#   Multiply the mod by this sign.
          e#   We now have the correct result for everything but digits. Note that
          e#   the absolute value for digits is more than 26, and for everything
          e#   else it's less than 27.
  48md    e#   Get divmod 48. This gives div 0 and mod n for all correct results n.
          e#   For digits it gives div -1 and we don't care about the mod. We'll
          e#   use the div as a truthy/falsy value to select the right result.
  @)A%    e#   Pull up the other copy of the character code, increment 
          e#   (range 49..58), take modulo 10.
          e#   This gives 9 for 0 and n-1 for any other digit n.
  'a+     e#   Add to the character a.
  \?      e#   Select the correct result based on the div 48.
}%
S*        e# Join the resulting values by spaces.

Esta debe ser la primera vez que el comportamiento del módulo de CJam para valores negativos fue útil para mí.

Martin Ender
fuente
6

JavaScript (ES6), 110 107 133 120 bytes

¡Toma eso, viejo yo!

a=>[...a.replace(/[\W_]*?( ?)[\W_]*/g,'$1')].map(x=>(c=x.charCodeAt())<40?0:c<60?'jabcdefghi'[x]:c<91?64-c:c-96).join` `

Potencialmente, hay mucho más espacio para jugar al golf, especialmente en las expresiones regulares , porque eso lo consiguió bastante bien. Versión sin golf:

function f(a) {
  // Replaces each run of bad chars and spaces with
  // a space if it contained one, nothing otherwise:
  a = a.replace(/[\W_]*?( ?)[\W_]*/g, '$1');

  var b = a.split('');
  b = b.map(function(x) {
    var c = x.charCodeAt();
    if (c == 32)     // space
      return 0;
    else if (c < 60) // numbers
      return 'jabcdefghi'.charAt(x);
    else if (c < 91)
      return 64 - c; // uppercase
    else
      return c - 96; // lowercase
  });
  b = b.join(' ');
  return b;
}

Sugerencias bienvenidas!

ETHproductions
fuente
Prueba '123___abc'. Sugerencia: necesita manejar guiones bajos
edc65
Otro problema: All non-alphanumeric characters should be ignored.. Prueba: 'A $ b' debería ser-1 2
edc65
@ edc65 Aw, hombre, pensé que lo había hecho ... ¡Pero gracias por hacérmelo saber!
ETHproductions
4

Pyth, 50 49 bytes

jdm?>d26C+70ddm-xZd26:-z-z=Zs[_rG1dGjk.<UT1)" +"d

Pruébalo aquí .

Editar: reestructurado sanitización de cadenas para garantizar que los guiones bajos se manejen correctamente. Incluso salvó un byte también, ¡yay!

Este programa crea una cadena de búsqueda, que se utiliza para desinfectar la entrada. Esto se asigna al índice correspondiente en esa cadena. Finalmente, cualquier índice mayor que 26 se convierte al carácter ASCII correcto.

                                                     Implicit: z=input(), d=' ', ,
                                                       k='', G=[a-z]
                              _rG1                   Reversed, capitalised alphabet
                                  d                  Single space
                                   G                 Lower case alphabet
                                    jk.<UT1          '1234567890'
                            s[             )         Concatenate the 4 previous statements
                          =Z                         Store in Z
                        -z                           Setwise difference of input and above
                                                       (to get all illegal characters)
                      -z                             Setwise difference of input and illegal chars
                     :                      " +"d    Regex replace to lose multiple spaces
              m                                      Map the above over d:
                xZd                                    Get index of d in Z
               -   26                                  Subtract 26
  m                                                  Map the above over d:
   ?>d26                                               If d > 26
        C+70d                                            Convert (d+70) to ASCII
             d                                         Otherwise, select d
jd                                                   Join on spaces and print

Versión anterior, que utilizaba \Wexpresiones regulares, a 50 bytes:

jdm?>d26C+70ddm-xs[_rG1\ Gjk.<UT1)d26::z"\W"d" +"d
Sok
fuente
3

Julia, 145 136 bytes

r=replace;print(join([47<x<58?x+58-10(x>48):x==32?0:cmp(x,96)*(lowercase(x)-96)for x=r(r(readline(),r"[^a-z0-9 ]"i,""),r" +"," ")]," "))

Sin golf:

# Read a string from STDIN
input = readline()

# Remove non-alphanumeric characters and replace duplicated spaces
r = replace(replace(input, r"[^a-z0-9 ]"i, ""), r" +", " ")

# Construct an array using comprehension over the replaced input string
A = [47 < x < 58 ? x + 58 - 10(x > 48) : x == 32 ? 0 : cmp(x, 96) * (lowercase(x) - 96) for x = r]

# Join the array elements with spaces
j = join(A, " ")

# Print to STDOUT
print(j)

Para obtener los dígitos como letras, sumamos 58 al valor ASCII y restamos 10 si el carácter actual no es 0. Eso asegura que 0 se asigne a jy los otros dígitos se asignen a a- i.

Negar letras mayúsculas se hace usando cmp. Esto devolverá -1 para letras mayúsculas y 1 para minúsculas.

Pruébalo en línea

Alex A.
fuente
2

Perl 5, 120 116 113 105 Bytes

Primero limpia los caracteres no deseados y los espacios adicionales.
Luego baja por la tabla ascii para cada personaje.

$_=pop;s/[^\w ]|_//g;s/ +/ /g;map{$n=ord;say$".($n>96?$n-96:$n>64?64-$n:$n>48?chr$n+48:$n>47?j:0)}split//

Prueba

$ perl -M5.01 numbers4letters.pl "zZaA _ 190"
 26 -26 1 -1 0 a i j
$ perl -M5.01 numbers4letters.pl "PrOgr4mm1n9 Puz2l3s & C0d3_G0lf!"
-16 18 -15 7 18 d 13 13 a 14 i 0 -16 21 26 b 12 c 19 0 -3 j 4 c -7 j 12 6
LukStorms
fuente
2
Puedes jugar al golf con un personaje con un solo espacio en la expresión regular en lugar de \ sy la segunda expresión regular se puede jugar con el golf s/ +/ /g, la primera expresión regular es incorrecta porque \ w coincide con el carácter de subrayado
Máx.
2
Otros dos personajes cons/[^\w ]|_//g
Max
Agradable, incluso mejor que con la bandera de ignorar caso.
LukStorms
@Max buena pista. 2 bytes guardados en mi respuesta, gracias.
edc65
2

C, 142 138 135

c,d;main(s){while(c=getchar()+1)d=c|32,c=d-98<26u?s=(d-97)*(c/32*2-5),0:c-48<11u?s='a'+c%10,4:c==33&&s?s=0,0:3,printf("%d \0%c "+c,s);}

Ungolfed un poco:

int c,d;
int main(int s)                     // s initially non-zero, meaning spaces are allowed
{
    while(c=getchar()+1)            // getchar until EOF (-1) encountered
    {
        d=c|32;                     // d becomes lowercase c (both incremented by 1)
        if (d-98<26u)               // check for letter
        {
            s=(d-97)*(c/32*2-5);    // print this number and allow subsequent spaces
            c=0;                    // format string will be "%d "
        }
        else if (c-48<11u)          // check for digit
        {
            s='a'+c%10;             // print this letter and allow subsequent spaces
            c=4;                    // format string will be "%c "
        }
        else if (c==33&&s)          // else if space and allowed to output spaces
        {
            s=0;                    // print 0 and disallow subsequent spaces
            c=0;                    // format string will be "%c "
        }
        else
        {
            c=3;                    // format string will be "", prints nothing
        }
        printf("%d \0%c "+c,s);     // final c is treated as index into string literal
    }
}

Pasa las pruebas dadas en GCC 4.9.3 y Clang 3.5.2.

prensado
fuente
2

> <> (pez), 219 209 bytes

>i:84*=?v:86*1-)?!^:f4*2-(?v:88*)?!v:a9*1+(?v:c8*)?!^:ca*3+  (?v~
>4*(?vov>~86*$:@=?v86*00.  >:86*=?v77*1-+00.>88*-::-$-00.01-*8c<
 >.! ! ! 00~v?( 0:\00. >.!00+6*aa~<>~    92*2!.<2*29<
^7:;?=0:<r0~<
*o73.>n>84

Pruébalo aquí

Este es mi primer código de respuesta de golf! Finalmente pude usar el lenguaje que quería usar para un desafío de golf de código, y este parecía ser el perfecto dado que los caracteres se convierten automáticamente en decimales.

Esperaba que mi resultado fuera mucho más corto, pero aparentemente no. Sin embargo, no he jugado mucho al golf. Hay algunos lugares donde el código podría ser más limpio / tener más sentido, pero no guardará ningún byte ya que están en lugares donde se necesita espacio en blanco de todos modos. Puede haber una forma de guardar algunos bytes en el último bit en la segunda línea, haciendo que vaya en la dirección opuesta y combinando con el 00 que ya está allí, tendré que jugar con él más tarde

Básicamente, esto verifica si el carácter actual es un espacio, número, letra mayúscula o letra minúscula, verificando si está dentro del rango de los valores más altos / más bajos de ese grupo. Si no es ninguno de esos, se descarta. Si está en uno de esos, se convierte en un número si es una letra, y una letra si es un número (o más bien, un número del 97-106 que son los valores para las letras aj). Luego verifica si el valor superior es menor que 28, en cuyo caso es un número y genera un número; de lo contrario, es una letra y genera la letra que representa ese número, genera un espacio y luego realiza un bucle hasta que la pila esté vacía.

torcado
fuente
2

JavaScript (ES6), 108122124

Editar usando la expresión regular del comentario de @ Max
Edit2 14 bytes guardados gracias ETHProductions

EcmaScript 6 solo para las funciones de flecha, por lo que debería funcionar en Firefox y la última versión de Chrome.

Prueba a ejecutar el fragmento a continuación

F=
t=>t[R='replace'](/[^\w ]|_/g,'')[R](/ +|./g,c=>((v=parseInt(c,36))>9?c>'Z'?v-9:9-v:'jabcdefghi'[v]||0)+' ')

// Less golfed
U=t=>
  t.replace(/[^\w ]|_/g,'') // remove invalid characters
  .replace(/ +/g,' ') // collapse spaces
  .replace(/./g, c => ( // valid character replacing
    v = parseInt(c,36), // '0'..'9'-> 0..9, 'a'..'z' -> 10..25, ' ' -> NaN
    (
      v > 9 
      ? c > 'Z' ? v-9 : 9-v // manage upper vs lower
      : 'jabcdefghi'[v] || 0 // digits, NaN as an index gives undefined, substituted with 0
    ) + ' ' // separator space
  ))


// TEST
out=x=>O.textContent=x+'\n'+O.textContent;

function go() { out(I.value + ' --> ' + F(I.value) +'\n')}

// test cases, a trailing blank added to the expected output as ...
// "A single trailing space or newline is allowed."

;[
  ['A$b','-1 2 ']
, ['123___abc', 'a b c 1 2 3 ']
, ['You + Me','-25 15 21 0 -13 5 ']
, ['programming puzzles', '16 18 15 7 18 1 13 13 9 14 7 0 16 21 26 26 12 5 19 ']
, ['Code Golf', '-3 15 4 5 0 -7 15 12 6 ']
, ['Programming Puzzles & Code Golf', '-16 18 15 7 18 1 13 13 9 14 7 0 -16 21 26 26 12 5 19 0 -3 15 4 5 0 -7 15 12 6 ']
, ['C0d3 G0lf', '-3 j 4 c 0 -7 j 12 6 ']
].forEach(t=>{ 
  k=t[1],r=F(t[0]), 
  out('Test '+(k==r?'OK':'Fail')+'\nInput:  '+t[0]+'\nResult: '+r+'\nCheck:  '+k+'\n')
})
Custom test: <input id=I><button onclick='go()'>-></button>
<pre id=O></pre>

edc65
fuente
Puedo estar equivocado, pero creo que puedes salvar un montón cambiando [R](/ +/g,' ')[R](/./g,a [R](/ +|./g,. (Perdón por mencionar una publicación antigua, por cierto)
ETHproductions
@ETHproductions parece bueno. Gracias
edc65
1

CJam, 52 bytes

'{,97>:L_eu+A,s(++S+l{1$&},S%S*\26,:)_Wf*+LA<+0+erS*

Pruébalo en línea

La parte clave con la solución es que usa el CJam er (transliteración). Como argumentos para el operador, necesita la lista de todos los caracteres y una lista de los valores correspondientes.

Como paso previo al procesamiento en la entrada, elimina los caracteres que no forman parte de la tabla de traducción (caracteres especiales) y reduce los espacios repetidos a un solo espacio.

Explicación:

'{,97>  Build list of all lower case letters.
:L      Save it in variable L for later reuse.
_eu+    Add list of upper case letters.
A,s     Build digits "0123456789".
(+      Pop off first digit and append it at the end, to get "1234567890".
+       Add digits to list of characters.
S+      Add a space. List of characters that have values is now complete.
l       Get input.
{1$&},  Filter out all input characters that are not in list.
S%      Split input at spaces.
S*      And re-assemble it with spaces. This reduces multiple spaces to one space.
\       Swap input and character list.
26,     Start building list of values. Start with [0 ... 25].
:)      Use "smilie operator" to increment all values, to get [1 ... 26].
        These are the values for the lower case letters.
_Wf*    Copy the list and negate the values to get [-1 ... -26] for upper case.
+       Concatenate the two lists.
L       Retrieve the list of lower case letters we saved away earlier.
A<      Keep the first 10, which are the values for the digits.
+       Concatenate to list of values.
0+      Add 0 to list, as value for space.
er      Transliterate input string to corresponding values.
S*      Join with spaces for output.
Reto Koradi
fuente
1

Python 2, 191 179 177 173 172 168 160 bytes

import re
print" ".join([[[chr(x+48),"j"][x<49],[`[x-96,-x+64][x<96]`,"0"][x<65]][x>57or x<33]for x in map(ord,re.sub(" +"," ",re.sub("[^\w ]|_","",input())))])

Prueba

"programming puzzles"
16 18 15 7 18 1 13 13 9 14 7 0 16 21 26 26 12 5 19

"Code Golf"
-3 15 4 5 0 -7 15 12 6

"Programming Puzzles & Code Golf"
-16 18 15 7 18 1 13 13 9 14 7 0 -16 21 26 26 12 5 19 0 -3 15 4 5 0 -7 15 12 6

"C0d3 G0lf"
-3 j 4 c 0 -7 j 12 6

"You + Me"
-25 15 21 0 -13 5
Max
fuente
1

PHP, 116 bytes

while($c=ord(preg_replace(["#[^\w ]|_#","# +#"],["","@"],$argn))[$i++])echo$c<96?jabcdefghi[$c-48]?:64-$c:$c-96," ";

toma entrada de STDIN; correr con -nR.

Descompostura

while($c=ord(preg_replace(["#[^\w ]|_#","# +#"],["","@"],$argn) # sanitize input
    [$i++]))echo            # loop through string and print ...
    $c<96                       # if not lowercase:
        ?jabcdefghi[$c-48]          # digit -> letter
        ?:                          # if that turned out falsy (=empty):
        64-$c                       # uppercase (or former spaces) -> negative (or 0)
    :$c-96                      # else -> positive
," ";                           # append space

Puede reemplazar el @con una tecla de retroceso para manejar espacios en la parte en minúsculas.
Con jabcdefghi0los dígitos, también puede usar :.

Titus
fuente
Creo que debes cambiar el orden en "#_|[^\w ]#"lugar de "#[^\w ]|_#".
Jörg Hülsermann
0

Hassium , 1156 bytes

func main() {s = input();c="";for(x=0;x<s.length;x++){c=s[Convert.toNumber(Convert.toString(x))].toString();if (c.toLower()!=c)print(r(c.toLower())*-1);else if(r(c)=="")continue;else print(r(c));print(" ");}}func r(c) {if(c=="a")return 1;else if(c=="b")return 2;else if(c=="c")return 3;else if(c=="d")return 4;else if(c=="e")return 5;else if(c=="f")return 6;else if(c=="g")return 7;else if(c=="h")return 8;else if(c=="i")return 9;else if(c=="j")return 10;else if(c=="k")return 11;else if(c=="l")return 12;else if(c=="m")return 13;else if(c=="n")return 14;else if(c=="o")return 15;else if(c=="p")return 16;else if(c=="q")return 17;else if(c=="r")return 18;else if(c=="s")return 19;else if(c=="t")return 20;else if(c=="u")return 21;else if(c=="v")return 22;else if(c=="w")return 23;else if(c=="x")return 24;else if(c=="y")return 25;else if(c=="z")return 26;else if(c==" ")return 0;else if(c=="1")return "a";else if(c=="2")return "b";else if(c=="3")return "c";else if(c=="4")return "d";else if(c=="5")return "e";else if(c=="6")return "f";else if(c=="7")return "g";else if(c=="8")return "h";else if(c=="9")return "i";else if(c=="0")return "j";else return"";}

Respuesta muy larga

Jacob Misirian
fuente
1
El colapso de espacios no parece funcionar del todo. You + Meproduce la salida -25 15 21 0 0 -13 5.
Dennis
1
Lenguaje interesante, algo así como C / Java / [otro idioma del que no recuerdo el nombre]. ¿Hay una manera más fácil de convertir cada carácter en un número, es decir, una función para recuperar un código char ? (Desplácese hacia abajo a la mesa y mire la Deccolumna.)
ETHproductions
0

Jelly , 32 bytes, desafío de fechas posteriores al idioma

⁶ØB;µ³fi@€
Øaḣ⁵ṙ9
26RµN;;0¢;ị@ÑK

Pruébalo en línea!

Explicación

Función auxiliar1Ŀ (traduce cada alfanumérico / espacio en la entrada en un número)

⁶ØB;µ³fi@€
⁶           space
 ØB;        append all digits, uppercase and lowercase letters (in that order)
    µ       set as the new default for missing arguments
     ³      first command-line argument
      f     delete all characters not in {space + alphanumerics}
       i@€  take index of each element within {space + alphanumerics}

Función auxiliar (devuelve la cadena constante “jabcdefghi”)

Øaḣ⁵ṙ9
Øa      lowercase alphabet
  ḣ⁵    take first 10 elements
    ṙ9  rotate 9 elements to the left

Programa principal

26RµN;;0¢;ị@ÑK
26R             Range from 1 to 26
   µ            set as default for missing arguments
    N           Minus {each element of the range from 1 to 26}
     ;          with {the range from 1 to 26} appended
      ;0        with a 0 appended
        ¢;      with the result of 2£ prepended
          ị@    index into this using
            Ñ   the result of 1Ŀ
             K  separate by spaces

fuente
0

Retina, 74 70 bytes (no competitiva)

Observe el espacio inicial en la línea 3, el espacio final en la línea 6 y la segunda línea vacía.

[^ \ w] | _

 +
~
.
$ + 
[ARIZONA]
- $ +
T`L`l
[js]
a $ +
[tz]
b $ +
T` ~ ld`dd0-6jl

Pruébalo en línea!

Aunque el lenguaje se creó antes del desafío, creo que algunas de las características del lenguaje que utilicé son posteriores al desafío, por lo que lo he marcado como no competitivo.

adicto a las matemáticas
fuente
0

Java 7, 257254 bytes

class M{public static void main(String[]a){String r="",x;for(int c:a[0].getBytes()){x=(c>96&c<123?c-96:c>64&c<91?"-"+(c-64):c>48&c<58?(char)(c+48):c==48?"j":c<33?0:"")+"";r+=!x.isEmpty()&&!(r.endsWith("0 ")&x.equals("0"))?x+" ":"";}System.out.print(r);}}

Pruébalo aquí.

Explicación:

class M{                               // Class
  public static void main(String[]a){  //  Required main-method
    String r="",                       //   Result-String
      x;                               //   Temp String
    for(int c:a[0].getBytes()){        //   Loop over the characters of the input-String
      x=(                              //    Set the temp String to:
        c>96&c<123?                    //     If it's a lowercase letter:
          c-96                         //      Set `x` to the 1-indexed alphabetic index
        :c>64&c<91?                    //     Else-if it's a uppercase letter:
          "-"+(c-64)                   //      Set `x` to the 1-indexed alphabetic index as negative
        :c>48&c<58?                    //     Else-if it's a digit 1-9:
          (char)(c+48)                 //      Set `x` to the 1-indexed alphabetic character
        :c==48?                        //     Else if it's a zero:
          "j"                          //      Set `x` to "j"
        :c<33?                         //     Else if it's a space:
          0                            //      Set `x` to "0"
        :                              //     Else:
          ""                           //      Set `x` to an empty String
       )+"";                           //     Required `+""` because `(char)` and `0` aren't Strings
      r+=                              //    Append the result-String with:
        !x.isEmpty()                   //     If `x` has a value
        &&!(r.endsWith("0 ")&x.equals("0"))?
                                       //     and it's not "0" with the previous value also being a zero
          x+" "                        //      Append the value of `x`, plus a space
        :                              //     Else:
          "";                          //      Append nothing
    }                                  //   End of loop
    System.out.print(r);               //   Print the result to STDOUT
  }                                    //  End of main-method
}                                      // End of class

Ejemplo de entrada y salida:

Input:
Programming Puzzles & C0d3 G0lf

Output:
-16 18 15 7 18 1 13 13 9 14 7 0 -16 21 26 26 12 5 19 0 -3 j 4 c 0 -7 j 12 6 
Kevin Cruijssen
fuente