Намалюйте цифрову діаграму часу XNOR


12

Нижче представлена ​​(схематична) цифрова діаграма синхронізації для логічного воріт XNOR .

    ┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐       
A ──┘ └─┘ └─┘     └─┘ └─┘ └─┘   └──
  ┌───┐ ┌───┐ ┌─┐ ┌─────┐   ┌─┐ ┌─┐ 
B ┘   └─┘   └─┘ └─┘     └───┘ └─┘ └
    ┌─────┐   ┌─┐   ┌─┐   ┌───┐   
X ──┘     └───┘ └───┘ └───┘   └────

Ваша мета - відтворити його саме так, як зображено.

Правила:

  • Ви можете його надрукувати або повернути рядок;

  • Дозволена довільна кількість відстежуючих та / або провідних нових рядків;

  • Дозволений пробіл (але не провідний!) Пробілів;

  • Якщо ви не можете використовувати розширені символи для малювання коробки ASCII, ви можете замінити їх на еквіваленти unicode (без байтового штрафу).

Це тому найкоротша відповідь у байтах виграє.

Бінарне представництво

Для вашої зручності двійкове представлення наведеної діаграми наступне:

INP A=0101011101010110
INP B=1101101011100101
  ___
X=A⊕B=0111001001001100

Вибірка зразка

введіть тут опис зображення

Sidenote

Працюючи над цим питанням, я реалізував два різних рішення bash для нього: одне - 122 символи / байти (як зображено вище), а інше - рівно 100 байт.

Я не маю планів розміщувати їх (як правило, не публікую відповіді на власні запитання), тому це лише для ознайомлення.

Я також вважаю, що можливі принаймні деякі суб-100-байтні рішення.


2
Це ворота XNOR, чи не так ...
clismique

@ Qwerp-Derp Yep, можливо, так і є :)
zeppelin

2
Замість того, щоб пропонувати (0 == 0) == 0, не буде B або X початок і кінець у 1?
Роман Чиборра

@Roman Czyborra Не впевнений, що я розумію ідею, чи могли б ви трохи розібратися в цьому?
цепелін

1
@zeppelin Подивіться прямо на початок шаблону - перші пару пікселів. A, B і X там все низько. Те ж саме і в кінці. Чому це так? (Я вважаю, це питання Романа).
isaacg

Відповіді:


5

05AB1E , 101 байт + 5 байт UTF-8 = 116 Всього байт = 106 байт

(ЛЕГАЦІЯ 05AB1E ВЕРСІЯ, БІЛЬШЕ ДЛЯ ТІО)

•=(Ín§Àoà`œ¯_eè8y1ÜŸ,Ú®:¹$:,õKA–x[Âì0ãXÔfz}y×ì¹Ï½uEÜ5äÀTë@ºQÈ™ñó:ò…Eä•6B"102345"" ┌─┐└┘"‡6ävyN" A B X"èì}»

Спробуйте в Інтернеті!

Стиснення:

•=(Ín§Àoà`œ¯_eè8y1ÜŸ,Ú®:¹$:,õKA–x[Âì0ãXÔfz}y×ì¹Ï½uEÜ5äÀTë@ºQÈ™ñó:ò…Eä• 
# Pattern, converted to base-6 in base-6=214.

111023102310222223102310231022231112251425142511111425142514251114221022231022231023102222231110231023151114251114251425111114222514251411102222231110231110231110222311111225111114222514222514222511142222
# Actual base-6 pattern.

1110231023102222231023102310222311
1225142514251111142514251425111422
1022231022231023102222231110231023
1511142511142514251111142225142514
1110222223111023111023111022231111
1225111114222514222514222511142222
#Pattern split into chunks of 34.

   ┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐  
 ──┘ └─┘ └─┘     └─┘ └─┘ └─┘   └──
 ┌───┐ ┌───┐ ┌─┐ ┌─────┐   ┌─┐ ┌─┐
 ┘   └─┘   └─┘ └─┘     └───┘ └─┘ └
   ┌─────┐   ┌─┐   ┌─┐   ┌───┐    
 ──┘     └───┘ └───┘ └───┘   └────
# Pattern after replacing 0,1,2,3,4,5 with appropriate blocks.

Конверсія:

6B                                   # Convert back to base-6.
  "102345"" ┌─┐└┘"‡                  # Replace numbers with appropriate counterparts.
                   6ä                # Split into 6 equal parts (the rows).
                     vy           }  # For each row (chunk).
                       N" A B X"èì   # Push label at index [i], prepend to line.
                                   » # Print all separated by newlines.

Використання кодування CP-1252 .


Для цілей цього виклику ви можете вважати кожен символ малювання коробки Unicode як лише 1 байт (див. "Правила"), тому відповідь відповідно до цього становить 106 байт. Обґрунтування полягає в тому, що ці символи unicode можна замінити на 1 байт символів, наприклад, у CP437 або IBM850, але вони можуть бути більш складними для відображення.
zeppelin

Я згоден із цепеліном. Зважаючи на концесію, надану в правилах, це було б 106 байт.
Річка Рівня Св.

Альтернативний метод, який працює лише в новій версії 05AB1E, використовуючи вбудований Åв(я також оновив накопичувач ASCII-art генератора з цим): 106 байт
Кевін Круїйсен

4

Bubblegum , 76 байт

00000000: 92d6 3000 5431 1505 1403 50e8 4e0a aafc  ..0.T1....P.N...
00000010: 9f62 15e6 a3ff 61fa dc05 e06d 8b66 cbc7  .b....a....m.f..
00000020: e6b6 cff8 519a b85a 3eb6 b67d 95c0 0feb  ....Q..Z>..}....
00000030: 35b5 521d 7f7e 68af a916 fa20 d999 564d  5.R..~h.... ..VM
00000040: 1f03 d559 59ed 265c f243 42be            ...YY.&\.CB.

Спробуйте в Інтернеті!

Використовує символи для малювання коробки з альтернативного набору символів VT100, який TIO не може продемонструвати. Запуск у терміналі UNIX для найкращих результатів. Мій термінал перетворює ACS в UTF-8 при копіюванні та вставці, тому ефект ви можете побачити тут.

anders@change-mode:/tmp$ bubblegum xnor.zlib
    ┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐
A ──┘ └─┘ └─┘     └─┘ └─┘ └─┘   └──
  ┌───┐ ┌───┐ ┌─┐ ┌─────┐   ┌─┐ ┌─┐
B ┘   └─┘   └─┘ └─┘     └───┘ └─┘ └
    ┌─────┐   ┌─┐   ┌─┐   ┌───┐
X ──┘     └───┘ └───┘ └───┘   └────
▒┼␍␊⎼⎽@␌␤▒┼±␊-└⎺␍␊:/├└⎻$ 

Що ж, виклик не сказав, що нам потрібно повернути термінал із режиму ACS перед поверненням до оболонки. Удачі в цьому.


3

Рубін, 113 байт

порахувавши друковані символи як один байт як дозволений викликом (я був здивований, виявивши, що вони насправді 3 байти.)

6.times{|i|s=' A B X'[i]
'D]zunIWkF]nIRukFH'.bytes{|b|s+='   ┌─┐───┘ └'[(b*2>>i/2*2&6)-i%2*6,2]}
s[1]=' '
puts s}

6 рядків виводу піддається кодуванню 6 біт на кожен символ магічної струни. Але символи чарівної струни фактично кодують для кожного переходу таким чином:

least significant bit 0 New value for A  
                      1 Current value for A
                      2 New value for B
                      3 Current value for B
                      4 New value for X
                      5 Current value for X
most significant bit  6 Always 1 (to remain in printable range)

Це розшифровується, щоб знайти два символи, які необхідно надрукувати для кожного переходу (перший з яких - або пробіл, або горизонтальна лінія.) Рядки з 8 символів для верхнього та нижнього рядків перекриваються: останні два символи для верхнього рядка 11- це дві горизонтальні лінії, які відповідають тому, що потрібно для перших двох символів нижнього ряду 00. 8 символів для нижнього ряду обгортають: це останні 6 та перші 2 символи рядка символів.

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

6.times{|i|s=' A B X'[i]               #iterate through 6 lines of output. Set s to the 1st character.
  'D]zunIWkF]nIRukFH'.bytes{|b|        #for each byte in the magic string
     s+='   ┌─┐───┘ └'[(b*2>>i/2*2&6)- #add 2 bytes to s, index 0,2,4, or 6 of the symbol string depending on relevant 2 bits of the magic string.
     i%2*6,2]                          #if the second (odd) row of a particular graph, modify index to -6,-4,-2, or 0 
  }                                    #(ruby indices wrap around. mystring[-1] is the last character of the string.)
  s[1]=' '                             #replace intitial ─ of the curve with space to be consistent with question
  puts s                               #output line
}

Це насправді 129 байт, 113 символів.
Чарівний Восьминіг Урна

1
@carusocomputing Я бачу, що ви зробили такий самий коментар до більшості відповідей тут. Будь ласка, зверніться до першого рядка мого андсера та до правила 4 ОП: Усі If you can not use the extended ASCII box-drawing characters, you may substitute them for the unicode equivalents (at no byte penalty)ми набрали відповіді за правилами.
Річка Рівня Св.

2

PowerShell, 255 символів, 265 байт (UTF-8)

$a='    012 012 0111112 012 012 01112
A 113 413 413     413 413 413   411
  01112 01112 012 0111112   012 012
B 3   413   413 413     41113 413 4
    0111112   012   012   01112
X 113     41113 41113 41113   41111'
0..4|%{$a=$a-replace$_,('┌─┐┘└'[$_])};$a

Це працює на моєму комп’ютері, але, схоже, неправильно розбирати байти в TIO ...

скріншот

Цей набір $aпредставляє собою багаторядковий рядок, заповнений цифрами та пробілами, а потім петлями 0..4|%{...}. Кожну ітерацію ми підбираємо -replaceвідповідною цифрою $_з відповідним символом '┌─┐┘└'[$_]і зберігаємо її назад у $a. Потім ми просто залишаємо $aна конвеєрі і вихід неявний.


Відповідно до виклику, ви можете вважати символи Unicode як одиничні байти
FlipTack,

2

JavaScript (ES6), 163 158 154 байт

Примітка: підрахунок символів UTF-8 як байти, як дозволено викликом.

_=>[..." A B X"].map((c,i)=>c+" "+[...Array(33)].map((_,j)=>j%2?" ─"[p^i&1]:" ┐┌─└┘ "[p+(p=[27370,42843,12878][i>>1]>>j/2&1)*2+i%2*3]).join``,p=0).join`
`

Демо

Збережено 4 байти завдяки Нілу


j%2?" ─"[p^i&1]:" ┐┌─└┘ "[p+(p=[27370,42843,12878][i>>1]>>j/2&1)*2+i%2*3]економить 3 байти.
Ніл

Ой, і зміни 17 на 33 теж.
Ніл

Ще раз 152 символи, 164 байти.
Чарівний восьминога Урна

2

C, 213 205 байт

Щодо зміни, розмір програми C на цей виклик не зовсім смішний порівняно з іншими мовами.

#define X(a) u[i]=C[a],l[i++]=C[(a)+4]
p(n,c){char u[34],l[34],*C=" ┐┌──└┘ ",i=0;while(i<34)X(n&3),n>>=1,X((n&1)*3);printf("  %.33s\n%c %.33s\n",u,c,l);}main(){p(0xD5D4,'A');p(0x14EB6,'B');p(0x649C,'X');}

Unololfed, визначте розширені та прокоментували:

p(n,c){
    // u is the upper line of the graph, l the lower line
    char u[34],l[34],*C=" ┐┌──└┘ ",i=0;
    while(i<34)
        u[i]=C[n&3],            // using the two LSBs to set the transition char depending on the current and next state
        l[i++]=C[(n&3)+4],      // do for both upper and lower lines
        n>>=1,                  // shift bits right to go to next state
        u[i]=C[(n&1)*3],        // using only the LSB to set the "steady" char depending on current state only
        l[i++]=C[((n&1)*3)+4];  // do for both upper and lower lines
    printf("  %.33s\n%c %.33s\n",u,c,l);
}
main() {
    // Call p for each graph
    // Constants are chosen so the display is consistent with the request.
    // Each bit represents a state, but the order is reversed
    // (leftmost is put on lowest significant bit, after a 0)
    p(0xD5D4,'A');p(0x14EB6,'B');p(0x649C,'X');
}

Примітка: рядок C не повинна містити символів unicode. Усі відображувані символи повинні бути простими старими 8-бітовими символами (але вони можуть бути обрані у розширеному діапазоні). Отже, в основному, валідність результату залежить від вашої кодової сторінки.


1

tcl, 221 символів, 299 байт

lmap {b _ n u A V} {"   " ┌─────┐ ┌───┐ └───┘ ┌─┐ └─┘} {puts "[set S \ $b][set m $A\ $A] $_ $m $n
A ──┘ [set w $V\ $V][set s \ $S]$w $V$b└──
  $n $n $A $_$b$m
B ┘$b$V$b$w$s$u $V └
$S$_$b$A$b$A$b$n
X ──┘$s$u $u $u$b└────"}

можна запустити на веб-сайті: http://rextester.com/live/VVQU99270


228 символів, однак це 306 байт.
Чарівний восьминога Урна

@carusocomputing: Який Інтернет-інструмент ви використовуєте для підрахунку байтів замість знаків? Ткс заздалегідь.
серхіол

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