Emuluj wyświetlacz 7-segmentowy

24

Zadanie

Zadanie polega na wyświetleniu dowolnego z 128 możliwych stanów wyświetlacza 7-segmentowego .

Twój program powinien przyjąć ciąg 7 znaków ( „bity”), które są albo 0albo 1. Pierwszy bit wejściowy odpowiada segmentowi A poniższej ilustracji, drugi do B itp. (Zignoruj dp):

7seg

To, jak reprezentujesz wyświetlacz, zależy od Ciebie - pojedynczy symbol Unicode lub ASCII, grafika ASCII, graficznie lub cokolwiek, co możesz wymyślić. Jednak każde wejście musi mieć własne odrębne wyjście. Jeśli wpadniesz na coś wymyślnego, jestem pewien, że możesz zebrać głosy poparcia, pokazując kilka przykładów.

Wszystkie 128 możliwych stanów wyświetlacza to:

stany

Zasady

  • Codegolf
  • Jak powiedziałem, każdy rodzaj danych wyjściowych jest dozwolony, ale byłoby miło, gdybyś je określił.
  • Dane wejściowe mogą być argumentem stdin lub wiersza poleceń.

Przykłady

Wkład

1101101

Wydajność

Jako ASCII / Unicode:
2
Różne rodzaje sztuki ASCII (nie jestem w tym zbyt dobry)
 _   ╺┓  ╒╗   ---
 _|  ┏┛  ╔╝     |
|_   ┗╸  ╚╛   ---
              |
              ---
daniero
źródło
Ściśle związany z codegolf.stackexchange.com/questions/997/... ?
DavidC,
@DavidCarraher: Są spokrewnieni, tak; Nawet sam się z tym powiązałem. Jest to jednak nieco trudniejsze, ponieważ masz 118 dodatkowych „liczb” do wygenerowania. Większość (?) Odpowiedzi na inne pytanie tutaj by nie działała lub musiałaby zostać mocno przepisana. Również tutaj nie musisz kodować różnych liczb, więc inne optymalizacje powinny być możliwe.
daniero
Masz rację. Dzięki za zwrócenie na to uwagi.
DavidC
czy wymagane jest użycie kodowania, które podałeś? np. „1101101” powinno zawsze oznaczać „2”?
nowy
@ardnew: tak. Pozycja bitów na wejściu powinna być odwzorowana na kolejności alfabetycznej segmentów od A do G na pierwszym obrazie.
daniero

Odpowiedzi:

5

J (51)

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

wydajność:

1101101
 ## 
   #
 ## 
#   
 ## 
marinus
źródło
1
To może być ogolony w dół do 38 char przy odrobinie wysiłku: 1 2 1#"1' #'{~5 3$,0,.502 A.".&>1!:1]1.
algorytmshark
16

C, 106

Rozmiar wynosi 74 znaki, jeśli można zmienić nazwę programu „W00WG5WW1GW66WG4WW2GW33WG”

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

bieganie:

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

uwagi:

„W” i „G” (0x47 i 0x57) są wybierane w taki sposób, że wartość & 7 = 7, tzn. Bezpiecznie indeksują znak zerowy, który kończy łańcuch wejściowy.

króliczek
źródło
15

Brainfuck - 224

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

Drukuje za pomocą wykrzykników:

 ! 
! !
 !
! !
 !

Nie najbardziej czytelny, ale też niezbyt okropny.

Zaskoczony, jak blisko jest to nie być ostatnim miejscem.

captncraig
źródło
13

Postscript 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

wymaga nzdefiniowania jako ciągu do przetworzenia, więc wywołaj podobnie

gs -g7x14 -sn=1101101 lcd.ps

dostać

image of number two

kompletny zestaw to

complete set of characters

Geoff Reedy
źródło
11

Mathematica: 135 129 118, wyświetlanie obrazu

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

spacje dodane „dla przejrzystości”

enter image description here

Edytować

Dla wybrednych użytkowników witryny: bez użycia maski zewnętrznej:

Image[MorphologicalComponents[ColorNegate@Rasterize@8, CornerNeighbors -> False] /. 
    Thread[Range@7 ->IntegerDigits[#, 2, 7][[{7, 2, 6, 1, 3, 5, 4}]]]] &
Dr Belizariusz
źródło
Kod wydaje się niekompletny. Nie sądzę, żebyś chciał zakończyć swój program &.
DavidC
@DavidCarraher Jest to funkcja , więc kończy się na &.
Dr Belisarius
Tak, ale nie dotyczy to niczego. Jak uzyskać dane wyjściowe?
DavidC
2
@belisarius Nadal nie podoba mi się fakt, że osadzasz zasoby zewnętrzne.
FUZxxl,
1
Myślę, że usunięcie mojego poprzedniego komentarza nie ma sensu, ponieważ znacznie utrudniłoby to komuś innemu śledzenie tej dyskusji. Importujesz dane zewnętrzne, co jest zabawne jako żart, ale nie jest częścią poważnej odpowiedzi na pytanie w golfa. -1
FUZxxl,
10

APL, 58 55

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

Przykładowe dane wejściowe:

1101101

Wydajność:

 _ 
 _|
|_ 

⍞='1' przyjmuje dane wejściowe jako tablicę znaków i konwertuje je na tablicę numeryczną.

1 2 2 1 2 2 1×⍞='1'konwertuje tę tablicę na: 0puste, 1for _, 2for|

(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3]przypisz tę tablicę do zmiennej xi ponownie uporządkuj, aby reprezentowała segmenty 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] łączy półfabrykat, segment A i kolejny półfabrykat z przodu

3 3⍴0,x[1],0,(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3] przekształć w matrycę 3x3

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

Na koniec używa łańcucha ' _|'do konwersji znaków na znaki


Edytować

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

Ogolono 3 znaki, łącząc a 0z przodu tablicy i używając duplikatów wskazań, zapobiegając przypisaniu zmiennej

TwiNight
źródło
Jeśli twoja APL to obsługuje, myślę, że funkcja from{ jest o 1 znak krótsza niż indeksowanie nawiasów [].
luser droog
9

PHP 66 bajtów

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

Niewielka poprawa stosując md5magiczną wzoru, ale wymaga dodatkowych bajtów 3 Binary
¡, æi Úto znaki 161, 230 i 218, odpowiednio. Powinno działać tak, jakby było kopiowane bezpośrednio i zapisywane jako format ANSI.


PHP 73 (70) bajtów

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

Jeśli pozwolisz mi na trzy znaki binarne, można to zmniejszyć do 70 bajtów :

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

gdzie ƒ, ßi õsą odpowiednio znakami 131, 223 i 245.

Odbiera dane wejściowe jako argument wiersza poleceń. Przykładowe użycie:

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

$ php seven-seg.php 0111011

|_|
 _|
primo
źródło
Próbowałem uruchomić kod, ale dostaję mnóstwo błędów :( Nie rozumiem twojej logiki, ale wydaje się interesująca.
D34dman
1
@ D34dman Jedyne komunikaty, które wygeneruje, to powiadomienia (niezdefiniowane zmienne itp.). Można je wyłączyć w php.ini(domyślnie już są), lub w celu przetestowania można dołączyć do skryptu następujący kod:<? error_reporting(E_ALL & ~E_NOTICE); ?>
primo
niesamowite! mam to działa: D naice!
D34dman
7

JavaScript + jQuery + HTML + CSS ( 210 201)

To rozwiązanie wykorzystuje duszki CSS, a obraz podano jako przykład :

HTML (3)

<a>

CSS ( 82 71)

Dzięki xem za sztuczkębackground: url ”:

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

JavaScript (125 po usunięciu nowych linii dodanych tutaj dla czytelności)

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');

Test online: http://jsfiddle.net/zhqJq/3/

Cristian Lupascu
źródło
1
Hej, ale co z 17.937 bajtów obrazu? ;)
Thomas W.
@ThomasW. Nie wiem, czy to też należy liczyć. Pozostawmy to OP do podjęcia decyzji.
Cristian Lupascu
Możesz użyć <p>tagu i unikać display:blockw CSS, aby zaoszczędzić miejsce
Roberto Maldonado
background-image: url ( bit.ly/VesRKL ); => background: url (// bit.ly/VesRKL);
xem.
@xem dzięki za wskazówkę; Zredagowałem swoją odpowiedź
Cristian Lupascu,
6

R (65 znaków):

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

Opiera się na luźnych przybliżeniach dla niektórych liczb transcendentalnych ...

Patrick Caldon
źródło
6

Python 2 - 65

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

Przykład:

echo 1101101|python2 7seg.py
0 1 0 
0 0 1 
0 1 0 
1 0 0 
0 1 0
aditsu
źródło
5

PostScript: 53 binarny, 87 ASCII 52 binarny, 86 ASCII

Hexdump programu używającego tokenów binarnych:

$ 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

Pobierz ten plik, aby go wypróbować.

Korzystanie z tokenów ASCII:

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

Pierwsza forallpętla umieszcza wszystkie wymagane współrzędne na stosie. Współrzędne są przechowywane w ciągu, aby zminimalizować wymaganą przestrzeń. Współrzędne są w odwrotnej kolejności, tzn. Ostatnie 4 znaki dotyczą segmentu A. Rysujemy linię od (0,8)do(4,8) dla tego segmentu (w rzeczywistości musimy dodać 48 do wszystkich współrzędnych, ponieważ forallumieszcza wszystkie kody ASCII na stosie).

Druga forallpętla przechodzi przez wszystkie 0si 1si w ciągu wejściowym i zamienia je w szarą wartość. 0s są rysowane na biało (wartość szarości 1), a 1s są rysowane na czarno (wartość szarości 0). Następnie używamy współrzędnych, które są pierwszeforall pozostawionych pętlę na stosie, aby narysować linie.

Wywołaj program za pomocą Ghostscript, podobnie jak Geoff Reedy:

gs -sn=1101101 lcd.ps

Wyświetla to: Sample output

Thomas W.
źródło
Myślę, że możesz zastąpić neg 49 add(co jest niesamowite btw) z 1 and.
luser droog 27.12.12
@luserdroog: Genialni, bitowi operatorzy, nawet o nich nie myśleli. Ale tak musi być not 1 and, prawda? Nadal zapisuje jeden bajt zarówno w ASCII, jak i binarny.
Thomas W.
Wydaje mi się, że musi być zgrabny sposób z bitmapą 1-bitową. ale bitshiftto takie długie słowo.
luser droog
Ale to tylko dwubajtowy token binarny
Thomas W.
Tak. Ale nadal wydaje mi się, że to oszustwo . :) Czuję, że muszę zrobić jak najwięcej z czytelnego źródła, zanim skorzystam z binarnego.
luser droog
4

APL 101 86 73 69

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

Wejście pochodzi z ekranu za pomocą ⍞

1101101

Który tworzy matrycę znaków 9x5 złożoną ze spacji i ⎕ w następujący sposób:

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

Siedmiocyfrowa liczba jest konwertowana na wektor podziału, aby wybrać współrzędne ⎕.

Graham
źródło
Boli mnie głowa ...
Rob
4

Mathematica 112 103 100 96 88, z wykorzystaniem wykresów

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

enter image description here

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

Mathematica graphics

Dr Belizariusz
źródło
Jakiego rodzaju wkładu oczekujesz? Ani [123][[123]], ani nie IntegerDigits[123]pracuj dla mnie. Dostaję tylko zbez wyróżnienia.
DavidC
@dude Spróbuj `HighlightGraph [z = GridGraph @ {3, 2}, Wybierz [EdgeList [z] [[{3, 4, 1, 2, 6, 7, 5}]], Znaki @ #,„ 1 ”] ] & @ „1111111” `` :)
Dr. belisarius
3

Python (107)

Zdecydowanie bardziej golfowy.

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

Wydajność:

1101101
 .. 
   .
   .
 .. 
.   
.   
 .. 

Wyjaśnienie:

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.
beary605
źródło
3

Python 2.7 (93 znaki):

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

Wyjaśnienie:

Z wejściem stdin użyj prowizorycznego operatora trójskładnikowego, aby dać wartość *prawda, a spację - fałsz. Weź te wartości i podłącz je do instrukcji formatu, która ma format 7-cyfrowego wyświetlacza. Byłoby to najwyżej 83 znaki, gdyby wyświetlacz działał w następujący sposób:

 a
b c
 d
e f
 g

ale kolejność jest dłuższa. Czy ktoś ma na to sposób?

Przykład:

$ ./7seg.py
111000

 *
  *

  *

$ ./7seg.py


1111111

 *
* *
 *
* *
 *
Bandyta
źródło
1
Fajnie, ale ta lambda wydaje się niepotrzebna:; print' {0}\n{5} {1}\n {6}\n{4} {2}\n {3}'.format(*[' *'[i=='1']for i in raw_input()])) Nie potrzeba też nawiasów ani miejsca na instrukcję print.
daniero
Łał! Nie wiedziałem, że można wstawić booleany do indeksatorów. Dzięki :-)
Brigand
Np. Ponadto >'0'zamiast =='1'i input()(z backtickami, ale to nie pojawi się z powodu formatowania tutaj) zamiast raw_input().
daniero
fyi, możesz użyć potrójnych backticków, jeśli potrzebujesz backticków w kodziex = `input()`
Brigand
Fajne. Potem też się dzisiaj nauczyłem :)
daniero
3

Myślałem, że potrzebujemy lispy odpowiedzi ...

Clojure, 159 znaków

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

Powyższe będzie działać w REPL i zapewni prawidłową odpowiedź. Na przykład:

1111111
 o 
o o
 o 
o o
 o 

Rzucanie w to liczbami z małymi modyfikacjami:

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

daje:

 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

Niełatwe do odczytania, ale już są!

Joanis
źródło
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)

Mogę obniżyć liczbę znaków (101), jeśli użyjemy tylko jednego znaku dla stanu „włączony”, ale jest to mniej czytelne:

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)
Shmiddty
źródło
+1 To imponujące. Nadal próbuję to przebudować. Nauczyło mnie już kilku rzeczy!
guypursey
2

Postscript 136

Nie zwycięzca, ale inne podejście.

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

Oczekuje, że ciąg wejściowy znajdzie się na stosie:

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

Ten jest jeszcze gorszy. 294, aby utworzyć „binarną” bitmapę. Zajęło mi trochę czasu, aby pamiętać, że każdy wiersz jest wypełniony parzystym bajtem. Tak więc mapa bitowa 3x5 ma pięć bajtów przy znaczących 3 bitach msb.

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

Wyjście jest tak samo brzydkie jak inne. :(

W porządku, oto taki, który wygląda dobrze. 190

Edycja: To było do góry nogami i do tyłu. Naprawiono teraz.

(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
luser droog
źródło
To pokazuje mi śmieszne wzory. Czy nadal gdzieś jest błąd?
Thomas W.
hmm Tak. (1111110) nie wygląda jak zero. To tylko powiększona bytemap. Sądzę, że pudełka są bardzo uproszczone. :(
luser droog
Wydaje mi się, że to podejście ma charakter bitmapy. Nie jestem pewien, jak sprawić, by nie było brzydkie.
luser droog 27.12.12
Lekki komentarz dostępny tutaj .
luser droog
2

Mathematica 264

Poprawne wyprowadzenie wydruku wymagało wielu bajtów, więc tym razem bez cygara. Ale i tak jest tu pełny kod (264 znaków).

{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]

Pełny zestaw znaków:

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

characteris

Cyfry:

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

enter image description here

DavidC
źródło
2

PHP - 155 znaków

<?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]];

byłoby 150 znaków, jeśli użyjemy deklaracji typu php 5.4, ale nie mam tego zainstalowanego na moim laptopie, więc nie mogłem go przetestować.

Próbki wypuszczają.

enter image description here

Wyjaśnienie:

Najpierw podzieliłem 7-segmentowy wyświetlacz na Pięć wierszy i 3 kolumny. Z havimg 1, 3 i 5 rzędu w środkowej kolumnie i spacją w przeciwnym razie.

Drugi i czwarty rząd ma rurkę „|” znak w pierwszej i ostatniej kolumnie. Teraz obecność tych znaków powinna kierować się wartościami wejściowymi.

Utworzyłem tabelę odnośników, która jest w zasadzie dwoma tabelami odnośników. Pierwszy do obliczania wartości dla 1., 3. i 5. rzędu. I jeszcze jeden z przesunięciem 2 (3. pozycja) do obliczenia rzędów 2. i 4..

D34dman
źródło
2

Java - 204 znaki

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]);}}

Przykładowe dane wyjściowe:

 _ 
 _|
|_ 

Poprawnie sformatowany:

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]);
    }
}

Naprawdę chciałbym tego uniknąć w pętli, ale spróbowałem kilku innych rzeczy i wszystkie były dłuższe. Prawdopodobnie jest na to lepszy sposób, ale to moja pierwsza próba gry w golfa kodowego. (A Java jest dla niego najgorszym językiem, dlatego uważałem, że będzie interesujący.) Nawet Brainfuck mnie pobił, ale przynajmniej moje wyniki wyglądają ładniej.

EDYCJA: można pozbyć się „publicznego” w klasie, oszczędza mi 7 znaków!

I dzięki, Daniero, za pokazanie mi printf! (18 znaków zapisanych)

Przepisano format wyjściowy, zmieniono literały znakowe na dziesiętne, zapisano 12 znaków.

łamacz kodów
źródło
Witamy w codegolf.se! Java wprowadził printfsposób kilka wcześniejszych wersji, która jest w zasadzie printlni formatw jednej (na przykład funkcji C); Pozwoli ci to uratować niektóre postacie,
daniero
Oto kolejna sztuczka: możesz połączyć „ciało” forpętli i część aktualizacyjną w jedną, oszczędzając jedną postać:for(int i=7;i>0;c[--i]=a[0].charAt(i)==49?(i%3==0?95:'|'):32);
daniero
1

VBA - 263

To brzydkie, ale myślę, że działa. Mam problem z wyświetleniem właściwej kolejności bitów, więc wnioskuję na podstawie odpowiedzi innych. Nawet jeśli ten fragment jest nieprawidłowy, długość kodu powinna pozostać taka sama.

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
Gaffi
źródło
1

VBScript - 178 znaków

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
Komintern
źródło
Dzięki! Kilka błędów w głowach kosztuje mnie 6 znaków. Mogę prawie sprowadzić to do rozmiaru VBA, nawet z absurdalnie długim wywołaniem, aby uzyskać argument linii funkcyjnej.
Comintern
Jeśli twój kod nie działa bez znaków nowego wiersza, musisz je również policzyć. Ma 178 znaków według mojej liczby.
manatwork
1

CJam - 29

l0N]s7078571876784728737Ab\f=

CJam to nowy język, który rozwijam, podobny do GolfScript - http://sf.net/p/cjam . Oto wyjaśnienie:

lodczytuje wiersz od wejścia
0oznacza liczbę 0
Njest zmienną preinitialized do nowej linii ciąg
]gromadzi elementów na stosie w tablicy
skonwertuje wartość (array) do sznurka, przez co dodanie zero i do nowej linii dla danego wejścia
7078571876784728737jest liczba (ten sam numer, którego użyłem w pythonie, ale tam był szesnastkowy)
A to zmienna wstępnie zainicjalizowana na 10,
bktóra dokonuje konwersji podstawowej, generując tablicę [7 0 7 8 ... 3 7]
\zamienia dwie ostatnie wartości na stosie
f=stosuje =operator (tutaj indeksowany dostęp do tablicy) do ciągu wejściowego (plus zero i znak nowej linii) i każdy numer 7, 0, 7, ...
Indeks 7 odpowiada dołączonemu zeru, a 8 odpowiada dołączonemu znakowi nowej linii.

Moje rozwiązanie Pythona robi dokładnie to samo (z tym wyjątkiem, że separacja cyfr odbywa się poprzez konwersję ciągów)

aditsu
źródło
Na co tu patrzę? Chcesz krótko wyjaśnić kod?
daniero
@daniero Dodałem wyjaśnienie
aditsu
1

VBA, 188 znaków

Zauważ, że musi on wpisać 188 znaków, jeśli zawiera tylko obowiązkowe białe znaki - IDE rozszerza je po skopiowaniu do edytora 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

Niestety, VBScript nie ma silnie typowanej tablicy Bajtów lub że ta metoda może być znacznie krótsza.

Komintern
źródło
1

JavaScript (ECMAScript 2016) - 108 bajtów

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

To prawdopodobnie może być grałem dalej, ale nie mogę myśleć o niczym.

M. Dirr
źródło
Witamy na stronie! To fajny pierwszy wpis :)
daniero
1

JavaScript, 148 bajtów

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

Wypróbuj online! (Stopka to Node.js do przeczytania.input.tio )

Akceptuje wprowadzanie ABCDEFG w flagach binarnych i zwraca:

 #
# #
 #
# #
 #
facepalm42
źródło
0

SmileBASIC, 136 bajtów

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

Dane wyjściowe są graficzne.

12Me21
źródło
0

05AB1E , 4 bajty

C₄+ç

Wypróbuj online lub sprawdź wszystkie możliwe dane wejściowe .

Zobacz weryfikację wszystkich możliwych danych wejściowych link powyżej, aby zobaczyć mapowanie zastosowane dla każdego wejścia.

Wyjaśnienie:

Narusza to zasady, w których stwierdza:

To, jak reprezentujesz wyświetlacz, zależy od Ciebie - pojedynczy symbol Unicode lub ASCII , grafika ASCII, graficznie lub cokolwiek, co możesz wymyślić. Jednak każde wejście musi mieć własne odrębne wyjście.

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)

Alternatywą bardziej w duchu wyzwania przy użyciu formatu wyjściowego:

 -
| |
 -
| |
 -

38 bajtów :

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

Z pewnością można grać w golfa ..

Wypróbuj online lub sprawdź wszystkie możliwe dane wejściowe .

Wyjaśnienie:

Σ       }          # 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 -"

Zobacz moją wskazówkę 05AB1E ( rozdział Jak kompresować duże liczby całkowite? ), Aby zrozumieć, dlaczego tak •L7וjest 1367524.

Kevin Cruijssen
źródło
0

PHP 5.6, 65 bajtów zwykły ASCII

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

lub bez końca linii, ale z odrobiną zabawy:

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

Uruchom jako potok z -nRlub wypróbuj je online .

podział 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
;

podział 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
Tytus
źródło
1
To, czy język jest nowy czy stary, nie ma już znaczenia od lata 2017 roku . Więc nie będziesz musiał wspominać o niekonkurowaniu.
Kevin Cruijssen
@KevinCruijssen Dzięki, że mi tego brakowało. Ale jest też miłym wyzwaniem, aby ożywić stare wersje PHP; czasami daje też inne spojrzenie na nowsze funkcje: czasami stwierdziłem, że „stary” sposób jest bardziej wydajny (pod względem wielkości, wydajności, czytelności, a czasem wszystkich trzech) niż używanie rzeczy, które zostały dodane do PHP później W tym przypadku nie ma jednak żadnej przewagi golfowej: pierwsze podejście wymagałoby 8 dodatkowych bajtów, drugie 5.
Tytus