Liczby na litery

15

Istnieje bardzo prosty szyfr, który zastępuje literę pozycją w alfabecie. Na przykład abcstałby się 1 2 3w tym szyfrze.

To wyzwanie stanowi alternatywne podejście do tego szyfru.


Wyzwanie

Utwórz program, który pobiera znaki ASCII i generuje ciąg znaków oddzielony spacjami:

  • liczby całkowite -26przez26

  • litery aprzezj

Dane wyjściowe powinny pochodzić z STDOUT lub najbliższej alternatywy twojego języka.


Dane techniczne

  • Wielkie litery należy zanegować. Stolica Dna przykład byłoby -4, podczas gdy małe dbyłoby 4.

  • Cyfry należy zmienić na ich odpowiedniki alfa. 1bycie ai tak dalej. Wszelkie zera na wejściu będą j.

  • Wszystkie znaki niealfanumeryczne (oprócz spacji) należy zignorować.

  • Przestrzenie są 0.

  • Sąsiednie spacje na wyjściu powinny zostać zredukowane do pojedynczego spacji.

    Input: You + Me
    Correct Output: -25 15 21 0 -13 5
    Incorrect Output: -25 15 21 0 0 0 -13 5
    
  • Dozwolona jest pojedyncza spacja lub znak nowej linii.


Przykłady

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

Tablica wyników

Twój wynik powinien pojawić się na tablicy, powinien mieć następujący format:

# Language, Bytes

Przekreślenia nie powinny powodować problemów.

Zach Gates
źródło
Czy wyjście może mieć spację końcową?
Dennis,
Tak. Dozwolona jest pojedyncza spacja lub znak nowej linii. @Dennis
Zach Gates
Czy funkcja zwracająca / drukująca ciąg jest poprawną odpowiedzią? Czy możesz również dodać przypadek testowy, taki jak „abc_ABC”, aby wykluczyć wszystkie wyrażenia regularne [^ \ w] i [\ W]?
Maks.
Nie byłem do końca pewien, o co pytasz, ale dodałem ten testowy przypadek. Mam nadzieję, że tego właśnie szukałeś; jeśli nie, daj mi znać. @Max
Zach Gates

Odpowiedzi:

10

CJam, 58 57 54 51 50 49 bajtów

Właśnie kiedy napisałem wyjaśnienie, zauważyłem, że jedną z alternatywnych 50-bajtowych wersji można skrócić o bajt ...

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

Sprawdź to tutaj.

50 bajtów rozwiązań:

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*

Wyjaśnienie

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.

To musi być pierwszy raz, gdy zachowanie modulo CJam dla wartości ujemnych było dla mnie przydatne.

Martin Ender
źródło
6

JavaScript (ES6), 110 107 133 120 bajtów

Weź to, stary ja!

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

Potencjalnie jest o wiele więcej miejsca na grę w golfa, szczególnie w wyrażeniach regularnych, nieźle. Wersja bez golfa:

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

Sugestie mile widziane!

ETHprodukcje
źródło
Test „123___abc”. Wskazówka: musisz obsługiwać podkreślenia
edc65
Kolejny problem: All non-alphanumeric characters should be ignored.. Test: „A $ b” powinno być-1 2
edc65
@ edc65 Aw, stary, myślałem, że to zrobiłem ... Ale dzięki za poinformowanie mnie!
ETHprodukcje
4

Pyth, 50 49 bajtów

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

Wypróbuj tutaj .

Edycja: zrestrukturyzowane odkażanie łańcucha, aby upewnić się, że podkreślenia są obsługiwane poprawnie. Nawet zaoszczędził bajt, tak!

Ten program tworzy ciąg wyszukiwania, który służy do dezynfekcji danych wejściowych. Jest to następnie mapowane na odpowiedni indeks w tym ciągu. Wreszcie, każdy indeks większy niż 26 jest konwertowany na poprawny znak 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

Poprzednia wersja, która korzystała z \W wyrażenia regularnego, o 50 bajtów:

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

Julia, 145 136 bajtów

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

Nie golfowany:

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

Aby uzyskać cyfry jako litery, dodajemy 58 do wartości ASCII i odejmujemy 10, jeśli bieżącym znakiem nie jest 0. To zapewnia, że ​​0 mapuje na j a pozostałe cyfry na a- i.

Negowanie wielkich liter odbywa się za pomocą cmp . Zwróci -1 dla wielkich liter i 1 dla małych.

Wypróbuj online

Alex A.
źródło
2

Perl 5, 120 116 113 105 bajtów

Najpierw usuwa niechciane postacie i dodatkowe spacje.
Następnie schodzi po stole ascii dla każdej postaci.

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

Test

$ 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
źródło
2
Możesz zagrać w golfa jedną postacią z jednym spacją w wyrażeniu regularnym zamiast \ s, a drugim wyrażeniem regularnym można zagrać w golfa s/ +/ /g, pierwsze wyrażenie jest błędne, ponieważ \ w pasuje do znaku podkreślenia
Max
2
Kolejne dwie postacie zs/[^\w ]|_//g
Max
Fajnie, nawet lepiej niż z flagą ignorowania wielkości liter.
LukStorms,
@ Max ładna wskazówka. 2 bajty zapisane w mojej odpowiedzi, dziękuję.
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);}

Niegolf trochę:

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

Zalicza podane testy w GCC 4.9.3 i Clang 3.5.2.

odświeżający
źródło
2

> <> (ryba), 219 209 bajtów

>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

Wypróbuj tutaj

To jest moja pierwsza odpowiedź na golfa! Wreszcie mogłem użyć języka, którego chciałem użyć do gry w golfa kodowego, i wydawało się to idealne, biorąc pod uwagę, że znaki są automatycznie konwertowane na dziesiętne.

Spodziewałem się, że mój wynik będzie znacznie krótszy, ale najwyraźniej nie. Chociaż nie za bardzo grałem w golfa. Jest kilka miejsc, w których kod może być czystszy / bardziej sensowny, ale nie zapisuje żadnych bajtów, ponieważ są one w miejscach, w których i tak potrzebne są białe znaki. Może być sposób na zaoszczędzenie niektórych bajtów na ostatnim bicie w drugiej linii, dzięki czemu pójdzie on w przeciwnym kierunku i zetknie się z 00 już tam, będę musiał grać z tym później

Zasadniczo sprawdza, czy bieżący znak jest spacją, liczbą, wielką lub małą literą, sprawdzając, czy jest w zakresie najwyższych / najniższych wartości w tej grupie. Jeśli nie jest to żaden z nich, zostaje odrzucony. Jeśli jest w jednym z nich, jest konwertowany na liczbę, jeśli jest to litera, i na literę, jeśli jest liczbą (a raczej liczbą z 97-106, które są wartościami dla liter aj). Następnie sprawdza, czy najwyższa wartość jest mniejsza niż 28, w którym to przypadku jest liczbą i wypisuje liczbę, w przeciwnym razie jest to litera i wypisuje literę, którą reprezentuje liczba, wypuszcza spację, a następnie zapętla się, aż stos będzie pusty.

torcado
źródło
2

JavaScript (ES6), 108 122 124

Edytuj Używając wyrażenia regularnego z komentarza @ Max
Edytuj2 14 bajtów zapisanych dzięki ETHProductions

EcmaScript 6 tylko dla funkcji strzałek, więc powinien działać w Firefoksie i najnowszym Chrome.

Przetestuj poniższy fragment kodu

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ódło
Mogę się mylić, ale myślę, że możesz uratować całą grupę, zmieniając [R](/ +/g,' ')[R](/./g,na [R](/ +|./g,. (Przepraszam za wychowywanie stary post, btw)
ETHproductions
@ETHproductions wydaje się dobre. Dzięki
edc65,
1

CJam, 52 bajty

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

Wypróbuj online

Kluczową częścią rozwiązania jest to, że używa CJam er (transliteracja). Jako argument dla operatora potrzebuje listy wszystkich znaków i listy odpowiednich wartości.

Jako etap wstępnego przetwarzania danych wejściowych usuwa znaki, które nie są częścią tabeli translacji (znaki specjalne), i zmniejsza powtarzające się spacje do pojedynczej spacji.

Wyjaśnienie:

'{,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
źródło
1

Python 2, 191 179 177 173 172 168 160 bajtów

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

Test

"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
źródło
1

PHP, 116 bajtów

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

pobiera dane wejściowe ze STDIN; Biegnij z-nR .

awaria

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

Możesz zastąpić @znakiem backtick, aby obsłużyć spacje w małych literach.
Z jabcdefghi0cyframi możesz także skorzystać :.

Tytus
źródło
Uważam, że "#_|[^\w ]#"zamiast tego musisz zmienić kolejność "#[^\w ]|_#".
Jörg Hülsermann
0

Sód , 1156 bajtów

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

Bardzo długa odpowiedź

Jacob Misirian
źródło
1
Zwijanie przestrzeni nie wydaje się działać. You + Meprodukuje dane wyjściowe -25 15 21 0 0 -13 5.
Dennis,
1
Ciekawy język, trochę jak C / Java / [inny język, którego nie pamiętam]. Czy istnieje łatwiejszy sposób na konwersję każdego znaku na liczbę, tj. Funkcję pobierania kodu znakowego ? (Przewiń w dół do tabeli i spójrz na Deckolumnę.)
ETHprodukcje
0

Galaretka , 32 bajty, wyzwanie dla postdate języka

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

Wypróbuj online!

Wyjaśnienie

Funkcja pomocnicza1Ŀ (tłumaczy każdą literę / spację w danych wejściowych na liczbę)

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

Funkcja pomocnicza (zwraca ciąg stały “jabcdefghi”)

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

Główny program

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

źródło
0

Retina, 74 70 bajtów (niekonkurujące)

Zwróć uwagę na spację wiodącą w linii 3, spację końcową w linii 6 i pustą drugą linię.

[^ \ w] | _

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

Wypróbuj online!

Chociaż język został stworzony przed wyzwaniem, myślę, że niektóre funkcje językowe, których użyłem po dacie wyzwania, oznaczyłem jako niekonkurujące.

ćpun matematyki
źródło
0

Java 7, 257 254 bajtów

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

Wypróbuj tutaj.

Wyjaśnienie:

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

Przykładowe wejście i wyjście:

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
źródło