多肢選択式テストの準備


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

課題は、これらの2進数を印刷することです。ただし、複数選択テストでどの文字が使用されているかを確認することが重要です。例えば:

ABCDCDBCDABC

この最高文字Dアルファベットの4番目の文字です。したがって、4つの異なる 2進数を出力する必要があります。すなわち:

100000000100, 010000100010, 001010010001, 000101001000

最高の文字を見なければならないことに注意してください。次の例を考えてみましょう。

AACCACAC

Bは使用されませんが、のバイナリ結果を出力する必要がありますB。つまり、答えは次のようになります。

11001010, 00000000, 00110101

仕事

多肢選択式テストの回答が得られたら、2進数を出力します。入力は空ではなく、文字のみを含むと想定でき[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

@FryAmTheEggmanもちろん:)
アドナン


指定された出力に関するルールはありません。boolの2D配列は許可されていますか?
ユーメル

それはちょっと不合理に思えますが、私にとってもうまくいきます^^
ユーメル

回答:


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バイト節約されました。

boolの配列が有効なため、大量のバイトを節約できました。

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

大文字のコマンドライン入力を取ります。


1
使用して、反復可能な解凍を拡張*k,=map(ord,input())
Ogaday

boolsの配列も使用できるようになりました。
アドナン

3

PowerShell、95 94 73バイト

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

入力を大文字の文字列として受け取りますが、すぐにキャストし[char[]]ます。次に、アルファベット順の0..最大値までループし$aます(したがって、-65ASCIIから変換します)。たとえば、でADCEB、これはからAにループすると考えることができますE

繰り返しごと$dに、現在のアルファベット(ASCIIではない)値に等しいヘルパー変数を設定します。私たちのすべてを、ループ$a、それぞれの時間はどちらか置く01かどうかに基づいて、パイプラインに$_-$d-65truthyまたはfalsey(すなわち、我々は右の「スロット」にいるかどうか)です。これが機能するのは、PowerShellのゼロ以外の値はすべて真実であるためです。つまり、現在の文字$_が現在のスロットと「等しくない」場合$d、そのスロット!$false、または0です。

0sと1sのこれらの配列はそれぞれ-join一緒にedされ、パイプラインに再配置されます。外側のループが終了すると、文字列の配列が作成され、1行に1つの文字列が出力されます。

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--eqの代わりにBoolean-notを使用してバイトを保存
編集2-余分な配列$ bを削除してさらに21バイトを保存


boolsの配列も使用できるようになりました。
アドナン

3

LabVIEW、30 22 20 LabVIEWプリミティブ

すべてのブール値の合計が入力長さに等しくなるまで、azから順に進みます。その後、ブールを数値に変換します。

bool sumをチェックする代わりに、maxを直接取得するようになりました。

2D boolsは実行可能であるため、緑色のワイヤを出力することで2つのプリミティブを節約?1:0できます。

新しいコード 古いコード


boolsの配列も使用できるようになりました。
アドナン

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おめでとうございます!
ブルー

boolsの配列も使用できるようになりました。
アドナン

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(^)

ブールの2D配列を出力します

ここで試してみてください


2

ES6、92バイト

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

falseとtrueの配列の配列を返します。ゼロと1の文字列の配列が必要な場合、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で配列を印刷しようとすると、そのアドレスが印刷され、boolを連結することはできません。そのため、この投稿をテストする場合に役立つ関数があります

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"))

boolsの配列も使用できるようになりました。
アドナン

@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#パッドで実行

この無名関数は、char[]入力としてa を受け取り、IEnumerable<IEnumerable<int>>0と1のみのを出力します。


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