ASCIIを分割する


33

ASCIIと改行で95の印刷可能文字が与えられた場合、それを2つの等しい48文字グループ(以降、グループAおよびグループBと呼びます)に分けます。2つのグループ間で、選択した 1対1のマッピングを作成します(完全な裁量権があります)。言い換えれば、Aにマッピングするかもしれないaし、その逆もまた同様で、しかしAまたにマッピングするかもしれない>それはあなたがあなたのプログラムのために必要なものだ場合、およびその逆。

ASCIIを2つのグループに分割したら、各グループの文字のみを使用して、それぞれ2つのプログラムや関数を作成します。つまり、グループAの文字のみを使用する1つのプログラム/関数と、グループBの文字のみを使用する別のプログラム/関数を作成します。

これらのプログラムは、入力として1文字を受信できる必要があります。グループAの文字で書かれたプログラムは、入力がグループAの文字である場合は同じ文字を出力/返す必要があり、グループBの文字を受け取った場合はマップされたグループAの文字を返します。グループAプログラムは常にグループA文字を出力する必要があります。同様に、グループBプログラムは、グループBの文字である場合は同じ文字を出力し、入力がグループAの文字である場合はマップされたグループBの文字を出力する必要があります。

それはそれほど明確ではないかもしれないので、ここに例を示します。すべての大文字がグループAにあり、すべての小文字がグループBにあり、これらの文字の1対1マッピングが1対1であると選択した場合、次のようになります。サンプル入出力:

プログラムA:

Input    Output
A        A
D        D
a        A
q        Q

プログラムB:

Input    Output
A        a
D        d
a        a
q        q

その他の規則:

  • 2つのプログラムは同じ言語である必要はありません。
  • 両方のプログラムまたは両方の機能である必要はありません。1つはプログラムであり、もう1つは関数である可能性があります。
  • それらは同じように機能する必要はなく、同じような長さである必要はありません。それらは上記の他のルールを満たしている必要があります。
  • はい、プログラムの1つだけが改行を使用でき、スペースを使用できるのは1つだけです(これは同じプログラムでも異なるプログラムでもかまいません)。
  • 各プログラムで48文字すべてを使用する必要はありません。

通常の標準的な抜け穴は禁止されています。すべてのプログラムは自己完結型である必要があり、選択したマッピングを含むファイルはありません。

採点基準:。具体的には、2つのプログラムのテキストのバイトの合計。

次のように回答を投稿してください。

言語-#バイト+言語-#バイト=#バイト

マッピングの明確な説明。複雑な場合は、次のようなチャートを使用します。

ABCDEFGHIJKLMNOPQRSTUVWXYZ (etc.)
zyxwvutsrpqonmlkjihgfedcba (etc.)

または、それを説明するだけで(最初の48個のマップから最後の48個のシーケンスに)、通常どおりに答えを続けることができます。


両方に同じ言語を使用してみます。:)
mbomb007

ルールを変更して、「両方のプログラムが同じ言語でなければならない」ように制限する必要があると正直に思います。それ以外の場合は、おそらく非常に簡単/広すぎます。
mbomb007

これは、自己修正ブレインファックでこれが可能かどうか実際に疑問に思います。1つのプログラムでand を使用+>、もう1つのプログラムでandを使用する必要が-あり<ます。次に、a ,.を使用できないプログラムなどで、欠落している演算子を生成する必要があります。
mbomb007

1
@Ruslan SQLを使用してみてください。大文字と小文字は区別されず、コードブロックにキーワード(beginとend)が使用されます。SQL Server 2014を使用する場合、1つのプログラムにDBCC一括挿入を使用し、もう1つのプログラムに手順を使用できます。最初のものでは、括弧の使用を避けることができます。次に、両方のプログラムに対してselect case whenステートメントを使用します。また、Javaでは、すべての文字をUnicode値に置き換えるプログラムに\ uトリックを使用し、文字u、バックスラッシュ、または数字を使用しない他の関数に関数を使用することで可能になると考えています。
bmarks

4
最も難しい。チャレンジ。今まで。
ブラックホール

回答:


6

CJam-11バイト+ CJam-25バイト= 36バイト

キャラクターは16の交互のグループで選択されます:

 !"#$%&'()*+,-./@ABCDEFGHIJKLMNO`abcdefghijklmno
0123456789:;<=>?PQRSTUVWXYZ[\]^_pqrstuvwxyz{|}~\n

いくつかのマッピングがShiftキーを使用して取得できるのは素晴らしいことです:)

プログラムA:

lL,H-f&'o+c

オンラインで試す

プログラムB:

q_S<\_0=16|_127<\S0=42^??

オンラインで試す

説明:

プログラムA:

l      read a line from the input, this is a 1-character string
        or the empty string if the input was a newline
L,     get the length of an empty string/array (0)
H-     subtract 17, obtaining -17 (~16)
f&     bitwise-"and" each character (based on the ASCII code) with -17
'o+    append the 'o' character
c      convert to (first) character
        the result is the "and"-ed character, or 'o' for newline

プログラムB:

q_       read the whole input and duplicate it
S<\      compare with " " and move the result before the input
_0=      duplicate the input again, and get the first (only) character
16|      bitwise-"or" with 16 (based on the ASCII code)
_127<    duplicate and compare (its ASCII code) with 127
\        move the result before the "or"-ed character
S0=      get the space character (first character of the space string)
42^      xor with 42, obtaining a newline character
          stack: (input<" ") (input) ("or"-ed char<127) ("or"-ed char) (newline)
?        if the "or"-ed character is less than 127, use the "or"-ed character
          else use the newline character
?        if the input was smaller than space (i.e. it was a newline),
          use the input, else use the character from the previous step

いいね!「偶数/奇数」だけが答えではないことを嬉しく思います。
durron597

それでも1ビットトグル...印象的なサイズ!「o」を入力した2番目のプログラムは、プログラムまたはオンラインcjamの\ n ...バグを出力しないようですか?
ブライアンタック

@BrianTuckは改行(リテラルではない)を出力します。htmlを検査しないと見にくい\nだけです。あなたは追加することができますi(またはその代わりにASCIIコードを表示するために、プログラムの終了時にci、それは改行文字列ではなく、その場合の文字を出力するので、また改行入力に対処するため)
aditsu

ああ、またはあなた/私は、変更される可能性_0=0=_、それは常に文字出力するように
aditsu

16

CJam - 46 44 26 11バイト+ GolfScript - 142 125 115 93 68 47 40 36バイト= 47のバイト

GolfScriptプログラムから6バイトのゴルフをしてくれたPeter Taylorに感謝します(さらに多くの道を開いてくれました)。

CJamプログラムから15バイト、GolfScriptプログラムから4バイトのゴルフをしてくれたDennisに感謝します。

グループA:文字コードが偶数のすべての文字。
グループB:奇数の文字コードを持つすべての文字と改行。

私は2つの間の明らかなマッピングを使用しています。つまり、と同様に、最下位ビットのみが異なる文字をペアに~\nます。完全なマップ(列)は次のとおりです。

 "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}\n

プログラムA(CJam、ここではそれをテスト):

lX~f&"~"|X<

プログラムB(GolfScript、ここテスト):

{1}'{-'{)}%'115)%11-[9)ie'9/{))}%++%

説明

プログラムA

(期限切れ、明日更新されます。)

このプログラムは、奇数文字コードを偶数文字コードに変換する必要があります。つまり、最下位ビットを0に設定します。これを行うための明らかな方法は、126(または254など) 1)代わりに、結果をデクリメントします。最後に、改行を手動で修正する必要があります。

"r"(  e# Push the string "r" and pull out the character.
(~    e# Decrement to q and eval to read input.
(     e# Pull out the character from the input string.
2(|(  e# (input OR (2-1))-1 == input AND 126
0$    e# Copy the result.
N&    e# Set intersection with a string containing a newline.
"~"   e# Push "~".
"@@"( e# Push "@@" and pull out one @.
(|    e# Decrement to ?, set union with the other string to give "@?".
~     e# Eval to select either the computed character or "~" if it was a newline.

プログラムB

(期限切れ、明日更新されます。)

このプログラムは、ビット単位のORで最下位ビットを1に設定することができます。ただし、\v(文字コード0x0B)と<DEL>(文字コード0xFF)の両方を手動で確認し、~代わりに設定する必要があります。GolfScriptでは、evalにアクセスできませんでしたが、代わりに、ブロックに文字列を追加することができます(その後、そのブロックのコードの一部になります)%

{1}    # Push this block without executing it.
'{--'  # Push this string.
{)}%   # Increment each character to get '|..'.
')1)7?=[11=+9)?ie'
       # Push another string...
7/     # Split it into chunks of 7: [')1)7?=[' '11=+9)?' 'ie']
{))}%  # For each chunk, split off the last character and increment it.
+      # Add the array to the string, flattening the array: '|..)1)7?=\11=+9)@if'
+      # Add it to the block: {1|..)1)7?=\11=+9)@if}
%      # Map the block onto the input, i.e. apply it to the single character.

そして、ブロック内で生成されたコードについては:

1|..   # Bitwise OR with 1, make two copies.
)1)7?= # Check if the result is one less than 2^7 == 128 (i.e. if it's <DEL>).
\11=   # Check with the other copy if it's equal to 11 (i.e. if it's \v).
+      # Add them to get something truthy either way.
9)     # Push a 10 (i.e. \n).
@      # Pull up the original value.
if     # Select the correct result.

15

Java-1088バイト+ Java-1144バイト= 2232バイト

最初のプログラムから1090バイトのゴルフを手伝ってくれた@ durron597に感謝します。

1つの言語(およびその場合は非エソラン言語)で実行できることの証明。

unicodeトリックを使用して、最初の文字をすべてのUnicode文字に変換します。2番目は、リフレクションを使用してSystem.outにアクセスし、stdに出力します。でる。最初のプログラムで使用されたため、uを使用できませんでした。私はこれがもっとゴルフできることを知っていますが、私は最初に有効な解決策を投稿したかったです。

グループはかなりarbitrarily意的にマッピングされますが、基本的に、最初のグループはu、\、および16進数字(いずれの場合も)のみを必要としました。

グループ:

!#7$&89'0123456>fB@UXZ\^AKCDEGH_JL`NOkQRxzVWYu~\n
 "%()*+,-./:;<=?FIMPST[]abcdeghijlmnopqrstvwy{|}

最初のプログラム:

\u0076\u006F\u0069\u0064
k\u0028\u0069\u006E\u0074
x\u0029\u007B\u0069\u006E\u0074\u005B\u005Du\u003D\u007B33\u002C33\u002C35\u002C35\u002C36\u002C55\u002C38\u002C39\u002C36\u002C38\u002C56\u002C57\u002C39\u002C48\u002C49\u002C50\u002C48\u002C49\u002C50\u002C51\u002C52\u002C53\u002C54\u002C55\u002C56\u002C57\u002C51\u002C52\u002C53\u002C54\u002C62\u002C62\u002C64\u002C65\u002C66\u002C67\u002C68\u002C69\u002C102\u002C71\u002C72\u002C66\u002C74\u002C75\u002C76\u002C64\u002C78\u002C79\u002C85\u002C81\u002C82\u002C88\u002C90\u002C85\u002C86\u002C87\u002C88\u002C89\u002C90\u002C92\u002C92\u002C94\u002C94\u002C95\u002C96\u002C65\u002C75\u002C67\u002C68\u002C69\u002C102\u002C71\u002C72\u002C95\u002C74\u002C107\u002C76\u002C96\u002C78\u002C79\u002C107\u002C81\u002C82\u002C120\u002C122\u002C117\u002C86\u002C87\u002C120\u002C89\u002C122\u002C117\u002C126\u002C10\u002C126\u007D\u003B\u0053\u0079\u0073\u0074\u0065\u006D\u002E\u006Fu\u0074\u002E\u0070\u0072\u0069\u006E\u0074\u0028x>10\u003F\u0028\u0063\u0068\u0061\u0072\u0029u\u005Bx\u002D32\u005D\u003A'\u005C\u006E'\u0029\u003B\u007D

に相当

void
k(int
x){int[]u={33,33,35,35,36,55,38,39,36,38,56,57,39,48,49,50,48,49,50,51,52,53,54,55,56,57,51,52,53,54,62,62,64,65,66,67,68,69,102,71,72,66,74,75,76,64,78,79,85,81,82,88,90,85,86,87,88,89,90,92,92,94,94,95,96,65,75,67,68,69,102,71,72,95,74,107,76,96,78,79,107,81,82,120,122,117,86,87,120,89,122,117,126,10,126};System.out.print(x>10?(char)u[x-32]:'\n');}

2番目のプログラム:

void n(int r)throws Throwable{int p=(int)Math.PI;int q=p/p;int t=p*p+q;int w=q+q;int[]g={t*p+w,t*p+w,t*p+q+p,t*p+q+p,t*(q+p),t*p+t-p,t*(q+p)+q,t*(q+p)+q+p,t*(q+p),t*(q+p)+q,t*(q+p)+w,t*(q+p)+p,t*(q+p)+q+p,t*(q+p)+p+w,t*(q+p)+p+p,t*(q+p)+t-p,t*(q+p)+p+w,t*(q+p)+p+p,t*(q+p)+t-p,t*(p+w)+t-w,t*(p+w)+t-q,t*(p+p),t*(p+p)+q,t*p+t-p,t*(q+p)+w,t*(q+p)+p,t*(p+w)+t-w,t*(p+w)+t-q,t*(p+p),t*(p+p)+q,t*(p+p)+p,t*(p+p)+p,t*(t-p)+t-p,t*(t-q)+t-p,t*(t-p)+p,t*(t-q)+t-q,t*t,t*t+q,t*(t-p),t*t+p,t*t+q+p,t*(t-p)+p,t*t+p+p,t*(t-q)+t-w,t*t+t-w,t*(t-p)+t-p,t*(t+q),t*(t+q)+q,t*(t-w),t*(t+q)+p,t*(t+q)+q+p,t*(t-w)+p,t*(t-w)+q+p,t*(t-w),t*(t+q)+t-w,t*(t+q)+t-q,t*(t-w)+p,t*(t+w)+q,t*(t-w)+q+p,t*(t-q)+q,t*(t-q)+q,t*(t-q)+p,t*(t-q)+p,t*t+p+w,t*t+t-q,t*(t-q)+t-p,t*(t-q)+t-w,t*(t-q)+t-q,t*t,t*t+q,t*(t-p),t*t+p,t*t+q+p,t*t+p+w,t*t+p+p,t*(t+q)+w,t*t+t-w,t*t+t-q,t*(t+q),t*(t+q)+q,t*(t+q)+w,t*(t+q)+p,t*(t+q)+q+p,t*(t+q)+p+w,t*(t+q)+p+p,t*(t+w)+p,t*(t+q)+t-w,t*(t+q)+t-q,t*(t+q)+p+w,t*(t+w)+q,t*(t+q)+p+p,t*(t+w)+p,t*(t+w)+q+p,t*(t+w)+p+w,t*(t+w)+q+p};java.io.PrintStream o=(java.io.PrintStream)System.class.getFields()[p/p].get(p);o.print((r<=t)?"}":(char)g[r-t*p-w]);}

ここで試してみてください:https : //ideone.com/Q3gqmQ


Unicodeエスケープする必要のない最初のプログラムから引き出すことができる文字はありませんか?いくつかの数字を引き出すことはできませんか?あなたがした場合void x(int z)、それらは最初の文字セットの文字でもある
-durron597

私はそれが可能だと確信しています。一部の変数の名前を変更し、すべてのスペースを新しい行またはタブに置き換えることができます。家に帰ったらそれをします。最初に単一言語ソリューションを証明したかっただけです。
bmarks

5

一定!Pyth-23バイト+ Pyth-30バイト= 53バイト

エラーを修正---しばらくお待ちください

Martinと同じASCII分割:

1: "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
2:!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}\n

プログラム#1:オンラインテスト

.xhft<zT.Dr\¡b:Z140 2\~

プログラム#2:オンラインテスト

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