Angka untuk Surat

15

Ada sandi yang sangat sederhana yang menggantikan huruf dengan posisinya di alfabet. Misalnya, abcakan menjadi 1 2 3dalam sandi ini.

Tantangan ini merupakan alternatif untuk mengambil sandi ini.


Tantangan

Buat program yang mengambil input karakter ASCII, dan menghasilkan string yang dipisahkan spasi dari:

  • bilangan bulat -26melalui26

  • surat amelaluij

Outputnya harus melalui STDOUT atau alternatif terdekat bahasa Anda.


Spesifikasi

  • Huruf kapital harus dinegasikan. Modal Dmisalnya adalah -4, sedangkan huruf kecil dadalah 4.

  • Digit harus diubah ke rekan alpha mereka. 1sedang a, dan sebagainya. Setiap nol dalam input akan menjadi j.

  • Semua karakter non-alfanumerik (kecuali spasi) harus diabaikan.

  • Spasi adalah 0.

  • Ruang yang berdekatan dalam output harus dikurangi menjadi satu ruang.

    Input: You + Me
    Correct Output: -25 15 21 0 -13 5
    Incorrect Output: -25 15 21 0 0 0 -13 5
    
  • Ruang trailing tunggal atau baris baru diizinkan.


Contohnya

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

Papan angka

Agar skor Anda muncul di papan tulis, itu harus dalam format ini:

# Language, Bytes

Dicoret tidak seharusnya menyebabkan masalah.

Zach Gates
sumber
Bisakah output memiliki ruang tambahan?
Dennis
Iya. Ruang trailing tunggal atau baris baru diizinkan. @Dennis
Zach Gates
Apakah fungsi mengembalikan / mencetak string adalah jawaban yang valid? Dapatkah Anda menambahkan test case seperti "abc_ABC" untuk menyingkirkan semua regex [^ \ w] dan [\ W]?
Maks
Saya tidak sepenuhnya yakin apa yang Anda tanyakan, tetapi saya telah menambahkan test case itu. Saya harap itulah yang Anda cari; jika tidak, beri tahu saya. @ Max
Zach Gates

Jawaban:

10

CJam, 58 57 54 51 50 49 byte

Tepat ketika saya menulis penjelasannya, saya perhatikan bahwa salah satu alternatif versi 50 byte dapat dipersingkat dengan satu byte ...

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

Uji di sini.

Solusi 50 byte:

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*

Penjelasan

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.

Ini harus menjadi yang pertama kalinya, bahwa perilaku modulo CJam untuk nilai negatif berguna bagi saya.

Martin Ender
sumber
6

JavaScript (ES6), 110 107 133 120 byte

Ambillah itu, aku yang tua!

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

Ada potensi lebih banyak ruang untuk bermain golf, terutama di regexes nggak, yang cukup bagus. Versi tidak disatukan:

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

Saran diterima!

Produksi ETH
sumber
Tes '123___abc'. Petunjuk: Anda perlu menangani garis bawah
edc65
Masalah lain: All non-alphanumeric characters should be ignored.. Tes: 'A $ b' harus-1 2
edc65
@ edc65 Ah, bung, kupikir sudah selesai ... Tapi terima kasih sudah memberitahuku!
ETHproduksi
4

Pyth, 50 49 byte

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

Cobalah di sini .

Sunting: sanitasiasi tali terstruktur untuk memastikan garis bawah ditangani dengan benar. Bahkan menyimpan byte juga, yay!

Program ini membuat string pencarian, yang digunakan untuk membersihkan input. Ini kemudian dipetakan ke indeks terkait dalam string itu. Akhirnya, setiap indeks yang lebih besar dari 26 dikonversi ke karakter ASCII yang benar.

                                                     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 sebelumnya, yang menggunakan \Wregex, dengan kecepatan 50 byte:

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

Julia, 145 136 byte

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

Tidak Disatukan:

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

Untuk mendapatkan digit sebagai huruf, kita menambahkan 58 ke nilai ASCII dan mengurangi 10 jika karakter saat ini tidak 0. Itu memastikan bahwa 0 peta ke jdan angka lainnya peta ke a- i.

Meniadakan huruf besar dilakukan dengan menggunakan cmp. Ini akan mengembalikan -1 untuk huruf besar dan 1 untuk huruf kecil.

Cobalah online

Alex A.
sumber
2

Perl 5, 120 116 113 105 Bytes

Pertama membersihkan karakter yang tidak diinginkan & ruang ekstra.
Kemudian naik ke bawah tabel ascii untuk setiap karakter.

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

Uji

$ 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
sumber
2
Anda dapat bermain golf satu karakter dengan spasi tunggal di regex menggantikan \ dan regex kedua dapat di-golf dengan s/ +/ /g, regex pertama salah karena \ w cocok dengan karakter garis bawah
Max
2
Dua karakter lagi dengans/[^\w ]|_//g
Maks
Bagus, bahkan lebih baik daripada dengan bendera kasus abaikan.
LukStorms
@Max petunjuk bagus. 2 byte disimpan dalam jawaban saya, terima kasih.
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);}

Tidak digabungkan sedikit:

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

Lulus tes yang diberikan dalam GCC 4.9.3 & Dentang 3.5.2.

preshing
sumber
2

> <> (ikan), 219 209 byte

>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

Cobalah di sini

Ini adalah jawaban golf kode pertama saya! Akhirnya bisa menggunakan bahasa yang saya ingin gunakan untuk tantangan kode golf, dan ini sepertinya yang sempurna mengingat bahwa karakter secara otomatis dikonversi ke desimal.

Saya berharap hasil saya jauh lebih pendek, tetapi ternyata tidak. Padahal, saya belum terlalu banyak bermain golf. Ada beberapa tempat kode bisa lebih bersih / lebih masuk akal, tetapi tidak akan menyimpan byte karena mereka ada di tempat-tempat di mana spasi masih diperlukan. Mungkin ada cara untuk menyimpan beberapa byte pada bit terakhir pada baris kedua, membuatnya pergi ke arah yang berlawanan dan menumbuk dengan 00 yang sudah ada di sana, saya harus bermain dengannya lagi

Pada dasarnya, ini memeriksa untuk melihat apakah karakter saat ini adalah spasi, angka, huruf besar, atau huruf kecil, dengan memeriksa apakah itu dalam kisaran nilai tertinggi / terendah dari grup itu. Jika bukan salah satu dari itu, itu akan dibuang. Jika ada di salah satu dari itu, itu akan dikonversi menjadi angka jika itu huruf, dan huruf jika itu angka (atau lebih tepatnya, angka dari 97-106 yang merupakan nilai untuk huruf aj). Kemudian memeriksa apakah nilai teratas kurang dari 28, dalam hal ini adalah angka dan menghasilkan angka, jika tidak itu adalah huruf dan menampilkan huruf yang mewakili angka, menghasilkan spasi, kemudian loop sampai tumpukan kosong.

torcado
sumber
2

JavaScript (ES6), 108 122 124

Edit Menggunakan regexp dari komentar @ Max
Edit2 14 byte disimpan berkat ETHProductions

EcmaScript 6 hanya untuk fungsi panah, jadi itu harus berfungsi di Firefox dan Chrome terbaru.

Tes menjalankan cuplikan di bawah ini

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
sumber
Saya mungkin salah, tapi saya pikir Anda bisa menyelamatkan banyak dengan mengubah [R](/ +/g,' ')[R](/./g,ke [R](/ +|./g,. (Maaf karena memunculkan kiriman lama, btw)
ETHproduksi
@ ETHproduksi sepertinya bagus. Terima kasih
edc65
1

CJam, 52 byte

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

Cobalah online

Bagian penting dengan solusinya adalah menggunakan eroperator CJam (transliterasi). Sebagai argumen kepada operator, operator perlu daftar semua karakter, dan daftar nilai yang sesuai.

Sebagai langkah pra-pemrosesan pada input, ini menghilangkan karakter yang bukan bagian dari tabel terjemahan (karakter khusus), dan mengurangi spasi berulang menjadi satu ruang.

Penjelasan:

'{,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
sumber
1

Python 2, 191 179 177 173 172 168 160 byte

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

Uji

"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
Maks
sumber
1

PHP, 116 byte

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

menerima input dari STDIN; jalankan bersama-nR .

kerusakan

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

Anda dapat mengganti @dengan backtick untuk menangani spasi di bagian huruf kecil.
Dengan jabcdefghi0untuk digit, Anda juga bisa menggunakan :.

Titus
sumber
Saya percaya Anda harus mengubah urutan "#_|[^\w ]#"alih-alih "#[^\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"";}

Jawaban yang sangat panjang

Yakub Misirian
sumber
1
Runtuh ruang sepertinya tidak berfungsi. You + Memenghasilkan output -25 15 21 0 0 -13 5.
Dennis
1
Bahasa yang menarik, seperti C / Java / [bahasa lain yang saya tidak ingat namanya]. Apakah ada cara yang lebih mudah untuk mengubah setiap karakter menjadi angka, yaitu fungsi untuk mengambil kode karakter ? (Gulir ke bawah ke meja dan lihat Deckolom.)
ETHproduksi
0

Jelly , 32 byte, tantangan tanggal kiriman bahasa

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

Cobalah online!

Penjelasan

Fungsi pembantu1Ŀ (menerjemahkan setiap alfanumerik / spasi dalam input menjadi angka)

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

Fungsi pembantu (mengembalikan string konstan “jabcdefghi”)

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

Program utama

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

sumber
0

Retina, 74 70 byte (tidak bersaing)

Perhatikan spasi di baris 3, spasi di baris 6, dan baris kedua yang kosong.

[^ \ w] | _

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

Cobalah secara Online!

Meskipun bahasanya dibuat sebelum tantangan, saya pikir beberapa fitur bahasa yang saya gunakan setelah tanggal tantangan, jadi saya telah menandai ini sebagai non-bersaing.

pecandu matematika
sumber
0

Java 7, 257 254 byte

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

Coba di sini.

Penjelasan:

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

Contoh input & output:

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
sumber