准备多项选择测试


12

介绍

注意:这不是鼓励作弊的方法。正如C'O'Bʀɪᴇɴ所说的那样,学习是通过测试的最佳解决方案:3。

考虑对多项选择测试的以下答案:

ABCBCAAB

下表说明了答案是否匹配:

    A B C B C A A B

A   1 0 0 0 0 1 1 0
B   0 1 0 1 0 0 0 1
C   0 0 1 0 1 0 0 0

这给了我们以下数字:

10000110, 01010001, 00101000

挑战是打印这些二进制数字。但是,重要的是要查看在选择题测试中使用了哪些字母。例如:

ABCDCDBCDABC

这个最高字母字母表中D第4个字母。因此,我们需要输出4个不同的二进制数。即:

100000000100, 010000100010, 001010010001, 000101001000

请注意,您必须查看最高的字母。考虑以下示例:

AACCACAC

尽管B未使用,但我们需要输出的二进制结果B。这意味着答案将是:

11001010, 00000000, 00110101

任务

给定选择题测试的答案,输出二进制数。您可以假设输入将为非空且仅包含字母[A-Z] 。除了使用1和0,您还可以使用true和false。


测试用例:

Input: ABBBABABA
Output: 100010101, 011101010

Input: AAAAAAAAA
Output: 111111111

Input: AFGHEEHFD
Output: 100000000 000000000 000000000 000000001 000011000 010000010 001000000 000100100

Input: Z
Output: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1

Input: ABCDCDBCDABC
Output: 100000000100, 010000100010, 001010010001, 000101001000

这是,因此,字节数最少的提交将获胜!


我们可以[a-z]改用吗?
FryAmTheEggman'2

@FryAmTheEggman当然是:)
Adnan


没有指定输出的规则,是否允许使用2D布尔数组?
Eumel,2016年

似乎有点不合理,但对我也
有用

Answers:


3

Pyth,12个字节

mqLdzfsgRTzG

输出为布尔值的嵌套数组。

                Implicit: z=input
m               Map lambda d:
 qLdz            map equal-to-d over z
     f           over all letters T in the
           G     lowercase alphabet for which
      s           At least one char in z
       gRTz       >= T.

在这里尝试。


6

Python 3、71

由于Ogaday节省了22个字节。
DSM节省了3个字节。

多亏布尔数组有效,节省了很多字节。

*k,=map(ord,input())
x=65
while x<=max(k):print([v==x for v in k]);x+=1

接受大写命令行输入。


1
使用扩展的可*k,=map(ord,input())
重复

如果有帮助的话,现在也可以使用一系列的布尔值。
阿德南

3

PowerShell,95 94 73字节

param([char[]]$a)0..(($a|sort)[-1]-65)|%{$d=$_;-join($a|%{+!($_-$d-65)})}

将输入作为大写字符串,但立即将其强制转换[char[]]。然后,我们按字母顺序从循环0..到的最大值$a(因此从-65转换为ASCII)。例如,使用ADCEB,可以将其视为从A到的循环E

每次迭代时,我们都设置一个$d等于当前字母(非ASCII)值的辅助变量。然后,我们根据是真还是假(即,我们是否在正确的“插槽”中)$a,每次将一个0或多个1放置在管道上,从而遍历所有$_-$d-65。之所以可行,是因为PowerShell中的任何非零值都是真实的,这意味着如果我们当前的字母$_不“等于”我们所在的插槽$d,则其!值为$false0

然后将0s和1s的每个数组-join放在一起,然后放在管道上。当外部循环结束时,我们有一个字符串数组,每行将打印一个字符串。

例子

PS C:\Tools\Scripts\golfing> .\preparing-a-multiple-choice-test.ps1 ABCDEFGH
10000000
01000000
00100000
00010000
00001000
00000100
00000010
00000001

PS C:\Tools\Scripts\golfing> .\preparing-a-multiple-choice-test.ps1 AFGHEEHFD
100000000
000000000
000000000
000000001
000011000
010000010
001000000
000100100

编辑1-使用Boolean-not代替-eq保存一个字节
编辑2-通过消除多余的数组$ b保存另外21个字节


如果有帮助的话,现在也可以使用一系列的布尔值。
阿德南

3

LabVIEW,30 22 20 LabVIEW原语

从az开始直到所有布尔值的总和等于输入长度。然后将布尔值转换为数字。

现在直接取最大值而不是检查布尔值。

由于2D布尔现在是可行的,因此通过在前面输出绿线?1:0可以节省2个基元,但可以重做,但我太懒了...

新密码 旧代码


如果有帮助的话,现在也可以使用一系列的布尔值。
阿德南

2

Cjam,25个字节

l{'A-i}%_:e>),\f{f=", "}

叹,

说明

l{'A-i}%_:e>),\f{f=", "}
l                        e# get the input
 {'A-i}%                 e# get the normalized array
        _:e>             e# get the maximum value
            ),           e# create the array from 1..N
              \f{      } e# map over the created array
                 f=      e# 1 if match, 0 if not
                   ", "  e# add separator

恭喜1k rep BTW!
2016年

如果有帮助的话,现在也可以使用一系列的布尔值。
阿德南

2

Haskell,46 34字节

g x=(<$>x).(==)<$>['A'..maximum x]

用法示例:g "ACDC"-> [[True,False,False,False],[False,False,False,False],[False,True,False,True],[False,False,True,False]]

怎么运行的:

        <$>['A'..maximum x]   -- for every letter from A to the highest letter in x
<$>x                          -- loop over x and
      ==                      -- compare the letter with the current element in x
                              -- which results in a boolean          

2

Pyth,20 19 17 15 14字节

VhxGeSzmq@GNdz

说明:

               - autoassign z = input()
V              - For N in range(V)
 hxGeSz
    eSz        - max(z)
  xG           - lowercase_alphabet.index(^)
 h             - +1
       mq@GNdz
       m     z - [V for d in z]
         @GN   - lowercase_alphabet[N]
        q   d  - is_equal(^, ^^)
               - print "".join(^)

输出二维布尔数组

在这里尝试


2

ES6,92个字节

s=>[..."ABCDEFGHIJKLMNOPQRSTUVWXYZ"].map(c=>[...s].map(m=>m==c&&!!(l=n),n++),n=0).slice(0,l)

返回一个由false和true组成的数组。如果您希望使用零和一的字符串数组,则为97个字节:

s=>[..."ABCDEFGHIJKLMNOPQRSTUVWXYZ"].map(c=>s.replace(/./g,m=>m==c?(l=n,1):0,n++),n=0).slice(0,l)

2

八度,19字节

@(s)s==[65:max(s)]'

A在输入的max元素范围内使用Octave的自动广播,以生成匹配元素的2d布尔数组。

例:

Key = ABCDCDBCDABC

ans =

   1   0   0   0   0   0   0   0   0   1   0   0
   0   1   0   0   0   0   1   0   0   0   1   0
   0   0   1   0   1   0   0   1   0   0   0   1
   0   0   0   1   0   1   0   0   1   0   0   0

ideone上尝试一下。


1

Lua中,208个 189字节

像往常一样,在lua中这很棘手,我们必须从头开始做所有事情,而且它占据了很多位置!该程序将字符串作为参数,并打印出结果:)。

编辑:@Adnan告诉我,现在允许我们返回布尔矩阵,所以这是一个新版本!现在,它是一个使用大写字母字符串并返回矩阵:)的函数。

function f(x)a={}b={}for i=1,#x do a[i]=x:sub(i,i)end table.sort(a)for i=1,a[#a]:byte()-64 do b[i]={}end x:gsub(".",function(c)for i=1,#b do z=b[i]z[#z+1]=i+64==c:byte()end end)return b end

旧的208字节版本

这是处理参数和打印结果的方法。

a={}b={}x=arg[1]for i=1,#x do a[i]=x:sub(i,i)end table.sort(a)for i=1,a[#a]:byte()-64 do b[i]=""end x:gsub(".",function(c)for i=1,#b do b[i]=b[i]..(i+64==c:byte()and"1"or"0")end end)print(table.concat(b,","))

脱节和解释

function f(x)
a={}                   -- We need 2 arrays, and while b=a would have been shorter
b={}                   -- arrays in lua are passed by pointer, so it wouldn't have worked

for i=1,#x             -- iterate over the inpute to transform the string
do                     -- into an array
  a[i]=x:sub(i,i)      -- with each cells containing a characyer
end
table.sort(a)          -- sort the array/string

for i=1,               -- iterate n times were n is the place in the alphabet
       a[#a]:byte()-64 -- of the last element of the (sorted) array a
do
  b[i]={}              -- initialise cells in b up to n with empty arrays
end                    -- a cell's index is the position of a letter in the alphabet

x:gsub(".",function(c) -- for each character in the input
  for i=1,#b           -- iterate over each cells in b
  do
    z=b[i]             -- define z pointing on the array b[i]
    z[#z+1]=           -- insert into b[i] the result of the
       i+64==c:byte()  -- comparison of the current char, and the answer
  end
end)
return b
end

尝试在Lua中打印数组将导致打印其地址,并且无法连接布尔值。所以这是一个功能,如果您想测试此提交,将对您有所帮助

function f(x)a={}b={}for i=1,#x do a[i]=x:sub(i,i)end table.sort(a)for i=1,a[#a]:byte()-64 do b[i]={}end x:gsub(".",function(c)for i=1,#b do z=b[i]z[#z+1]=i+64==c:byte()end end)return b end

function printBooleanMatrix(m)
  s="{"
  for i=1,#m
  do
    s=s.."{"
    for j=1,#m[i]
    do
      s=s..(m[i][j]and"1"or"0")..(j==#m[i]and""or",")
    end
    s=s.."}"..(i==#m and""or",\n")
  end
  print(s.."}")
end

printBooleanMatrix(f("ABBCCDDC"))

如果有帮助的话,现在也可以使用一系列的布尔值。
阿德南

@Adnan很好,它允许我丢弃很多字节。我正在编写一个函数以提供清晰的输出以进行测试,然后发布修订版本:)
Katenkyo

1

Perl,84个字节

$\="\n";@i=split//,<>;pop@i;for$c('a'..(reverse sort@i)[0]){print map{/$c/?1:0}@i;}

哦,亲爱的,我好像荧光笔坏了。

非高尔夫版本:

# output formatting
$\ = "\n";
# get input chars as array
@i = split //, <>;
# lose the newline
pop @i;
# iterate over characters up to the max
for $c ('a'..(reverse sort @i)[0]) {
    # print 1 for each match, 0 otherwise
    print map { /$c/ ? 1 : 0 } @i;
}

1

PHP,106 92 90 87字节

使用Windows-1252编码。

for($x=A;$x++<=max($z=str_split($argv[1]));print~Ó)for(;$c=$z[+$$x++];)echo+(++$c==$x);

像这样运行(-d仅出于美观目的而添加):

php -d error_reporting=30709 -r 'for($x=A;$x++<=max($z=str_split($argv[1]));print~Ó)for(;$c=$z[+$$x++];)echo+(++$c==$x); echo"\n";' ABCDDHFHUYFSJGK
  • 通过嵌套循环以另一种方式节省了14个字节
  • 通过使用变量变量节省了2个字节 $i=0
  • 通过反转字符串和删除字符串定界符来保存字节
  • 通过在第一个for循环内移动回显(更改为适合打印)来保存字节,并放下花括号
  • 通过增加$x其他地方并增加$c补偿来节省字节

0

C#,68个字节

c=>Enumerable.Range(65,c.Max()-64).Select(x=>c.Select(y=>x==y?1:0));

在C#Pad中运行

此匿名函数将a char[]作为输入并输出一个IEnumerable<IEnumerable<int>>只有0和1的。


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.