拆分ASCII


33

给定ASCII加换行符的95个可打印字符,将其分成两个相等的48个字符组(以下称为A组和B组)。在两组之间创建您选择的一对一映射(您可以自行决定)。换句话说,如果这是程序所需要的,则A可能映射到a,反之亦然,但A也可能映射到>,反之亦然。

将ASCII分成两组后,分别使用每个组中的字符编写两个程序和/或函数。换句话说,编写一个仅使用组A中字符的程序/函数,编写另一个仅使用组B中字符的程序/函数。

这些程序必须能够接收一个字符作为输入。如果输入是A组字符,则用A组中的字符编写的程序应输出/返回相同的字符;如果输入是B组字符,则映射的A组字符应输出/返回相同的字符。组A程序应始终输出组A字符。同样,如果B组程序是B组字符,则应输出相同的字符;如果输入是A组字符,则应映射所映射的B组字符。

可能还不清楚,所以这里有个例子。如果假设所有大写字母都在A组中,所有小写字母都在B组中,并且已选择这些字母的一对一映射是从一个到另一个,则:那么这里有一些样本输入/输出:

程序A:

Input    Output
A        A
D        D
a        A
q        Q

程式B:

Input    Output
A        a
D        d
a        a
q        q

其他规则:

  • 这两个程序不需要使用相同的语言。
  • 它们不必同时是程序或函数。一个可以是程序,另一个可以是功能,没关系。
  • 他们不需要以相同的方式工作,具有相似的长度,诸如此类。他们必须完全符合上述其他规则。
  • 是的,您的程序中只有一个可以使用换行符,并且只有一个可以使用空格(可以是相同的程序,也可以是不同的程序)。
  • 您不需要在每个程序中全部使用48个字符。

正常情况下,禁止出现标准漏洞。所有程序都必须是自包含的,没有文件包含您选择的映射。

评分标准:。具体来说,两个程序的文本字节总和。

请像这样发布您的答案:

语言-#字节+语言-#字节=#字节

对您的映射的明确描述。如果很复杂,请使用如下图表:

ABCDEFGHIJKLMNOPQRSTUVWXYZ (etc.)
zyxwvutsrpqonmlkjihgfedcba (etc.)

或者,您也可以解释一下(前48个映射到后48个顺序),然​​后按常规回答。


我将尝试为两种语言使用相同的语言。:)
mbomb007'9

老实说,我认为您应该更改规则,将其限制为“两个程序必须使用相同的语言”。否则,它可能太简单/太宽泛了。
mbomb007'9

我实际上想知道在自我修改Brainfuck中这是否可能。您只需要使一个程序使用+>,而另一个程序使用-<。然后,您必须尝试生成缺少的运算符,例如a ,.无法使用它们的程序。
mbomb007'9

1
@Ruslan尝试使用SQL。它不区分大小写,并为代码块使用关键字(开头和结尾)。如果使用SQL Server 2014,则可以对一个程序使用DBCC批量插入,而对另一个程序使用一个过程。在第一个中,可以避免使用括号。然后对两个程序都使用select case when语句。另外,我相信在Java中,可以使用\ u技巧为程序将每个字符替换为unicode值,并对另一个不使用字母u,反斜杠或数字的函数使用函数。
bmark

4
最难的 挑战。曾经
Blackhole,2015年

Answers:


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”输入的第二个程序似乎未输出\ n ...程序或在线cjam中的错误?
Brian Tuck

@BrianTuck它确实输出换行符(不是文字\n),不检查html就不容易看到。您可以i在程序的末尾附加一个,以查看ASCII代码(或ci也可以处理换行符,因为在这种情况下,它输出的是换行符而不是字符)
aditsu

哦,否则您/我可能会更改_0=为,0=_以便始终输出一个字符
aiditsu

16

CJam - 46 44 26 11字节+ GolfScript - 142 125 115 93 68 47 40 36字节= 47个字节

感谢Peter Taylor在GolfScript程序上打了6个字节的高尔夫球(并为以后的工作铺平了道路。)

感谢Dennis在CJam程序中节省了15个字节,在GolfScript程序中节省了4个字节。

组A:所有字符均带偶数字符的字符。
B组:所有具有奇数字符代码的字符,加上换行符。

我在两者之间使用了明显的映射,即,将仅在最低有效位上不同的那些字符以及~和配对\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(通过按位OR则更短)。 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

(已过时,明天将更新。)

现在,该程序可以通过按位或与1来简单地将最低有效位设置为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字节

感谢@ durron597帮助从第一个程序获取1090字节的高尔夫。

证明可以用一种语言(以及非语言)来做。

使用unicode技巧将第一个转换为所有unicode字符。第二个使用反射来访问System.out以便打印到std。出来。它不能使用u,因为它是在第一个程序中使用的。我知道这可以打更多,但我想先发布一个有效的解决方案。

这些组是相当任意映射的,但基本上,第一个仅需要u,\和十六进制数字(在任何情况下)。

小组:

!#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');}

第二个程序:

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

我敢肯定有可能 我可以重命名一些变量,并用新行或新制表符替换所有空格。到家时我会做的。我只是想先证明一种语言解决方案。
bmark 2015年

5

固定!Pyth-23字节+ Pyth-30字节= 53字节

糟糕修复错误---请耐心等待

与Martin相同的ASCII拆分:

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

Prog#1:在线测试

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

Prog#2:在线测试

C?%KCwy1K?qy5Ky5?qy+1y31Ky5+1K
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.