手紙の番号


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

取り消し線は問題を引き起こさないはずです。



出力の末尾にスペースを入れることはできますか?
デニス

はい。単一の末尾スペースまたは改行が許可されます。@デニス
ザック・ゲイツ

文字列を返す/印刷する関数は有効な答えですか?また、「abc_ABC」などのテストケースを追加して、すべての[^ \ w]および[\ W]正規表現を除外できますか?
最大

あなたが何を求めているのか完全にはわかりませんでしたが、そのテストケースを追加しました。それがあなたが探していたものであることを願っています。そうでない場合は、お知らせください。@マックス
ザック・ゲイツ

回答:


10

CJam、 58 57 54 51 50 49バイト

ただ、私が説明を書いたとき、私は別の50のバイトのバージョンの1バイトによって短縮することができることを気づきました...

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

提案を歓迎します!


「123___abc」をテストします。ヒント:アンダースコアを処理する必要があります
-edc65

別の問題:All non-alphanumeric characters should be ignored.。テスト:「$ b」はする必要があります-1 2
edc65

@ edc65ああ、男、私はそれをやったと思った...しかし、私に知らせてくれてありがとう!
ETHproductions

4

Pyth、50 49バイト

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

ここで試してみてください

編集:アンダースコアが正しく処理されるように、文字列のサニタイズを再構築しました。1バイトも節約しました。

このプログラムは、入力のサニタイズに使用されるルックアップ文字列を作成します。これは、その文字列の対応するインデックスにマップされます。最後に、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

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

ゴルフをしていない:

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

数字を文字として取得するには、ASCII値に58を追加し、現在の文字が0でない場合は10を減算します。これにより、0 ja-にマップされ、他の数字が-にマップされiます。

大文字の否定は、を使用して行われますcmp。これは、大文字の場合は-1、小文字の場合は1を返します。

オンラインで試す


2

パール5、120 116 113 105バイト

まず、不要な文字と余分なスペースをクリーンアップします。
次に、各キャラクターのアスキーテーブルを降ります。

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

2
あなたは\ sのの代わりに、正規表現での単一のスペースと第二の正規表現とゴルフ1文字がでgolfedすることができs/ +/ /g、最初の正規表現がマッチワット間違った理由は、\下線文字です
最大

2
別の2人のキャラクターがs/[^\w ]|_//g
最大

ニース、無視ケースフラグよりもさらに良い。
LukStorms

@Maxすてきなヒント。私の答えに2バイト保存されました、ありがとう。
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);}

少しゴルフを解いた:

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で指定されたテストに合格します。


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

ここで試してみてください

これが私の初めてのゴルフの答えです!最終的に、私はコードゴルフチャレンジに使用したい言語を使用することができました。これは、文字が自動的に小数に変換されることを考えると、完璧な言語のように見えました。

結果がもっと短くなると思っていましたが、明らかにそうではありませんでした。しかし、私はこれをあまりゴルフしていません。コードがよりクリーン/より理にかなっている場所がいくつかありますが、とにかく空白が必要な場所にあるため、バイトを節約しません。2行目の最後のビットにいくつかのバイトを保存する方法があります

基本的に、これは、現在の文字がスペース、数字、大文字、または小文字であるかどうかを、そのグループの最高値/最低値の範囲内にあるかどうかを確認して確認します。それらのいずれでもない場合、破棄されます。それらのいずれかにある場合、文字の場合は数字に変換され、数字の場合は文字に変換されます(または、文字ajの値である97-106の数字)。次に、最上位の値が28未満であるかどうかを確認します。その場合、数値であり、数値を出力します。


2

JavaScript(ES6)、108 122 124

@Maxのコメント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>


間違えているかもしれませんが、に変更[R](/ +/g,' ')[R](/./g,することで全体を節約できると思います[R](/ +|./g,。(古い投稿を掲載して申し訳ありませんが、btw)
ETHproductions

@ETHproductionsは良いようです。ありがとう
-edc65


1

CJam、52バイト

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

オンラインで試す

ソリューションの重要な部分は、CJam er(音訳)演算子を使用することです。演算子の引数として、すべての文字のリストと、対応する値のリストが必要です。

入力の前処理ステップとして、変換テーブルの一部ではない文字(特殊文字)を削除し、繰り返されるスペースを単一のスペースに減らします。

説明:

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

パイソン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:


私はあなたが"#_|[^\w ]#"代わりに順序を変更する必要があると信じています"#[^\w ]|_#"
ヨルグヒュルサーマン

0

Hassium、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の末尾スペース、および空の2行目に注意してください。

[^ \ w] | _

 +
〜
。
$ + 
[AZ]
-$ +
T`L`l
[js]
a $ +
[tz]
b $ +
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 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.