Цифры для букв

15

Существует очень простой шифр, который заменяет букву ее положением в алфавите. Например, abcстал бы 1 2 3в этом шифре.

Этот вызов - альтернативный подход к этому шифру.


Соревнование

Создайте программу, которая принимает ввод символов ASCII и выводит разделенную пробелами строку:

  • целые числа -26через26

  • письма aчерезj

Вывод должен прийти через STDOUT или ближайшую альтернативу вашего языка.


Характеристики

  • Заглавные буквы должны быть отменены. Столица D, например , будет -4, в то время как в нижнем регистре dбудет 4.

  • Цифры должны быть заменены на их альфа-аналоги. 1бытие aи тд. Любые нули на входе будут j.

  • Все не алфавитно-цифровые символы (кроме пробелов) следует игнорировать.

  • Пространства есть 0.

  • Соседние пробелы в выводе должны быть сведены к одному пробелу.

    Input: You + Me
    Correct Output: -25 15 21 0 -13 5
    Incorrect Output: -25 15 21 0 0 0 -13 5
    
  • Допускается один пробел или символ новой строки.


Примеры

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

Табло

Чтобы ваш счет появился на доске, он должен быть в следующем формате:

# Language, Bytes

Зачеркивание не должно вызывать проблем.

Зак Гейтс
источник
1
Связанный: codegolf.stackexchange.com/q/12253/4372
Даниеро
Может ли выход иметь конечный пробел?
Деннис
Да. Допускается один пробел или символ новой строки. @Dennis
Зак Гейтс
Является ли функция, возвращающая / печатающая строку, верным ответом? Также вы можете добавить контрольный пример, например, "abc_ABC", чтобы исключить все регулярные выражения [^ \ w] и [\ W]?
Макс
Я не был полностью уверен, что вы спрашивали, но я добавил этот тестовый пример. Я надеюсь, что это то, что вы искали; если нет, дайте мне знать. @ Макс
Зак Гейтс

Ответы:

10

CJam, 58 57 54 51 50 49 байтов

Как раз когда я написал объяснение, я заметил, что одна из альтернативных 50-байтовых версий может быть сокращена на байт ...

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

Проверьте это здесь.

50-байтовые решения:

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*

объяснение

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.

Это должно быть впервые, когда поведение CJam по модулю для отрицательных значений было полезно для меня.

Мартин Эндер
источник
6

JavaScript (ES6), 110 107 133 120 байт

Возьми это, старый я!

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

Потенциально гораздо больше места для игры в гольф, особенно в регулярных выражениях, нет. Безголовая версия:

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;
}

Предложения приветствуются!

ETHproductions
источник
Тест "123___abc". Подсказка: вам нужно обработать подчеркивание
edc65
Еще одна проблема: All non-alphanumeric characters should be ignored.. Тест: «A $ b» должно быть-1 2
edc65
@ edc65 Ой, чувак, я думал, что сделал это ... Но спасибо, что сообщили мне знать!
ETHproductions
4

Pyth, 50 49 байтов

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

Попробуйте это здесь .

Редактировать: реструктурированная санация строк для обеспечения правильной обработки подчеркивания. Это даже спасло байт, да!

Эта программа создает строку поиска, которая используется для очистки входных данных. Затем он сопоставляется с соответствующим индексом в этой строке. Наконец, любой индекс больше 26 преобразуется в правильный символ ASCII.

                                                     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

Предыдущая версия, в которой использовалось \Wрегулярное выражение, размером 50 байт:

jdm?>d26C+70ddm-xs[_rG1\ Gjk.<UT1)d26::z"\W"d" +"d
Sok
источник
3

Юлия, 145 136 байт

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" +"," ")]," "))

Ungolfed:

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

Чтобы получить цифры в виде букв, мы добавляем 58 к значению ASCII и вычитаем 10, если текущий символ не равен 0. Это гарантирует, что 0 отображается на, jа остальные цифры отображаются на a- i.

Отрицание заглавных букв делается с помощью cmp. Это вернет -1 для заглавных букв и 1 для строчных.

Попробуйте онлайн

Алекс А.
источник
2

Perl 5, 120 116 113 105 байт

Сначала убирает ненужных персонажей и лишние пробелы.
Затем спускается по таблице ascii для каждого персонажа.

$_=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//

Тестовое задание

$ 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
источник
2
Вы можете сыграть в гольф одного персонажа с одним пробелом в регулярном выражении вместо \ s, а с вторым регулярным выражением можно играть в гольф s/ +/ /g, первое регулярное выражение неверно, потому что \ w соответствует символу подчеркивания
Макс.
2
Еще два персонажаs/[^\w ]|_//g
Макс
Хорошо, даже лучше, чем с флагом игнорирования.
LukStorms
@ Макс хороший совет. 2 байта сохранены в моем ответе, спасибо.
edc65
2

С, 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);}

Немного разгулялся:

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

Проходит данные тесты в GCC 4.9.3 и Clang 3.5.2.

preshing
источник
2

> <> (рыба), 219 209 байт

>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

Попробуйте это здесь

Это мой первый кодовый ответ на гольф! Наконец-то я смог использовать язык, который хотел использовать для задания кода в гольф, и это выглядело как идеальный вариант, если учесть, что символы автоматически преобразуются в десятичные.

Я ожидал, что мой результат будет намного короче, но, видимо, нет. Хотя я не слишком много играл в гольф. Есть несколько мест, где код может быть чище / более понятным, но не будет сохранять байты, так как они находятся в местах, где пробел необходим в любом случае. Возможно, есть способ сохранить несколько байтов на последнем бите во второй строке, заставить его идти в противоположном направлении и смешивать с уже имеющимися 00, мне придется поиграть с этим позже.

По сути, это проверяет, является ли текущий символ пробелом, цифрой, заглавной или строчной буквой, проверяя, находится ли он в диапазоне самых высоких / самых низких значений этой группы. Если это не что-то из этого, оно отбрасывается. Если он находится в одном из них, он преобразуется в число, если это буква, и буква, если это число (или, скорее, число от 97 до 106, которые являются значениями для букв aj). Затем он проверяет, является ли верхнее значение меньше 28, и в этом случае это число, и выводит число, в противном случае это буква и выводит букву, которую представляет число, выводит пробел, а затем зацикливается, пока стек не станет пустым.

torcado
источник
2

JavaScript (ES6), 108 122 124

Редактировать Используя регулярное выражение из комментария @ Макса
Edit2 14 байтов сохранено благодаря ETHProductions

EcmaScript 6 только для функций со стрелками, поэтому он должен работать в Firefox и последней версии Chrome.

Тест бегущего фрагмента ниже

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
источник
Я могу ошибаться, но я думаю, что вы можете сохранить целую кучу, перейдя [R](/ +/g,' ')[R](/./g,на [R](/ +|./g,. (Извините, что поднял старый пост, кстати)
ETHproductions
@ETHproductions кажется хорошим. Спасибо
edc65
1

CJam, 52 байта

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

Попробуйте онлайн

Ключевой частью решения является то, что оно использует erоператор CJam (транслитерации). В качестве аргументов оператора ему необходим список всех символов и список соответствующих значений.

В качестве шага предварительной обработки ввода он удаляет символы, которые не являются частью таблицы перевода (специальные символы), и уменьшает количество повторяющихся пробелов до одного пробела.

Объяснение:

'{,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.
Рето Коради
источник
1

Python 2, 191 179 177 173 172 168 160 байт

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

Тестовое задание

"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
Максимум
источник
1

PHP, 116 байт

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

принимает данные от STDIN; бежать с-nR .

сломать

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

Вы можете заменить @знак обратной чертой для обработки пробелов в строчной части.
С jabcdefghi0помощью цифр вы также можете использовать :.

Titus
источник
Я считаю, что вы должны изменить порядок "#_|[^\w ]#"вместо "#[^\w ]|_#".
Йорг Хюльсерманн
0

Калий , 1156 байт

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"";}

Очень длинный ответ

Яков Мисирян
источник
1
Кажется, что разрушающиеся пространства не работают. You + Meпроизводит вывод -25 15 21 0 0 -13 5.
Деннис
1
Интересный язык, вроде C / Java / [другой язык, название которого я не помню]. Есть ли более простой способ преобразовать каждый символ в число, то есть функцию, чтобы получить код символа ? (Прокрутите вниз к столу и посмотрите на Decколонку.)
ETHproductions
0

Желе , 32 байта, языковые проблемы

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

Попробуйте онлайн!

объяснение

Вспомогательная функция1Ŀ (переводит каждый буквенно-цифровой / пробел на входе в число)

⁶Ø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}

Вспомогательная функция (возвращает постоянную строку “jabcdefghi”)

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

Основная программа

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

источник
0

Сетчатка, 74 70 байт (не конкурирует)

Обратите внимание на начальный пробел в строке 3, завершающий пробел в строке 6 и пустую вторую строку.

[^ \ w] | _

 +
~
,
$ + 
[AZ]
- $ +
T`L`l
[JS]
в размере $ +
[TZ]
б $ +
T` ~ ld`dd0-6jl

Попробуйте онлайн!

Несмотря на то, что язык был создан до проведения конкурса, я думаю, что некоторые языковые функции, которые я использовал, возникли после конкурса, поэтому я отметил его как неконкурентный.

математик наркоман
источник
0

Java 7, 257 254 байта

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

Попробуй это здесь.

Объяснение:

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

Пример ввода и вывода:

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 
Кевин Круйссен
источник