Підготовка тесту з кращим вибором


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] . Замість одиниць та нулів ви можете також використовувати істинне та хибне.


Тестові приклади:

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 Звичайно :)
Аднан


не вказано правил для виводу, чи дозволений двовимірний масив булів?
Евмель

це видається нерозумним, але працює і для мене ^^
Евмель

Відповіді:


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

Збережено 22 байти завдяки Огадаю.
Збережено 3 байти завдяки DSM.

Збережено купу байтів завдяки дійсній масі bools.

*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

Масив булів тепер також можливий, якщо це допомагає.
Аднан

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це truthy чи falsey (тобто, чи ми в правильному "прорізі"). Це працює, тому що будь-яке ненульове значення в PowerShell є правдоподібним, тобто якщо наш поточний лист $_не "дорівнює" тому, у якому слоті ми знаходимось $d, тоді !це є $false, або 0.

Кожен з цих масивів 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
Edit 2 - збережено ще 21 байт, усунувши зайвий масив $ b


Масив булів тепер також можливий, якщо це допомагає.
Аднан

3

LabVIEW, 30 22 20 Примітиви LabVIEW

Проходить через az, поки сума всіх пулів не дорівнює вхідній довжині. потім Перетворять булі на числа.

Тепер безпосередньо беремо макс замість перевірки суми bool.

Оскільки 2D буліни є життєздатними, тепер я економлять 2 примітиви, вивівши зелений дріт навпроти, ?1:0можна переробити його, але я занадто ледачий ...

новий код старий код


Масив булів тепер також можливий, якщо це допомагає.
Аднан

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

Поздравляємо на 1 кр. BTW!
Синій

Масив булів тепер також можливий, якщо це допомагає.
Аднан

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 масив bools

Спробуйте тут


2

ES6, 92 байти

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

Повертає масив масивів помилок і прав. Якщо ви віддаєте перевагу масиву рядків нулів і одиниць, то для 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)]'

Використовує автоматичне мовлення Octave в межах діапазону Aдо максимального елемента на вході для отримання 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

Луа, 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 добре, це дозволяє мені скидати багато байтів. Я пишу функцію, щоб мати чіткий результат для тестування, а потім розміщую переглянуту версію :)
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
  • Збережено байт шляхом інвертування рядка та відкидання роздільників рядків
  • Збережено байт, перемістивши відлуння (змінено на друк, щоб він підходив) всередині першого для циклу та скидання фігурних дужок
  • Збережено байт, збільшуючи $xдесь інше, і збільшуючи $cкомпенсацію


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.