数字符-点点滴滴!


19

简单的部分:给定仅包含可打印ASCII字符(空格-波浪号)的输入字符串,计算每个字符的出现次数并以任何方便的格式返回结果。字符串的结果a%hda7a应类似于:a:3, %:1, h:1, 7:1, d:1。排序是不必要的,定界符和格式是可选的,但必须易于理解哪个数字对应哪个字符。输入的字符串中不得包含字符(a:3, b:0, c:0, d:1, ...不正确)。

真正的挑战:

将代码中的每个字符转换为8位二进制数(如果使用的是UTF-16或类似格式,则转换为16位),并枚举每个字符0

对于每个字符(i是枚举数),- i%7bit 1 必须1。这些位从右开始编号。其他所有位都可以是您想要的。

让我们以以下代码为例:

[f]-xif)#f

将其转换为二进制,我们得到下面的数组。第一个数字(表示[1在第0位置,这样一方面是OK。第二个数字(表示f1在第1'位置,所以,一个是OK了。继续这样下去,你会看到上面的代码是有效的。

C 76543210位号
--------- ----------
[0101101 1   0-确定
f 011001 1 0 1-确定
] 01011 1 01 2-确定
-0010 1 101 3-好
x 011 1 1000 4-好
i 01 1 01001 5-好
f 0 1 100110 6-确定
)0010100 1   0-确定
#001000 1 1 1-确定
f 01100 1 10 2-确定

如果将代码更改为:]f[-xif)#f我们将获得以下序列的开始:

C  76543210  Bit number
-  --------  ----------
]  01011101  0   <- OK
f  01100110  1   <- OK
[  01011011  2   <- Not OK
-  00101101  3   <- OK

如我们所见,第三个字符在第二个位置[没有字符1(零索引),因此此代码无效。

测试用例:

Input:
This is a string containing some symbols: ".#!".#&/#

Output:
   !  "  #  &  /  :  T  a  b  c  e  g  h  i  l  m  n  o  r  s  t  y  .
7  1  2  3  1  1  1  1  2  1  1  1  2  1  5  1  2  4  3  1  6  2  1  2

任何合理的输出格式都可以(最方便的方式)。例如,您可以拥有::7, !:1, ":2, #:3, &:1, /:1, T:1, a:2 ...[ ,7][!,1][",2][#,3][&,1]...。以任何标准方式输出(从功能返回,打印到STDOUT等)

1i模数7


这是,因此以字节为单位的最短代码将赢得ref


6
需要帮助的是,这是您可以在第二n%7个位置使用的字符> pastie.org/pastes/10985263/text
TidB

@TidB网站离线?
Rod 2013年

1
@Rod是的,馅饼似乎有一些问题。尝试使用pastebin
TidB

1
请记住,换行符是00001010。它也可能有用!:)
Stewie Griffin

1
为了提供更多帮助,以下一个验证脚本,您可以将其用于UTF-8编码。像示例一样,只需将输入封装在字符串中即可。
AdmBorkBork

Answers:


6

Pyke,1个 6字节

1cn;1c

在这里尝试!

1c     - chunk(size=1, input)
  n;1  - noop. 
     c - count(^)

此代码的一半只是禁止操作...

00110001 - 1
01100011 - c
01101110 - n
00111011 - ;
00110001 - 1
01100011 - c

@EriktheOutgolfer有一个有效的点。我认为此输入格式无效,除非这实际上是Pyke中的常规字符串。自以来在MATLAB / Octave中将是有效的输入字符串'abc'==['a','b','c'],因此也可能在Pyke中...?
Stewie Griffin

@StewieGriffin这不是Pyke通常处理字符串的方式。如果那还不行,我可以看到有关切换输入格式的信息,但由于字符列表在默认值的接受列表下,尽管这可能算作作弊了
Blue

5
很抱歉用1个字节的内置密码打破了挑战,我认为您实际上并不感到抱歉,而且挑战也没有因此而被打破:-)
Luis Mendo

2
这不是字符列表;这是一个字符串列表。字符列表位于+ 17 / -0处,而字符串列表位于+ 2 / -2处,因此几乎不接受默认值。@StewieGriffin应该确定其是否有效。
丹尼斯

1
@StewieGriffin更好吗?
2016年

6

Pyth,12 8 7字节

-1个字节感谢@Loovjo

m+d/Qd{
      { # remove all duplicated elements from the (implicit) input
m       # map each element (d) of the parameter (the set from previous operation)
   /Qd  # count the occurrences of d in Q
 +d     # concatenate with d

二进制表示

0110110 1 m
001010 1 1 +
01100 1 00 d
0010 1 111 /
010 1 0001 Q
01 1 00100 d
0 1 111011 {

试试这里


真好!:)输出13111看起来很奇怪,但它不能被误解(不能有任何单个字符13这是使用1次),所以这是完全有效的!
Stewie Griffin

4

Befunge-93,150字节

={<{p+}3/}*77\%*7{7:\+{}{1g}+3/*77\%*7{7:}=:_{}{}={}{}{v#{}{}`x1:~
}-}=*}{2*}97}:<$}={$_v#}!:-*84g+3/*77\%*7{7:}=:}:}+}1{}<_{@#
}{}{}={}{}{}={^.},\={<

在线尝试!

我首先将其编写为常规的Befunge程序,并尽可能打高尔夫球。然后,我添加了填充以确保程序中的各个字符仅出现在允许的位置。这种填充依赖于这样一个事实,即Befunge-93中不支持的命令将被忽略,因此我只需要一个未使用的字符序列,其位与所需位置对齐(我使用的序列是={}{}{})。

复杂的一点是,线之间的各个分支需要正确对齐(例如,v一行中的箭头需要与<它下方的箭头对齐)。桥命令(#)无法与其相邻的分支箭头分开的事实使情况更加复杂。最初,我尝试以编程方式生成填充,但最终,这主要是手动过程。

由于程序的大小,我将不列出完整的字符分析,但这是从头到尾的示例:

= 00111101 0
{ 01111011 1
< 00111100 2
{ 01111011 3
p 01110000 4
+ 00101011 5
} 01111101 6
3 00110011 0
/ 00101111 1
...
{ 01111011 1
^ 01011110 2
. 00101110 3
} 01111101 4
, 00101100 5
\ 01011100 6
= 00111101 0
{ 01111011 1
< 00111100 2

换行符被视为换行符,因此将位于位置1或3。


3

MATL,17个字节

u"G91x@=zD91x@uRD

显示计数,然后显示所有换行符分隔的对应字符。最大的困难是@什么0b01000000; 我希望我能找到一种方法来摆脱它。

在线尝试!

说明:

u"  % Implicit input. Take (u)nique characters and loop (") over them.
G   % Take the input a(G)ain
91x % Filler: push 91, delete immediately.
@   % Push current character of loop
=   % Check for equality with earlier G
z   % Count number of equal characters
D   % Display
91x % More filler!
@   % Get loop character again
uR  % Filler: two NOPs for the single-character @
D   % Display. Implicitly end loop.

MATL,15个字节(可疑输出)

如果只允许在堆栈上保留两个行向量(根据 Meta帖子,类似函数的行为),我们可以得出以下结论:

u"G91x@=zv]v!Gu

但是在这里,输出不是很整齐。


堆栈隐式地打印在程序的末尾,并且输出格式可以灵活地应对挑战,因此我看不到第二种方法有任何问题
Luis Mendo 2016年

@LuisMendo我不确定。如果您有90个不同的输入字符,那么将很难分辨出哪个键属于哪个字符,因此我想我必须对那个Sanchises说不。– 2个小时前的Stewie Griffin是对提议的混合动力的答复(在程序末尾单独计数D'd Gu),我不确定15字节版本是否足够不同。
桑契斯

@StewieGriffin您能否查看15字节版本(在线尝试!)是否正确?
桑契斯

不知道Stewie会在这篇文章中得到解答,请更好地使用挑战文章
Luis Mendo

不了解您,但是我认为这里容易理解:)我更喜欢17字节的解决方案,但也可以在答案中保留15字节的一个!顺便说一句好答案:)
Stewie Griffin

1

CJam,14个字节

q__|_ @sfe=]zp

在这里尝试。

在它之前@s之后的空格是填充字符,以使ASCII代码适合所需的模式:该空格不执行任何操作,而sjust将字符串转换为字符串。除此之外,这是挑战任务的非常简单明了的实现:

q_“读取输入并复制输入”;
  _ | “折叠副本中重复的字符”;
    _“保存折叠后的字符串的副本”;
      @“将原始输入字符串拉到堆栈顶部”;
       s“(此处不执行任何操作)”;
        fe =“对折叠后的字符串中的每个字符,计数...”;
                 “ ...它在原始字符串中出现的次数”;
           ] z“将计数与折叠后的字符串的已保存副本配对”;
             p“打印结果的字符串表示形式”;

对于输入foobar123,此代码输出[['f 1] ['o 2] ['b 1] ['a 1] ['r 1] ['1 2] ['2 2] ['3 1]]。如果仅在一行上打印计数,而在另一行上打印相应的字符,则如下所示:

[1 2 1 1 1 2 2 1]
fobar123

被视为可接受的输出格式,则]z可以省略,以节省两个字节,总共12个字节。是的,缩短的代码仍将通过位模式要求。

附言 我还针对此挑战编写了一个简单的源代码检查器。给定一行代码作为输入,它将首先回显该行,然后打印同一行,每个字符都被其第(n%7)个ASCII位替换。如果第二行全为1,则输入有效。


1

果冻,果冻代码页中的6个字节

ṢZṢṀŒr

在线尝试!

此函数返回(字符,计数)对的列表。(果冻通过连接元素将这样的列表表示为文本,例如,如果它们被发送到标准输出,这就是为什么您必须将其视为函数而不是完整的程序。(这是在同一程序中附加了一些代码)调用该函数,然后将内部结构打印到标准输出,以证明该输出的格式明确。)

二进制表示和解释:

  76543210 

Ṣ1011011 1    对输入的字符进行排序
Z 010110 1 0转置列表(它是1D,因此可以有效地将其包装在列表中)110 
10110 1 11对列表进行排序(无操作,因为它只有一个元素)
Ṁ1100 1 000采用最大(即唯一)元素
Œ000 1 0011两字节命令的第一个字节
r 01 1 10010游程编码

可以看出,第二,第三和第四个字符相互抵消,并且仅在那儿维持我们需要的位模式。Œr不过,这样做太方便了,对程序进行填充以使我们可以使用它,这比尝试在没有内置功能的情况下解决问题的程序更短。

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.