Емуляція 7-сегментного дисплея


24

Завдання

Завдання - відобразити будь-яке із 128 можливих станів 7-сегментного дисплея .

Ваша програма повинна прийняти рядок із 7 символів ("біт"), які є 0або 1. Перший біт вводу відповідає сегменту A наступної ілюстрації, другий - B тощо (ігнорує dp):

7сег

Як ви представляєте дисплей, залежить від вас - одного символу Unicode або ASCII, ASCII мистецтва , в принципі, або будь-якого іншого, що ви можете придумати. Однак кожен вхід повинен мати власний чіткий вихід. Якщо ви придумали щось фантазійне, я впевнений, що зможете отримати уроки, показавши кілька прикладів.

Усі 128 можливих станів дисплея:

держав

Правила

  • Кодегольф
  • Як я вже говорив, будь-який вихід дозволений, але було б добре, якби ви його вказали.
  • Введенням може бути аргумент stdin або аргумент командного рядка.

Приклади

Вхідні дані

1101101

Вихідні дані

Як ASCII / Unicode:
2
Різні види мистецтва ASCII (я не надто хороший у цьому)
 _   ╺┓  ╒╗   ---
 _|  ┏┛  ╔╝     |
|_   ┗╸  ╚╛   ---
              |
              ---

Тісно пов'язані з codegolf.stackexchange.com/questions/997/… ?
DavidC

@DavidCarraher: Вони пов'язані, так; Я навіть сам з цим пов’язаний. Однак сказати це дещо складніше, оскільки у вас є ще 118 «цифр» для створення. Більшість (?) Відповідей на інше питання не працюватиме тут, або доведеться сильно переписати. Крім того, тут вам не потрібно кодувати різні числа, тому інші оптимізації повинні бути можливими.
daniero

Ви праві. Дякуємо, що вказали на це.
DavidC

це вимога, що ми використовуємо кодування, яке ви надали? наприклад, "1101101" завжди повинен представляти "2"?
ardnew

@ardnew: так. Положення бітів, що вводяться, повинно відображати в алфавітному порядку сегменти від A до G на першому малюнку.
daniero

Відповіді:


5

J (51)

1 2 1#"1[5 3$' #'{~,|:>0;(88707#:~7#7){>".&.>1!:1[1

вихід:

1101101
 ## 
   #
 ## 
#   
 ## 

1
Це може бути поголені до 38 напівкоксу з невеликим зусиллям: 1 2 1#"1' #'{~5 3$,0,.502 A.".&>1!:1]1.
Алгоритм

16

С, 106

Розмір - 74 символи, якщо дозволяється перейменувати програму "W00WG5WW1GW66WG4WW2GW33WG"

main(int i,char**s){
    for(s[0]="W00WG5WW1GW66WG4WW2GW33WG";i=*s[0]++;putchar(s[1][i&7]-49?i==71?10:32:42));
}

працює:

./a.out 1101101
 ** 
   *
 ** 
*   
 ** 

примітки:

'W' і 'G' (0x47 та 0x57) вибираються такими, що значення & 7 = 7, тобто вони безпечно індексують нульовий символ, який закінчує вхідний рядок.


15

Brainfuck - 224

++++++++++[>+>+++<<-]
>>++>,>,>,>,>,>,>,
<<<<<<<.
>[<+.->-]<<.
>>
>>>>>[<<<<<+<+>>>>>>-]<<<<<<.>[<->-]<.>>[<<+.->>-]<<<.>.
>>>>>>>[<<<<<<<+.->>>>>>>-]<<<<<<<<.
>>>>>>[<<<<+<+>>>>>-]<<<<<.>[<->-]<.
>>>[<<<+.->>>-]<<<<.>.
>>>>[<<<<+.>]

Друкує за допомогою знаків оклику:

 ! 
! !
 !
! !
 !

Не найчитабельніший, але теж не дуже жахливий.

Здивований тим, наскільки близько це, аби не останнє місце.


13

Постскрипт 121 107

1 12 moveto{}5 0{0 -5 rmoveto}0 5 0 5 -5 0 0 -5 0 -5 5 0
n{49 eq{rlineto}{rmoveto}ifelse exec}forall stroke

потрібно nвизначати як рядок, який обробляється так, як викликати

gs -g7x14 -sn=1101101 lcd.ps

отримати

image of number two

повний набір є

complete set of characters


11

Mathematica: 135 129 118, відображення зображення

Image[MorphologicalComponents@Import@"http://goo.gl/j3elE" /. 
      Thread[Range@7 -> IntegerDigits[#, 2, 7][[{7, 2, 6, 1, 3, 5, 4}]]]] &

пробіли додано "для ясності"

enter image description here

Редагувати

Для тих вибагливих користувачів сайту: Без використання зовнішньої маски:

Image[MorphologicalComponents[ColorNegate@Rasterize@8, CornerNeighbors -> False] /. 
    Thread[Range@7 ->IntegerDigits[#, 2, 7][[{7, 2, 6, 1, 3, 5, 4}]]]] &

Код видається неповним. Я не думаю, що ви хотіли, щоб ваша програма припинилась &.
DavidC

@DavidCarraher Це функція , тому вона закінчується &.
Доктор Белісарій

Так, але це ні до чого не застосовується. Як можна отримати вихід?
DavidC

2
@belisarius Мені все ще не подобається те, що ви вставляєте зовнішні ресурси.
FUZxxl

1
Я думаю, що не має сенсу видаляти мій попередній коментар, оскільки це значно ускладнить комусь іншому слідкувати за цією дискусією. Ви імпортуєте зовнішні дані, що смішно як жарт, але не є частиною серйозної відповіді на гольф коду. -1
FUZxxl

10

АПЛ, 58 55

' _|'[1+3 3⍴0,x[1],0,(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3]]

Приклад введення:

1101101

Вихід:

 _ 
 _|
|_ 

⍞='1' приймає вхід як символьний масив і перетворює його в числовий масив.

1 2 2 1 2 2 1×⍞='1'перетворює цей масив у: 0для порожнього, 1для _, 2для|

(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3]призначити цей масив змінній xта упорядкувати, щоб представити сегменти F, G, B, E, D, C

0,x[1],0,(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3] об'єднує пробіл, відрізок А та інший бланк спереду

3 3⍴0,x[1],0,(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3] переформатуйте до матриці 3x3

1+3 3⍴0,x[1],0,(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3] перетворює на індексацію на основі 1

Нарешті використовується рядок ' _|'для перетворення індексів у символи


Редагувати

' _|'[1+3 3⍴(0,1 2 2 1 2 2 1×⍞='1')[1 2 1 7 8 3 6 5 4]]

Поголили 3 символи, об'єднавши a 0у фронт масиву та використовуючи повторювані показники, запобігаючи присвоєнню змінної


Якщо ваша APL підтримує це, я думаю, що функція from на{ 1 діаграма коротша, ніж індексація дужок [].
luser droog

9

PHP 66 байт

<?for(;11>$i;)echo++$i&3?$argv[1][md5(¡æyÚ.$i)%8]?$i&1?~ƒ:_:~ß:~õ;

Невелике поліпшення , використовуючи md5чарівну формулу, але вимагає 3 додаткових довічних байт:
¡, æі Úє символи 161, 230 і 218 відповідно. Він повинен працювати так, як якщо це скопійовано безпосередньо та збережено у форматі ANSI.


PHP 73 (70) байт

<?for($s=327638584;3<$s;)echo++$i&3?$argv[1][7&$s/=8]?$i&1?'|':_:' ':'
';

Якщо ви дозволите мені три двійкові символи, це може бути скорочено до 70 байт :

<?for($s=327638584;3<$s;)echo++$i&3?$argv[1][7&$s/=8]?$i&1?~ƒ:_:~ß:~õ;

де ƒ, ßі õє символами 131, 223 та 245 відповідно.

Отримує введення як аргумент командного рядка. Використання зразка:

$ php seven-seg.php 1101101
 _
 _|
|_

$ php seven-seg.php 0111011

|_|
 _|

Я намагався запустити ваш код, але я отримую безліч помилок :( я не розумію вашу логіку, але здається цікавим.
D34dman,

1
@ D34dman Єдині повідомлення, які він видаватиме, - це повідомлення (невизначені змінні тощо). Їх можна або вимкнути php.ini(за замовчуванням вони вже є), або для тестування ви можете додати наступний код до сценарію:<? error_reporting(E_ALL & ~E_NOTICE); ?>
приміт

приголомшливий! у мене це працює: D naice!
D34dman

7

JavaScript + jQuery + HTML + CSS ( 210 201)

У цьому рішенні використовуються CSS-спрайти та зображення, подані як приклад :

HTML (3)

<a>

CSS ( 82 71)

Завдяки xem за трюк " background: url ":

a{background:url(//bit.ly/VesRKL);width:13px;height:23px;display:block}

JavaScript (125 після видалення нових рядків, доданих тут для читабельності)

i=prompt();
x=-parseInt(i.substr(0,3),2)*23;
y=-parseInt(i.substr(3),2)*13.75;
$('a').css('background-position',y+'px '+x+'px');

Тест в Інтернеті: http://jsfiddle.net/zhqJq/3/


1
Гей, а як же 17.937 байт зображення ?? ;)
Томас В.

@ThomasW. Я не знаю, чи варто це також рахувати. Залишмо це на ОП для вирішення.
Крістіан Лупаску

Ви можете використовувати <p>тег і уникати display:blockCSS, щоб заощадити місце
Роберто Мальдонадо

background-image: url ( bit.ly/VesRKL ); => background: url (// bit.ly/VesRKL);
xem

@xem дякую за пораду; Я відредагував свою відповідь
Крістіан Лупаску

6

R (65 символів):

plot((3^(1i*1.5:-4.5)*(1:7!=7)),col=strsplit(readline(),'')[[1]])

Покладається на деякі вільні наближення деяких трансцендентальних чисел ...


6

Пітон 2 - 65

s=raw_input()+'0\n'
for i in`0x623C239E38D2EAA1`:print s[int(i)],

Приклад:

echo 1101101|python2 7seg.py
0 1 0 
0 0 1 
0 1 0 
1 0 0 
0 1 0

5

PostScript: 53 двійкові, 87 ASCII 52 двійкові, 86 ASCII

Hexdump програми з використанням двійкових маркерів:

$ hexdump -C lcd_binary.ps 
00000000  28 34 34 30 34 30 38 30  34 30 34 30 30 30 30 34  |(440408040400004|
00000010  30 34 30 34 34 34 34 34  38 34 38 30 38 29 7b 7d  |0404444484808){}|
00000020  92 49 6e 7b 92 70 31 92  04 92 96 92 6b 92 63 92  |.In{.p1.....k.c.|
00000030  a7 7d 92 49                                       |.}.I|
00000034

Завантажте цей файл щоб спробувати його.

Використання маркерів ASCII:

(4404080404000040404444484808){}forall
n{not 1 and setgray moveto lineto stroke}forall

Перший forallцикл ставить усі необхідні координати в стек. Координати зберігаються в рядку, щоб мінімізувати необхідний простір. Координати розташовані в зворотному порядку, тобто останні 4 знаки призначені для сегмента А. Проводимо лінію від (0,8)до (4,8)для цього відрізка (насправді нам потрібно додати 48 до всіх координат, оскількиforall ставить усі коди ASCII в стек).

Друга forallпетля проходить через всі 0s і 1s у вхідному рядку і перетворює їх у сіре значення. 0s намальовані білим кольором (значення сірого 1) та1 s - чорним (значення сірого 0). Потім ми використовуємо координати, які перша forallпетля залишила на стеку, щоб намалювати лінії.

Закликайте програму за допомогою Ghostscript, як і у Джеффа Риді:

gs -sn=1101101 lcd.ps

Тут відображаються: Вибірка зразка


Я думаю, ти можеш замінити neg 49 add(що дивовижно до речі) на 1 and.
luser droog

@luserdroog: Блискучі, розрядні оператори, не думали про них. Але це має бути not 1 and, правда? Ще зберігає один байт як у ASCII, так і у двійковому форматі.
Thomas W.

Я думаю, що треба мати акуратний спосіб з 1-бітовою растровою картою. але bitshiftтаке довге слово.
luser droog

Але це лише двобайтовий двійковий маркер
Thomas W.

Так. Але все одно мені якось чути чит . :) Я відчуваю, що мені потрібно якомога більше займатися з читабельним джерелом, перш ніж вдаватися до бінарного.
luser droog

4

APL 101 86 73 69

m←45⍴' '⋄m[¯40+⎕av⍳(⍎∊3/' ',¨⍕⍞)/')*+16;EJOQRSAFK-27=>?']←'⎕'⋄9 5⍴m

Введення здійснюється з екрана через ⍞

1101101

Який створює матрицю символів 9x5, що складається з пробілів і ⎕, як показано нижче:

 ⎕⎕⎕
     ⎕
     ⎕
     ⎕
 ⎕⎕⎕
⎕
⎕
⎕
 ⎕⎕⎕

Семизначне число перетворюється у вектор розділу для вибору ⎕ координат.


У мене болить голова ...
Роб

4

Mathematica 112 103 100 96 88, використовуючи графіки

HighlightGraph[z=GridGraph@{3,2},Pick[EdgeList[z][[{3,4,1,2,6,7,5}]],Characters@#,"1"]]&

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

Using it to show a calculator display

l = {7-> 7, 1-> 6, 0-> 63, 8-> 127, 9-> 111,3 -> 79, 5-> 109,  2-> 91, 4-> 102, 6-> 125}; 
GraphicsRow[
  HighlightGraph[z = GridGraph[{3,2}, EdgeStyle-> {White}, GraphHighlightStyle-> {"Thick"}], 
    EdgeList[z][[{3, 4, 1, 2, 6, 7, 5}]][[IntegerDigits[#, 2, 7] Range@7]]] & /@
            (IntegerDigits[8736302] /. l)]

Графіка математики


Якого вкладу ви очікуєте? Ні мені, [123]ні ["123"], ні IntegerDigits[123]роботі. Я отримую тільки z, без виділення.
DavidC

@dude Спробуйте `HighlightGraph [z = GridGraph @ {3, 2}, виберіть [EdgeList [z] [[{3, 4, 1, 2, 6, 7, 5}]], символи @ #," 1 "] ] & @ "1111111" `` :)
доктор belisarius

3

Пітон (107)

Однозначно гольф.

a=map(int,raw_input())
for i in(0,6,3):print' .. '*a[i]+('\n'+' .'[a[5-i/6]]+'  '+' .'[a[1+i/6]])*(2*(i!=3))

Вихід:

1101101
 .. 
   .
   .
 .. 
.   
.   
 .. 

Пояснення:

a is a list of booleans extracted from the input.
When you multiply a string with a number, it will return the string repeated (number) times.
If that number happens to be zero, it returns an empty string.
i is iterated through 0 (pos A), 6 (pos G), and 3 (pos D).
' .. ' will print either section A, G, or D, depending on the value of i.
([string here])*(2*(i!=3)) will print [string here] twice only if i!=3.
Breaking down [string here]:
 - '\n' will print a newline for each repetition.
 - '  ' is the null space between horizontal sections.
 - ' .'[(bool)] will return either ' ' if (bool) is 0, and '.' if (bool) is 1.
 - 5-i/6 will return 5 if i=0 and 4 if i=6. a[5] is section F and a[4] is section E.
 - 1+i/6 will return 1 if i=0 and 2 if i=6. a[1] is section B and a[2] is section C.

3

Python 2.7 (93 символи):

print (' {0}\n{5} {1}\n {6}\n{4} {2}\n {3}').format(*map(lambda x:int(x)and'*'or' ',raw_input()))

Пояснення:

За допомогою вводу stdin використовуйте імпровізований потрійний оператор, щоб вказати *true та пробіл для false. Візьміть ці значення та підключіть їх до заяви формату, що знаходиться у форматі 7-значний дисплей. Буде не більше 83 символів, якби дисплей працював так:

 a
b c
 d
e f
 g

але замовлення робить це довше. У когось це обійти?

Приклад:

$ ./7seg.py
111000

 *
  *

  *

$ ./7seg.py


1111111

 *
* *
 *
* *
 *

1
Приємно, але ця лямбда здається непотрібною;; print' {0}\n{5} {1}\n {6}\n{4} {2}\n {3}'.format(*[' *'[i=='1']for i in raw_input()])) Не потрібно також дужок і місця для оператора print.
daniero

Оце Так! Я не знав, що ви можете вводити булі в індексатори. Дякую :-)
Бриганда

Np. Крім того, >'0'замість =='1'і input()(із зворотними посиланнями навколо, але це не відображатиметься через формат тут) замість raw_input().
daniero

fyi, ви можете використовувати потрійні задники, якщо вам потрібні задні коди в кодіx = `input()`
Brigand

Класно. Тоді я і сьогодні щось дізнався :)
daniero

3

Я думав, що нам потрібна пихата відповідь ...

Clojure, 159 символів

(print(apply str(flatten(interpose\newline(partition 3(map(fn[x](if(= x\1)\o" "))(str" "(apply str(interpose" "(map(vec(read-line))[0 5 1 6 4 2 3])))" ")))))))

Вищезазначене працюватиме у відповіді та надасть правильну відповідь. Наприклад:

1111111
 o 
o o
 o 
o o
 o 

Кидаючи на нього номери з невеликими модифікаціями:

(doseq [i ["1111110" "0110000" "1101101" "1111001" "0110011" "1011011" "1011111" "1110000" "1111111" "1111011"]]
(println (apply str(flatten(interpose\newline(partition 3(map(fn[x](if(= x\1)\o" "))(str" "(apply str(interpose" "(map(vec i)[0 5 1 6 4 2 3])))" "))))))) 
(println))

врожайність:

 o 
o o

o o
 o 


  o

  o


 o 
  o
 o 
o  
 o 

 o 
  o
 o 
  o
 o 


o o
 o 
  o


 o 
o  
 o 
  o
 o 

 o 
o  
 o 
o o
 o 

 o 
  o

  o


 o 
o o
 o 
o o
 o 

 o 
o o
 o 
  o
 o 

nil

Читати непросто, але вони є!


3

Javascript 123

s=prompt(i=o='');for(m=' 0516423';i++<15;i%3==0?o+='\n':1)o+=' ─│'[~i%2&(A=+s[+m[~~(i/2)]])+(A&+'110'[i%3])];console.log(o)

Я можу знизити кількість символів нижче (101), якщо ми використовуємо лише один символ для стану "увімкнено", але він менш розбірливий:

s=prompt(i=o='');for(m=' 0516423';i++<15;i%3==0?o+='\n':1)o+=' ■'[~i%2&s[+m[~~(i/2)]]];console.log(o)

+1 Це вражаюче. Я все ще намагаюся його реверсувати. Мене це вже навчило декілька речей!
guypursey

2

Постскрипт 136

Не переможець, а інший підхід.

15 string exch{1 and 255 mul}forall
[7 3 9 13 11 5 1]{count 1 sub index 3 1 roll exch put}forall
3 5 8[.02 0 0 .05 0 0]{}image showpage

Очікує, що вхідний рядок буде в стеку:

$ echo '(1101101)'|cat - 7seg.ps |gs -sDEVICE=png16 -sOutputFile=6c.png -

Це ще гірше. 294, щоб зробити "бінарну" растрову карту. Я зайняв деякий час, щоб згадати, що кожен рядок забито рівним байтом. Отже, растровий малюнок 3x5 - це п'ять байтів, причому значення 3 біт мсб значущі.

2#1101101
(12345)exch
2 copy 64 and 0 exch put %A
2 copy 2 and 6 bitshift 2 index 32 and or 1 exch put %F B
2 copy 1 and 6 bitshift 2 exch put %G
2 copy 4 and 5 bitshift 2 index 16 and 1 bitshift or 3 exch put %E C
2 copy 8 and 3 bitshift 4 exch put
pop
3 5 1[.02 0 0 .02 0 0]{}image showpage

Вихід такий же потворний, як і інший. :(

Добре ось такий, який виглядає добре. 190

Редагувати: це було перевернуто і назад. Виправлено зараз.

(1101101)
{neg 49 add 255 mul
1 string dup 0 4 3 roll put}forall
(\377){@/g/f/e/d/c/b/a}{exch def}forall
@ a a @
b @ @ f
b @ @ f
@ g g @
c @ @ e
c @ @ e
@ d d @
4 7 8[.01 0 0 .01 0 0]{}image showpage

Це показує мені кілька кумедних зразків. Чи є десь помилка десь?
Томас В.

хм. так. (1111110) не схожий на нуль. Це просто збільшена байт-карта. Я думаю, що коробочки спрощені. :(
luser droog

Я думаю, що це природа цього растрового підходу. Я не впевнений, як зробити це не потворно.
luser droog

Деякі легкі коментарі доступні тут .
luser droog

2

Математика 264

Для того, щоб результат виглядав правильно, потрібно багато байтів, тому жодної сигари цього разу немає. Але ось все-таки багатослівний (264 символів) код.

{a, b, c, d, e, g} = {{-1, 5}, {1, 5}, {1, 3}, {1, 1}, {-1, 1}, {-1, 3}};
f@n_ := Graphics[{Yellow, Thickness[.1], CapForm["Round"],
   Line /@ {{g, c}, {g, a}, {g, e}, {e, d}, {d, c}, {c, b}, {b, a}}[[Flatten@
   Position[IntegerDigits[n, 2, 7], 1]]]}, 
   Background -> Blue, PlotRange -> {{-1, 1}, {1, 5}}, PlotRangePadding -> 1]

Повний набір символів:

GraphicsGrid[Partition[Table[f[p], {p, 0, 128}], 16]]

karakis

Цифри:

{f[63], f[6], f[91], f[79], f[102], f[109], f[125], f[7], f[127], f[111]}

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


2

PHP - 155 символів

<?php
$y=array("   \n"," - \n","   \n","  |\n","|  \n","| |\n"); $x = $argv[1]; echo $y[$x[0]].$y[2*$x[6]+$x[2]+2].$y[$x[7]].$y[2*$x[5]+$x[3]+2].$y[$x[4]];

Це було б 150 символів, якщо ми використовуємо декларацію масиву типу php 5.4, але я не маю цього встановити на моєму ноутбуці, тому не міг його перевірити.

Зразок викладає.

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

Пояснення:

Спочатку я розділив 7 сегментний дисплей на п’ять рядків і 3 колонки. Із середнім стовпцем 1-го, 3-го та 5-го рядків "-", а пробіл - іншим.

2-й і 4-й ряд мають трубу '|' символу в першій та останній стовпцях. Тепер присутність цих символів має орієнтуватися на вхідні значення.

Я створив таблицю пошуку, яка в основному являє собою дві таблиці пошуку. Перший для обчислення значень для 1-го, 3-го та 5-го рядів. І ще один із зміщенням 2 (3-й пункт) для обчислення рядків 2-го та 4-го рядків.


2

Java - 204 символи

class A{public static void main(String[]a){char[]c=new char[7];for(int i=0;i<7;i++)c[i]=a[0].charAt(i)==49?i%3==0?95:'|'):32;System.out.printf(" %c %n%c%c%c%n%c%c%c",c[0],c[5],c[6],c[1],c[4],c[3],c[2]);}}

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

 _ 
 _|
|_ 

Відформатовано належним чином:

class A {
    public static void main(String[] a) {
        char[] c = new char[7];
        for (int i = 0; i < 7; i++)
            c[i] = a[0].charAt(i) == 49 ? (i % 3 == 0 ? 95 : '|') : 32;
        System.out.printf(" %c %n%c%c%c%n%c%c%c", c[0], c[5], c[6], c[1], c[4], c[3], c[2]);
    }
}

Дуже хотілося б, щоб я міг цього уникнути, але я спробував кілька інших речей, і вони були довші. Можливо, є кращий спосіб зробити це, але це моя перша спроба кодового гольфу. (І Java - це найгірша мова для цього, тому я вважав, що це буде цікаво.) Навіть Brainfuck мене побив, але, принаймні, мої результати виглядають приємніше.

EDIT: можна позбутися "публіки" на уроці, врятує мені 7 символів!

І дякую, Данієро, що показали мені printf! (Збережено 18 символів)

Перезаписали вихідний формат, змінили букви символів на десяткові, збережено 12 символів.


Ласкаво просимо на codegolf.se! Java представила printfметод кілька версій назад, який є в основному printlnі formatв одній (наприклад, функція C); Це допоможе вам врятувати деяких персонажів,
daniero

Ось ще одна хитрість: Ви можете поєднати "тіло" forциклу та частину оновлення в одну, зберегти один символ:for(int i=7;i>0;c[--i]=a[0].charAt(i)==49?(i%3==0?95:'|'):32);
daniero

1

VBA - 263

Це некрасиво, але це працює, я думаю. У мене виникають проблеми з переглядом належного порядку бітів, тому я виводжу з відповідей інших. Навіть якщо цей фрагмент невірний, довжина коду повинна залишатися однаковою.

Sub d(b)
Dim c(1 To 7)
For a=1 To 7
c(a)=Mid(b,a,1)
Next
x=" - "
y="|"
z=" "
w="   "
v=vbCr
MsgBox IIf(c(1)=1,x,w) & v & IIf(c(6)=1,y,z) & z & IIf(c(2)=1,y,z) & v & IIf(c(7)=1,x,w) & v & IIf(c(5)=1,y,z) & z & IIf(c(3)=1,y,z) & v & IIf(c(4)=1,x,w)End Sub

1

VBScript - 178 символів

m=Split("2 7 11 10 9 5 6")
s=" _ "&vbCr&"|_|"&vbCr&"|_|"
For x=1 To 7
If Mid(WScript.Arguments.Item(0),x,1)=0 Then r=m(x-1):s=Left(s,r-1)&" "&Right(s,Len(s)-r)
Next
MsgBox s

Спасибі! Пара помилок у коханні коштувала мені 6 персонажів. Я майже можу звести це до розміру VBA, навіть при абсурдно довгому виклику, щоб отримати аргумент функції функції.
Комінтерн

Якщо ваш код не функціонує без символів нового рядка, вам також доведеться рахувати їх. Згідно з моїм підрахунком, це 178 символів.
манатура

1

CJam - 29

l0N]s7078571876784728737Ab\f=

CJam - це нова мова, яку я розробляю, схожа на GolfScript - http://sf.net/p/cjam . Ось пояснення:

lчитає рядок із вхідного
0числа - це число 0
N- змінна, попередньо ініціалізована до рядка нового рядка,
]збирає елементи на стеку в масив,
sперетворює значення (масив) у рядок, таким чином додаючи нуль, а новий рядок до заданого входу
7078571876784728737- це число (те саме число, яке я використовував у python, але воно було у шістнадцятковій)
Aє змінною, попередньо ініціалізованою до 10,
bробить базове перетворення, генеруючи масив [7 0 7 8 ... 3 7]
\замінює останні два значення на стеку
f=застосовує =оператор (тут, індексований доступ до масиву) до вхідного рядка (плюс нуль та новий рядок) та кожного числа 7, 0, 7, ...
Індекс 7 відповідає додатковому нулю, а 8 відповідає доданому новому рядку.

Моє рішення python робить саме те ж саме (за винятком розділення цифр здійснюється за допомогою перетворення рядків)


Що я дивлюся тут? Хочете запропонувати коротке пояснення коду?
daniero

@daniero Я додав пояснення
aditsu

1

VBA, 188 символів

Зауважте, що потрібно ввести 188 символів, якщо вони включають лише обов'язкові пробіли - IDE розширює його, коли ви копіюєте його в редактор VBA.

Sub f(i)
Dim c() As Byte
m=Split("1 6 10 9 8 4 5")
c=StrConv(" _  |_| |_|",128)
c(3)=10
c(7)=10
For x=1 To 7
If Mid(i,x,1) = 0 Then c(m(x-1))=32
Next
MsgBox StrConv(c,64)
End Sub

На жаль, VBScript не має сильно набраного байтового масиву, або він може бути набагато коротшим за допомогою цього методу.


1

Javascript (ECMAScript 2016) - 108 байт

console.log(([a,b,c,d,e,f,g]=[...prompt()].map((x,i)=>+x?'_||'[i%3]:' '),` ${a}
${f}${g}${b}
${e}${d}${c}`))

Це , ймовірно , може бути golfed далі але не можу думати ні про що.


Ласкаво просимо на сайт! Це хороший перший запис :)
daniero

1

JavaScript, 148 байт

e=>(e[0]==1?" #\n":"\n")+(e[5]==1?"#":" ")+(e[1]==1?" #\n":"\n")+(e[6]==1?" #\n":"\n")+(e[4]==1?"#":" ")+(e[2]==1?" #\n":"\n")+(e[3]==1?" #\n":"\n")

Спробуйте в Інтернеті! (Нижній колонтитул - це Node.js для читання.input.tio )

Приймає введення ABCDEFG у двійкові прапори та повертає:

 #
# #
 #
# #
 #

0

SmileBASIC, 136 байт

DIM A[7,2]COPY A,@L@L?DATA.,1,1,3,4,3,6,1,4,0,1,0,3,1INPUT X$FOR I=0TO 6M=I MOD 3GBOX A[I,1],A[I,0],A[I,1]+!M,A[I,0]+!!M,-VAL(X$[I])NEXT

Вихідний результат - графічний.


0

05AB1E , 4 байти

C₄+ç

Спробуйте в Інтернеті або перевірте всі можливі введення .

Дивіться перевірку всіх можливих входів вище, щоб побачити відображення, яке використовується для кожного вводу.

Пояснення:

Це зловживає правилами, де зазначено:

Як ви представляєте дисплей, залежить від вас - одного символу Unicode або ASCII , мистецтва ASCII, графічно або будь-якого іншого, що ви можете придумати. Однак кожен вхід повинен мати власний чіткий вихід.

C       # Convert the (implicit) input from binary to integer
 ₄+     # Increase it by 1000
   ç    # Convert it to a unicode character with this value (and output implicitly)

Альтернатива більше в дусі виклику з використанням вихідного формату:

 -
| |
 -
| |
 -

38 байт :

Σ•L7וNè}εi" -| | "14∍2ôNèëðº]J24S5∍£»

Однозначно можна пограти в гольф ..

Спробуйте в Інтернеті або перевірте всі можливі введення .

Пояснення:

Σ       }          # Sort the (implicit) input-digits by:
 L7וNè           #  The digit at the same index in the compressed integer 1367524
                   #   i.e. "1101101" → ["1","0","1","1","1","0","1"]
ε                  # Then map each digit to:
 i                 #  If it's a 1:
  " -| | "         #   Push string " -| | "
          14      #   Lengthen it to size 14: " -| |  -| |  -"
             2ô    #   Split it into parts of 2: [" -","| ","| "," -","| ","| "," -"]
               Nè  #   Index into it
 ë                 #  Else (it's a 0):
  ðº               #   Push "  " (two spaces) instead
    ]              # Close both the if-else and map
                   #  i.e. ["1","0","1","1","1","0","1"]
                   #   → [" -","  ","| "," -","| ","  "," -"]
J                  # Join everything together to a single string
                   #  i.e. [" -","  ","| "," -","| ","  "," -"] → " -  |  -|    -"
 24S               # Push [2,4]
    5             # Lengthened to size 5: [2,4,2,4,2]
      £            # Split the string into parts of that size
                   #  i.e. " -  |  -|    -" → [" -","  | "," -","|   "," -"]
       »           # Join by newlines (and output implicitly)
                   #  i.e. [" -","  | "," -","|   "," -"] → " -\n  | \n -\n|   \n -"

Дивіться цей мінний наконечник 05AB1E ( розділ Як стискати великі цілі числа? ), Щоб зрозуміти, чому •L7וце так 1367524.


0

PHP 5.6, 65 байт звичайний ASCII

for(;$p++<9;)echo$argn[_707561432[$p]]?"||_"[$p%3]:" ","\n"[$p%3];

або, без зворотного розриву, але з трохи потішною забавою:

for(;$p++<11;)echo$argn[_70785618432[$p]]?L|Sx[$p&1]:a^kAAA[$p&3];

Запустіть як трубу -nRабо спробуйте їх в Інтернеті .

розбивка 1

for(;$p++<9;)echo           # loop through positions
    $argn[_707561432[$p]]   # map position to input bit
        ?"||_"[$p%3]            # if set: underscore in 2nd column, pipe symbol else
        :" "                    # else space
    ,"\n"[$p%3]             # add newline every 3 columns
;

розбивка 2

for(;$p++<11;)echo          # loop through positions
    $argn[_70785618432[$p]] # map position to input bit (bit 8 for EOL, never set)
        ?L|Sx[$p&1]             # if set: underscore in the middle, pipe symbol else
        :a^kAAA[$p&3]           # else: newline in 4th column, space else

1
Нова мова чи стара мова вже не має значення з літа 2017 року . Тож вам не доведеться згадувати про неконкурентні.
Kevin Cruijssen

@KevinCruijssen Спасибі, що я пропустив це. Але також приємний виклик відновити старі версії PHP; Це також іноді дає інший погляд на новіші функції: я часом виявляв, що "старий" спосіб є більш ефективним (за розміром, продуктивністю, читабельністю, а іноді і за всіма трьома), ніж використання речей, доданих до PHP пізніше Немає жодної переваги для гольфу в цьому випадку: Перший підхід вимагав би 8 зайвих байтів, другий 5
Тит
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.