Số cho chữ cái


15

Tồn tại một mật mã rất đơn giản thay thế một chữ cái với vị trí của nó trong bảng chữ cái. Ví dụ, abcsẽ trở thành 1 2 3trong mật mã này.

Thách thức này là một thay thế trên mật mã này.


Các thách thức

Tạo một chương trình lấy đầu vào của các ký tự ASCII và xuất ra một chuỗi được phân tách bằng dấu cách:

  • số nguyên -26thông qua26

  • thư athông quaj

Đầu ra phải thông qua STDOUT hoặc ngôn ngữ thay thế gần nhất của bạn.


Thông số kỹ thuật

  • Chữ in hoa nên được phủ định. Một chữ hoa Dchẳng hạn sẽ là -4, trong khi chữ thường dsẽ là 4.

  • Các chữ số nên được thay đổi thành các bản sao alpha của chúng. 1được a, và như vậy. Bất kỳ số không trong đầu vào sẽ được j.

  • Tất cả các ký tự không chữ và số (trừ dấu cách) nên được bỏ qua.

  • Không gian là 0.

  • Các không gian liền kề trong đầu ra nên được giảm xuống một không gian duy nhất.

    Input: You + Me
    Correct Output: -25 15 21 0 -13 5
    Incorrect Output: -25 15 21 0 0 0 -13 5
    
  • Một không gian dấu vết duy nhất hoặc dòng mới được cho phép.


Ví dụ

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

Bảng điểm

Để điểm số của bạn xuất hiện trên bảng, nó phải ở định dạng này:

# Language, Bytes

Strikethroughs không gây ra vấn đề.



Đầu ra có thể có một không gian dấu?
Dennis

Đúng. Một không gian dấu vết duy nhất hoặc dòng mới được cho phép. @Dennis
Zach Gates

Là một hàm trả về / in một chuỗi là một câu trả lời hợp lệ? Ngoài ra, bạn có thể thêm trường hợp thử nghiệm như "abc_ABC" để loại trừ tất cả regex [^ \ w] và [\ W] không?
Tối đa

Tôi không hoàn toàn chắc chắn những gì bạn đang hỏi, nhưng tôi đã thêm trường hợp thử nghiệm đó. Tôi hy vọng đó là những gì bạn đang tìm kiếm; nếu không, hãy cho tôi biết @Max
Zach Gates

Câu trả lời:


10

CJam, 58 57 54 51 50 49 byte

Ngay khi tôi viết lên lời giải thích, tôi nhận thấy rằng một trong những phiên bản 50 byte thay thế có thể được rút ngắn bằng một byte ...

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

Kiểm tra nó ở đây.

Giải pháp 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*

Giải trình

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.

Đây phải là lần đầu tiên, hành vi modulo của CJam đối với các giá trị âm là hữu ích đối với tôi.


6

JavaScript (ES6), 110 107 133 120 byte

Lấy cái đó đi, tôi già!

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

Có khả năng có nhiều chỗ để chơi gôn hơn, đặc biệt là trong các cuộc thi regexes , đã khiến điều đó giảm xuống khá tốt. Phiên bản bị đánh cắp:

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

Gợi ý chào mừng!


Kiểm tra '123___abc'. Gợi ý: bạn cần xử lý dấu gạch dưới
edc65

Một vấn đề khác : All non-alphanumeric characters should be ignored.. Kiểm tra: 'A $ b' nên-1 2
edc65

@ edc65 Aw, anh bạn, tôi nghĩ tôi đã làm xong ... Nhưng cảm ơn vì đã cho tôi biết!
Sản xuất ETH

4

Bình thường, 50 49 byte

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

Dùng thử ở đây .

Chỉnh sửa: tái cấu trúc chuỗi khử trùng để đảm bảo dấu gạch dưới được xử lý chính xác. Nó thậm chí còn lưu một byte quá, yay!

Chương trình này tạo ra một chuỗi tra cứu, được sử dụng để vệ sinh đầu vào. Điều này sau đó được ánh xạ tới chỉ mục tương ứng trong chuỗi đó. Cuối cùng, bất kỳ chỉ số nào lớn hơn 26 đều được chuyển đổi thành ký tự ASCII chính xác.

                                                     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

Phiên bản trước, sử dụng \Wregex, ở mức 50 byte:

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

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

Ung dung:

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

Để có được các chữ số dưới dạng chữ cái, chúng ta thêm 58 vào giá trị ASCII và trừ 10 nếu ký tự hiện tại không bằng 0. Điều đó đảm bảo rằng 0 ánh xạ tới jvà các chữ số khác ánh xạ tới a-i .

Phủ định chữ in hoa được thực hiện bằng cách sử dụng cmp . Điều này sẽ trả về -1 cho chữ in hoa và 1 cho chữ thường.

Dùng thử trực tuyến


2

Perl 5, 120 116 113 105 byte

Đầu tiên làm sạch các ký tự không mong muốn và không gian thêm.
Sau đó leo xuống bảng ascii cho mỗi nhân vật.

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

Kiểm tra

$ 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

2
Bạn có thể chơi một nhân vật với một không gian duy nhất trong regex thay cho \ s và regex thứ hai có thể được chơi cùng s/ +/ /g, regex đầu tiên sai vì \ w khớp với ký tự gạch dưới
Max

2
Hai nhân vật khác xuất hiện cùngs/[^\w ]|_//g
Tối đa

Đẹp, thậm chí còn tốt hơn với cờ bỏ qua.
LukStorms

@Max gợi ý hay. 2 byte được lưu trong câu trả lời của tôi, cảm ơn bạn.
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);}

Bực mình một chút:

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

Vượt qua các bài kiểm tra đã cho trong GCC 4.9.3 & Clang 3.5.2.


2

> <> (cá), 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

Dùng thử ở đây

Đây là câu trả lời golf mã đầu tiên của tôi! Cuối cùng đã có thể sử dụng ngôn ngữ mà tôi muốn sử dụng cho một thử thách golf mã, và đây có vẻ như là ngôn ngữ hoàn hảo cho rằng các ký tự được tự động chuyển thành số thập phân.

Tôi dự đoán kết quả của tôi sẽ ngắn hơn, nhưng dường như không. Mặc dù vậy, tôi đã không chơi cái này quá nhiều. Có một vài nơi mã có thể sạch hơn / có ý nghĩa hơn, nhưng sẽ không lưu bất kỳ byte nào vì chúng ở những nơi cần khoảng trắng. Có thể có một cách để lưu một số byte ở bit cuối cùng trên dòng thứ hai, làm cho nó đi theo hướng ngược lại và trộn với 00 đã có, tôi sẽ phải chơi với nó sau

Về cơ bản, điều này kiểm tra xem char hiện tại là một khoảng trắng, số, chữ in hoa hay chữ thường, bằng cách kiểm tra xem nó có nằm trong phạm vi của các giá trị cao nhất / thấp nhất của nhóm đó không. Nếu nó không phải là bất kỳ trong số đó, nó sẽ bị loại bỏ. Nếu nó nằm trong một trong số đó, nó sẽ được chuyển đổi thành một số nếu đó là một chữ cái và một chữ cái nếu đó là một số (hay đúng hơn là một số từ 97-106 là các giá trị cho các chữ cái aj). Sau đó, nó kiểm tra xem giá trị trên có nhỏ hơn 28 hay không, trong trường hợp đó là một số và xuất ra một số, nếu không nó là một chữ cái và xuất ra chữ cái mà số đó đại diện, xuất ra một khoảng trắng, sau đó lặp lại cho đến khi ngăn xếp trống.


2

JavaScript (ES6), 108 122 124

Chỉnh sửa Sử dụng regexp từ @ bình luận Max của
Edit2 14 byte lưu nhờ ETHProductions

EcmaScript 6 chỉ dành cho các chức năng mũi tên, vì vậy nó sẽ hoạt động trong Firefox và Chrome mới nhất.

Kiểm tra chạy đoạn mã dưới đây

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>


Tôi có thể nhầm, nhưng tôi nghĩ bạn có thể cứu cả đống bằng cách đổi [R](/ +/g,' ')[R](/./g,sang [R](/ +|./g,. (Xin lỗi vì đã đưa lên một bài viết cũ, btw)
ETHproductions

@ETHproductions có vẻ tốt. Cảm ơn
edc65


1

CJam, 52 byte

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

Dùng thử trực tuyến

Phần quan trọng với giải pháp là nó sử dụng CJam er (phiên âm). Là đối số cho toán tử, nó cần danh sách tất cả các ký tự và danh sách các giá trị tương ứng.

Là bước xử lý trước trên đầu vào, nó loại bỏ các ký tự không phải là một phần của bảng dịch (các ký tự đặc biệt) và giảm các khoảng trắng lặp lại thành một khoảng trắng.

Giải trình:

'{,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 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())))])

Kiểm tra

"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 byte

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

lấy đầu vào từ STDIN; chạy với -nR.

phá vỡ

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

Bạn có thể thay thế @bằng một backtick để xử lý khoảng trắng trong phần chữ thường.
Với jabcdefghi0các chữ số, bạn cũng có thể sử dụng :.


Tôi tin rằng bạn phải thay đổi thứ tự "#_|[^\w ]#"thay vì "#[^\w ]|_#".
Jörg Hülsermann

0

Kali , 1156 byte

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

Câu trả lời rất dài


1
Thu gọn không gian dường như không hoạt động. You + Metạo ra đầu ra -25 15 21 0 0 -13 5.
Dennis

1
Ngôn ngữ thú vị, giống như C / Java / [ngôn ngữ khác tôi không thể nhớ tên của]. Có cách nào dễ dàng hơn để chuyển đổi mỗi ký tự thành một số, tức là một hàm để lấy mã char ? (Cuộn xuống bàn và nhìn vào Deccột.)
ETHproductions

0

Jelly , 32 byte, thách thức ngôn ngữ

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

Hãy thử trực tuyến!

Giải trình

Hàm trợ giúp1Ŀ (dịch từng chữ số / dấu cách trong đầu vào thành một số)

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

Hàm trợ giúp (trả về chuỗi không đổi “jabcdefghi”)

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

Chương trình chính

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

Võng mạc, 74 70 byte (không cạnh tranh)

Lưu ý không gian hàng đầu trên dòng 3, không gian dấu trên dòng 6 và dòng thứ hai trống.

[^ \ w] | _

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

Hãy thử trực tuyến!

Mặc dù ngôn ngữ được tạo ra trước thử thách, tôi nghĩ rằng một số tính năng ngôn ngữ tôi đã sử dụng sau thử thách, vì vậy tôi đã đánh dấu đây là không cạnh tranh.


0

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

Hãy thử nó ở đây.

Giải trình:

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

Ví dụ đầu vào và đầu ra:

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 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.