객관식 시험 준비


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 개의 다른 이진수 를 출력해야 합니다. 즉:

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

@FryAmTheEggman 물론 :)
Adnan


지정된 출력에 대한 규칙이 없으며 부울의 2D 배열이 허용됩니까?
Eumel

그건 좀 비합리적이지만 저에게도 효과가 있습니다 ^^
Eumel

답변:


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

파이썬 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

그것이 도움이된다면, 부울 배열도 가능합니다.
Adnan

3

PowerShell, 95 94 73 바이트

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

입력을 대문자 문자열로 취하지 만 즉시 캐스트합니다 [char[]]. 그런 다음 알파벳 순 0..으로 $a취한 최대 값으로 루프합니다 (따라서 -65ASCII에서 변환). 예를 들어, 함께 ADCEB, 이것은에서 반복으로 간주 할 수 있습니다 AE.

반복 $d할 때마다 현재의 알파벳 (ASCII 아님) 값과 같은 도우미 변수를 설정 합니다. 그런 다음 진실 또는 거짓 여부 에 따라 (즉, 우리가 올바른 "슬롯" 에 있는지 여부에 따라) 파이프 라인 또는 파이프 라인에 $a배치 할 때마다 를 모두 반복 합니다 . 이 작품 PowerShell의 0이 아닌 값은 현재 문자가있는 경우 의미 truthy 때문에 우리가있어 어떤 슬롯 "동일"하지 않는 한 다음, 그이 , 또는 .01$_-$d-65$_$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--eq 대신 Boolean-not을 사용하여 바이트 저장
편집 2-추가 배열 $ b를 제거하여 다른 21 바이트 저장


그것이 도움이된다면, 부울 배열도 가능합니다.
Adnan

3

LabVIEW, 30 22 20 LabVIEW 프리미티브

모든 부울의 합이 입력 길이와 같아 질 때까지 az부터 진행합니다. 그런 다음 부울을 숫자로 변환합니다.

이제 부울 합계를 확인하는 대신 최대 값을 직접 가져옵니다.

2D 부울이 실행 가능하기 때문에 이제 녹색 와이어를 출력하여 ?1:0다시 만들 수는 있지만 너무 게으르다.

새로운 코드 오래된 코드


그것이 도움이된다면, 부울 배열도 가능합니다.
Adnan

2

잼, 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 담당자 BTW 축하합니다!
Blue

그것이 도움이된다면, 부울 배열도 가능합니다.
Adnan

2

하스켈, 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)

거짓과 참으로 구성된 배열을 반환합니다. 0과 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에서 옥타브의 자동 방송을 입력의 최대 요소로 사용하여 일치하는 요소의 2 차원 부울 배열을 생성합니다.

예:

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

루아, 208 189 바이트

루아에서는 까다로웠다. 평소와 같이, 우리는 모든 것을 처음부터 시작해야하고, 많은 장소를 차지한다! 이 프로그램은 문자열을 인수로 받아서 결과를 출력합니다 :).

편집 : @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

@Adnan 글쎄, 그것은 많은 바이트를 버릴 수있게 해줍니다. 테스트 목적으로 명확한 결과물을 출력하고 수정 된 버전을 게시하는 함수를 작성 중입니다.
Katenkyo

1

펄, 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[]입력을 받아 IEnumerable<IEnumerable<int>>0과 1만으로를 출력합니다 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.