ASCII奇数/偶数暗号


13

以下の擬似コードを使用して、ASCII奇数/偶数暗号を定義します。

Define 'neighbor' as the characters adjacent to the current letter in the string

If the one of the neighbors is out of bounds of the string, treat it as \0 or null

Take an input string

For each letter in the string, do
  If the 0-based index of the current letter is even, then
    Use the binary-or of the ASCII codes of both its neighbors
  Else
    If the ASCII code of the current letter is odd, then
      Use the binary-or of itself plus the left neighbor
    Else
      Use the binary-or of itself plus the right neighbor
  In all cases,
    Convert the result back to ASCII and return it
  If this would result in a code point 127 or greater to be converted, then
    Instead return a space

Join the results of the For loop back into one string and output it

たとえば、inputのHello場合、出力はですemmol

  • Hターン\0 | 'e'でありますe
  • eターン'e' | 'l'、または101 | 108ある、109またはm
  • 最初はlまたになります101 | 108またはm
  • 第二lのターン108 | 111であり、111又はo
  • へのoターン108 | \0、またはl

入力

  • 適切な形式の印刷可能なASCII文字のみで構成される文。
  • 文にはピリオド、スペース、およびその他の句読点を含めることができますが、1行のみです。
  • 文は少なくとも3文字の長さになります。

出力

  • 上記のルールに基づく結果の暗号は、文字列または出力として返されます。

ルール

  • 完全なプログラムまたは機能のいずれかが受け入れられます。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

1行で入力し、次で出力します。空白行は例を示します。

Hello
emmol

Hello, World!
emmol, ww~ved

PPCG
PSWG

Programming Puzzles and Code Golf
r wogsmmoonpuu ~ meannncoooeggonl

abcdefghijklmnopqrstuvwxyz
bcfefgnijknmno~qrsvuvw~yzz

!abcdefghijklmnopqrstuvwxyz
aaccgeggoikkomoo qsswuww yy

Test 123 with odd characters. R@*SKA0z8d862
euutu133www|todddchizsscguwssr`jS{SK{z~|v66

3
これは本当に暗号ですか?それを解読する方法ではないようです。
パイプ

最初の例のoが変更さlれていることを考えると、2番目の例の最初のo変更があなたの仕様によって確実に変更さlれないことを確信しています。に変更する必要'l' | ','があります。
グレッグマーティン

@pipeうん。本当に「暗号」ではありませんが、それを何と呼ぶべきか本当にわかりません。ハッシュでもありません。私たちが持っているタグのうち、「暗号」が最も近いように見えたので、それが私が行ったものです。
AdmBorkBork

はい@GregMartin、それはに行く'l' | ','となる、108 | 44 --> 1101111 | 0101100なる、108です、l,並ぶように起こるlので、バイナリまたはが行われたときには変化はありません。
AdmBorkBork

ああ、それは本当にバイナリORです...私はバイナリXORを考えていました。説明をありがとう。一方、これは、この「暗号」を実際に解読することはできないというパイプの観察結果にさらに語られています。
グレッグマーティン

回答:



4

Perl、63 62バイト

+4を含む -lp

STDINに入力する

oddeven.pl

#!/usr/bin/perl -lp
s%.%(--$|?$n|$':$&|(ord$&&1?$n:$'))&($n=$&,~v0)%eg;y;\x7f-\xff; ;

これは示されているように機能しますが、要求されたスコアを取得するには、これ最終行;および改行なしのファイルに配置し、\xhhエスケープをリテラル値で置き換える必要があります。これを行うには、上記のコードをファイルに入れて実行します:

perl -0pi -e 's/\\x(..)/chr hex $1/eg;s/;\n$//' oddeven.pl

3

Python 2、138 131バイト

s="\0%s\0"%input();r=''
for i in range(len(s)-2):L,M,R=map(ord,s[i:i+3]);a=i%2and[R,L][M%2]|M or L|R;r+=chr(a*(a<127)or 32)
print r

オンラインで試す(すべてのテストケースが含まれています

少ないゴルフ:

def f(s):
    s="\0%s\0"%s
    r=''
    for i in range(1,len(s)-1):
        if i%2: # even (parity is changed by adding \x00 to the front)
            a=ord(s[i-1]) | ord(s[i+1])
        else:   # odd
            a=ord(s[i])
            if a%2: # odd
                a|=ord(s[i-1])
            else:   # even
                a|=ord(s[i+1])
        r+=chr(a if a<127 else 32)
    print r

オンラインで試してみてください(未使用)

\x00文字列の両側に追加するので、ビット単位のor-ing中にそのことを心配する必要はありません。文字列の元の文字に沿ってループし、ビットごとの演算を行い、それらを結果に追加します。パリティの規則に従います。


ダン、私はそれを|=$a=$a-bor$b
je

@TimmyD実際には使用していませんでしたが、そうです。いいね。Pythonだけがa?b:cJS を好むなら。
mbomb007

if a%2:#odd a | = ord(s [i-1])else:#even a | = ord(s [i + 1])とa | = ord(s [i + 1- 2 *(a%2)])
NoSeatbelts

@NoSeatbeltsこれは私の読みやすいコードで、読みやすくするためにそのまま残されます。ゴルフの提出物はトッププログラムです。
mbomb007

2

C-101バイト

i,k;f(char*p){for(i=0;*p;++p,++i)putchar((k=i&1?*p&1?*p|p[-1]:*p|p[1]:i?p[-1]|p[1]:p[1])<127?k:' ');}

Cの文字列はnullで終わるため、文字列の最後の項目であるかどうかを確認する必要さえありません。

説明

むしろシンプル:

&1を使用して、奇数/偶数および三項式をテストし、if / elsesを置き換えます。char * pを増やして、必要な括弧の数を減らします。


いい答え-PPCGへようこそ!
AdmBorkBork

2

Mathematica、152バイト

FromCharacterCode[BitOr@@Which[OddQ@Max@#2,#~Drop~{2},OddQ@#[[2]],Most@#,True,Rest@#]/._?(#>126&)->32&~MapIndexed~Partition[ToCharacterCode@#,3,1,2,0]]&

説明

ToCharacterCode@#

文字列をASCIIコードに変換します

Partition[...,3,1,2,0]

ASCIIコードを長さ3、オフセット1パーティション、0が埋め込まれたパーティションに分割します。

...~MapIndexed~...

各パーティションに関数を適用します。

Which[...]

If...else if... elseMathematica

OddQ@Max@#2

インデックス(#2)が奇数かどうかを確認します。(Max平坦化用); Mathematicaインデックスは1から始まるので、OddQここではなく、EvenQ

Drop[#,{2}]

左右の隣人のASCIIコードを取得します。

OddQ@#[[2]]

対応する文字のASCIIコードが奇数かどうかを確認します。

Most@#

文字と左隣のASCIIコードを取得します。

Rest@#

文字と右隣のASCIIコードを取得します。

BitOr

適用または操作。

/._?(#>126&)->32

126より大きいすべての数値を32(スペース)に置き換えます。

FromCharacterCode

ASCIIコードを文字に変換し直し、それらを結合します。


PPCGへようこそ!Mathematicaに精通していない人(私のような)に少し説明を加えていただけますか?また、いくつかの提案については、Mathematicaでのゴルフのヒントを参照してください。滞在を楽しんで!
AdmBorkBork

1
いくつかの改善:実際の文字列オブジェクトの代わりに文字のリストを受け入れて返すことは完全に問題なく、それらのリストを大幅に節約します。From/ToCharacterCode機能をます。そうすると、Drop中置表記法を使用できるようになります:#~Drop~{2}。そして、あなたはBitOrすべての可能な出力に適用しているようですWhichので、後でそれを一度だけ適用しないのはなぜですか?
マーティンエンダー

2

ルビー133 128 108 106バイト

ジョーダンは私が20バイトを節約するのを助け、cia_ranaは私が2バイトを節約するのを助けました:)

->s{p s[-i=-1]+s.bytes.each_cons(3).map{|x,y,z|i+=1;a=i%2>0?x|z :y%2>0?y|x :y|z;a>126?' ':a.chr}*""+s[-2]}

s 入力文字列として取得されます。

次の出力例s="Test 123 with odd characters. R@*SKA0z8d862"

"euutu133www|todddchizsscguwssr`jS{SK{z~|v66"

説明

上記のコードは非常に読みにくいため、ここで説明します。コードは一種のハックです、私はrubyに新しくやめたので、これを行うためのより短い方法があると確信しています:)

b=s[1] # for the first character we always use the right neighbour
       # because `\0 | x` will always return x any way. 0 is the
       # left neighbour and x is the right neigbour
s.bytes.each_cons(3).with_index{|c,i| # oh boy, first we convert the string to ascii with each_byte
                                          # we then traverse the resulting array with three elements at
                                          # a time (so for example if s equals "Hello", c will be equal
                                          # to [72, 101, 108])
  if (i+1) % 2 < 1 # if the middle letter (which is considered our current letter) is even
    a = c[0] | c[2] # we use the result of binary-or of its neighbours
  else
    if c[1] % 2 > 0 # if the code of the current letter is odd
      a = c[1] | c[0] # we use the result of binary-or of itself and its left neighbour
    else
      a = c[1] | c[2] # we use the result of binary-or of itself and its right neighbour
    end
  end
  if a>126
    b<<' ' # if the result we use is greater or equal to 127 we use a space
  else
    b<<a.chr # convert the a ascii value back to a character
  end
}
p b+s[-2] # same as the first comment but now we know that x | \0 will always be x
          # this time x is the last characters left neighbour

入力もそうであるため、出力が1行である必要があることはかなり確信しています。
mbomb007

@ mbomb007残念、それから:pのprint代わりに使用する必要がありますp
ライナス

@TimmyDああ、私はそれを異なる時間に出力に印刷することはできませんか?
ライナス

@TimmyD OK、それで上記は許可されますか?今ではすべてを1行で印刷します。
リーナス

1
次のように記述できます->s{p s[-i=-1]+s.bytes.each_cons(3).map{|x,y,z|i+=1;a=i%2>0?x|z :y%2>0?y|x :y|z;a>126?' ':a.chr}*""+s[-2]}
。– cia_rana

1

J、42バイト

4:u:3({.OR{:)`((2|1&{){2:OR/\|.)\0,~0,3&u:

`infixなどの特定の副詞に動名詞を使用して、Jの動詞を交互に適用できるというプロパティを使用します\

使用法

   f =: 4:u:3({.OR{:)`((2|1&{){2:OR/\|.)\0,~0,3&u:
   f 'Hello'
emmol
   f 'Hello, World!'
emmol,ww~ved
   f 'PPCG'
PSWG
   f 'Programming Puzzles and Code Golf'
rwogsmmoonpuu~meannncoooeggonl
   f 'abcdefghijklmnopqrstuvwxyz'
bcfefgnijknmno~qrsvuvw~yzz
   f '!abcdefghijklmnopqrstuvwxyz'
aaccgeggoikkomooqsswuwwyy
   f 'Test 123 with odd characters. R@*SKA0z8d862'
euutu133www|todddchizsscguwssr`jS{SK{z~|v66

説明

4:u:3({.OR{:)`((2|1&{){2:OR/\|.)\0,~0,3&u:  Input: string S
                                      3&u:  Convert each char to an ordinal
                                    0,      Prepend 0
                                 0,~        Append 0
    3                           \           For each slice of size 3
     (      )`                                For the first slice (even-index)
          {:                                    Get the tail
      {.                                        Get the head
        OR                                      Bitwise OR the head and tail
             `(                )              For the second slice (odd-index)
                             |.                 Reverse the slice
                       2:   \                   For each pair
                         OR/                      Reduce using bitwise OR
                  1&{                           Get the middle value of the slice
                2|                              Take it modulo 2
                      {                         Index into the bitwise OR pairs and select
                                              Repeat cyclically for the remaining slices
4:u:                                        Convert each ordinal back to a char and return

1

JavaScriptの(ES6)、125の 118 114バイト

恥ずかしいほど長いですがcharCodeAt、それString.fromCharCodeだけで29バイトです。:-/

s=>[...s].map((_,i)=>String.fromCharCode((x=(C=i=>s.charCodeAt(i))((i-1)|1)|C(i+1-2*(C(i)&i&1)))>126?32:x)).join``

使い方

位置の各文字はi、すべてのルールを一度に網羅する次の式で変換されます。

C((i - 1) | 1) | C(i + 1 - 2 * (C(i) & i & 1))

where C(n)は、入力文字列のn番目の文字のASCIIコードを返します。

デモ

let f =
    
s=>[...s].map((_,i)=>String.fromCharCode((x=(C=i=>s.charCodeAt(i))((i-1)|1)|C(i+1-2*(C(i)&i&1)))>126?32:x)).join``

console.log(f("Hello"));
console.log(f("Hello, World!"));
console.log(f("PPCG"));
console.log(f("Programming Puzzles and Code Golf"));
console.log(f("abcdefghijklmnopqrstuvwxyz"));
console.log(f("!abcdefghijklmnopqrstuvwxyz"));
console.log(f("Test 123 with odd characters. R@*SKA0z8d862"));


1

PHP、107 97バイト

おそらくゴルフ可能。

for(;$i<strlen($s=$argv[1]);$i++)echo chr(ord($s[$i-1+$i%2])|ord($s[$i+1-2*($i&ord($s[$i])&1)]));

1

C#、145バイト

s=>{var r=s[1]+"";int i=1,l=s.Length,c;for(;i<l;i++){c=i>l-2?0:s[i+1];c=i%2<1?s[i-1]|c:s[i]|(s[i]%2>0?s[i-1]:c);r+=c>'~'?' ':(char)c;}return r;};

ungolfedメソッドとテストケースを含む完全なプログラム:

using System;

namespace ASCIIOddEvenCipher
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<string,string>f= s=>
            {
                var r = s[1] + "";
                int i = 1, l = s.Length, c;
                for(;i < l; i++)
                {
                    c = i>l-2 ? 0 : s[i+1];
                    c = i%2<1 ? s[i-1]|c : s[i]|(s[i]%2>0 ? s[i-1] : c);
                    r += c > '~' ? ' ' : (char)c;
                }
                return r;
            };

            //test cases:
            Console.WriteLine(f("Hello"));  //emmol
            Console.WriteLine(f("Hello, World!"));  //emmol, ww~ved
            Console.WriteLine(f("PPCG"));   //PSWG
            Console.WriteLine(f("Programming Puzzles and Code Golf"));  //r wogsmmoonpuu ~ meannncoooeggonl
            Console.WriteLine(f("abcdefghijklmnopqrstuvwxyz")); //bcfefgnijknmno~qrsvuvw~yzz
            Console.WriteLine(f("!abcdefghijklmnopqrstuvwxyz"));    //aaccgeggoikkomoo qsswuww yy
            Console.WriteLine(f("Test 123 with odd characters. R@*SKA0z8d862"));    //euutu133www|todddchizsscguwssr`jS{SK{z~|v66
        }
    }
}

これは思ったよりも長いことが判明しました...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.