Meniru tampilan 7-segmen

24

Tugas

Tugasnya adalah untuk menampilkan salah satu dari 128 kemungkinan status tampilan 7-segmen .

Program Anda harus menerima string 7 karakter ("bit") yang merupakan 0atau 1. Bit input pertama berhubungan dengan segmen A dari ilustrasi berikut, yang kedua ke B, dll (abaikan dp):

7seg

Bagaimana Anda merepresentasikan tampilan terserah Anda - satu simbol Unicode atau ASCII, seni ASCII , secara grafis, atau apa pun yang dapat Anda buat. Namun, setiap input harus memiliki output sendiri yang berbeda. Jika Anda datang dengan sesuatu yang mewah saya yakin Anda dapat memanen upvotes dengan memamerkan beberapa contoh.

Ke-128 kemungkinan kondisi tampilan adalah:

menyatakan

Aturan

  • Codegolf
  • Seperti yang saya katakan, segala jenis output diperbolehkan, tetapi akan lebih baik jika Anda menentukannya.
  • Input dapat berupa argumen stdin atau baris perintah.

Contohnya

Memasukkan

1101101

Keluaran

Sebagai ASCII / Unicode:
2
Berbagai jenis seni ASCII (saya tidak terlalu pandai dalam hal ini)
 _   ╺┓  ╒╗   ---
 _|  ┏┛  ╔╝     |
|_   ┗╸  ╚╛   ---
              |
              ---
daniero
sumber
Terkait erat dengan codegolf.stackexchange.com/questions/997/… ?
DavidC
@ Davidvidarraher: Mereka terkait, ya; Saya bahkan menautkannya sendiri. Namun, ini sedikit lebih sulit saya katakan, karena Anda memiliki 'angka' 118 lebih untuk menghasilkan Sebagian besar (?) Jawaban untuk pertanyaan lain tidak akan berfungsi di sini, atau harus ditulis ulang secara mendalam. Selain itu, di sini Anda tidak perlu menyandikan angka yang berbeda, jadi pengoptimalan lainnya harus dimungkinkan.
daniero
Anda benar. Terima kasih telah menunjukkannya.
DavidC
itu adalah persyaratan bahwa kami menggunakan pengkodean yang Anda berikan? mis. "1101101" harus selalu mewakili "2"?
ardnew
@ardnew: ya. Posisi bit dalam input harus dipetakan ke urutan abjad dari segmen A ke G pada gambar pertama.
daniero

Jawaban:

5

J (51)

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

keluaran:

1101101
 ## 
   #
 ## 
#   
 ## 
marinus
sumber
1
Hal ini dapat dicukur ke 38 char dengan sedikit usaha: 1 2 1#"1' #'{~5 3$,0,.502 A.".&>1!:1]1.
algorithmshark
16

C, 106

Ukurannya adalah 74 karakter jika diizinkan mengubah nama program "W00WG5WW1GW66WG4WW2GW33WG"

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

berlari:

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

catatan:

'W' dan 'G' (0x47 dan 0x57) dipilih sedemikian rupa sehingga nilai & 7 = 7, yaitu mereka dengan aman mengindeks karakter nol yang mengakhiri string input.

bayi-kelinci
sumber
15

Brainfuck - 224

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

Mencetak menggunakan poin Exlamation:

 ! 
! !
 !
! !
 !

Bukan yang paling mudah dibaca, tapi juga tidak terlalu mengerikan.

Terkejut melihat seberapa dekat ini dengan tidak menjadi tempat terakhir.

captncraig
sumber
13

Catatan tambahan 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

perlu ndidefinisikan sebagai string untuk memproses sehingga memanggil seperti

gs -g7x14 -sn=1101101 lcd.ps

mendapatkan

gambar nomor dua

set lengkapnya adalah

set karakter lengkap

Geoff Reedy
sumber
11

Mathematica: 135 129 118, tampilan gambar

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

spasi ditambahkan "untuk kejelasan"

masukkan deskripsi gambar di sini

Edit

Bagi pengguna situs pemilih yang pilih-pilih: Tanpa menggunakan topeng eksternal:

Image[MorphologicalComponents[ColorNegate@Rasterize@8, CornerNeighbors -> False] /. 
    Thread[Range@7 ->IntegerDigits[#, 2, 7][[{7, 2, 6, 1, 3, 5, 4}]]]] &
Belisarius
sumber
Kode tampaknya tidak lengkap. Saya tidak berpikir Anda ingin program Anda berakhir &.
DavidC
@DavidCarraher Ini adalah fungsi , jadi diakhiri dengan &.
Dr. belisarius
Ya, tapi itu tidak berlaku untuk apa pun. Bagaimana cara mendapatkan output?
DavidC
2
@belisarius Saya masih tidak suka fakta bahwa Anda menanamkan sumber daya eksternal.
FUZxxl
1
Saya pikir tidak masuk akal untuk menghapus komentar saya sebelumnya karena itu akan membuat lebih sulit bagi orang lain untuk mengikuti diskusi ini. Anda mengimpor data eksternal yang lucu sebagai lelucon tetapi bukan bagian dari jawaban golf kode serius. -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]]

Input contoh:

1101101

Keluaran:

 _ 
 _|
|_ 

⍞='1' mengambil input sebagai array karakter dan mengubahnya menjadi array numerik.

1 2 2 1 2 2 1×⍞='1'mengonversi array itu menjadi: 0untuk kosong, 1untuk _, 2untuk|

(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3] tetapkan array itu ke variabel x dan menyusun ulang untuk mewakili segmen 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] menyatukan blank, segmen A dan blank lainnya ke depan

3 3⍴0,x[1],0,(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3] membentuk kembali ke matriks 3x3

1+3 3⍴0,x[1],0,(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3] dikonversi ke pengindeksan berbasis 1

Akhirnya menggunakan string ' _|'untuk mengubah indeks menjadi karakter


Edit

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

Memotong 3 karakter dengan menggabungkan a 0ke depan array dan menggunakan indeks duplikat, mencegah penugasan variabel

TwiNight
sumber
Jika APL Anda mendukungnya, saya pikir fungsi dari{ 1-char lebih pendek dari pengindeksan braket [].
luser droog
9

PHP 66 byte

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

Sebuah sedikit perbaikan menggunakan md5rumus ajaib, tetapi membutuhkan 3 tambahan byte biner:
¡, æ, dan Úkarakter 161, 230, dan 218 masing-masing. Ini harus berfungsi sebagaimana jika disalin secara langsung, dan disimpan sebagai format ANSI.


PHP 73 (70) byte

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

Jika Anda mengizinkan saya tiga karakter biner, ini dapat dikurangi menjadi 70 byte :

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

di mana ƒ, ßdanõ karakter 131, 223, dan 245 masing-masing.

Menerima input sebagai argumen baris perintah. Penggunaan sampel:

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

$ php seven-seg.php 0111011

|_|
 _|
primo
sumber
saya mencoba menjalankan kode Anda, tetapi saya mendapatkan banyak kesalahan :( saya tidak mengerti logika Anda tetapi tampaknya menarik.
D34dman
1
@ D34dman Satu-satunya pesan yang akan dihasilkan adalah pemberitahuan (variabel tidak terdefinisi, dll). Ini dapat dimatikan php.ini(secara default sudah ada), atau untuk pengujian, Anda dapat menambahkan kode berikut ke skrip:<? error_reporting(E_ALL & ~E_NOTICE); ?>
primo
luar biasa! saya berhasil: D naice!
D34dman
7

JavaScript + jQuery + HTML + CSS ( 210 201)

Solusi ini menggunakan sprite CSS dan gambar yang disediakan sebagai contoh :

HTML (3)

<a>

CSS ( 82 71)

Terima kasih kepada xem untuk trik " background: url ":

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

JavaScript (125 setelah menghapus baris baru yang ditambahkan di sini agar dapat dibaca)

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

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

Cristian Lupascu
sumber
1
Hei, tapi bagaimana dengan 17.937 byte gambar ?? ;)
Thomas W.
@ Thomas. Saya tidak tahu apakah itu harus dihitung juga. Mari serahkan ini pada OP untuk memutuskan.
Cristian Lupascu
Anda dapat menggunakan <p>tag dan menghindari display:blockCSS untuk menghemat ruang
Roberto Maldonado
background-image: url ( bit.ly/VesRKL ); => latar belakang: url (// bit.ly/VesRKL);
xem
@ xem terima kasih atas tipnya; Saya telah mengedit jawaban saya
Cristian Lupascu
6

R (65 karakter):

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

Bergantung pada beberapa perkiraan yang longgar untuk beberapa ...

Patrick Caldon
sumber
6

Python 2 - 65

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

Contoh:

echo 1101101|python2 7seg.py
0 1 0 
0 0 1 
0 1 0 
1 0 0 
0 1 0
aditsu
sumber
5

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

Hexdump program menggunakan token biner:

$ 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

Unduh file ini untuk mencobanya.

Menggunakan token ASCII:

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

forallLoop pertama menempatkan semua koordinat yang diperlukan pada stack. Koordinat disimpan dalam string untuk meminimalkan ruang yang dibutuhkan. Koordinat berada dalam urutan terbalik, yaitu 4 karakter terakhir adalah untuk segmen A. Kami menarik garis dari (0,8)ke (4,8)untuk segmen ini (sebenarnya, kami harus menambahkan 48 ke semua koordinat, karena forallmenempatkan semua kode ASCII pada tumpukan).

Yang kedua forallloop melalui semua 0s dan 1s di string input dan mengubahnya menjadi nilai abu-abu. 0s digambar putih (nilai abu-abu 1) dan 1s digambar hitam (nilai abu-abu 0). Kemudian kita menggunakan koordinat yang forallloop pertama kiri di tumpukan untuk menggambar garis.

Aktifkan program menggunakan Ghostscript, seperti Geoff Reedy:

gs -sn=1101101 lcd.ps

Ini menampilkan: Output sampel

Thomas W.
sumber
Saya pikir Anda dapat mengganti neg 49 add(yang mengagumkan btw) dengan 1 and.
luser droog
@luserdroog: Operator yang brilian, bitwise, belum memikirkannya. Tetapi itu harus not 1 andbenar, bukan? Masih menyimpan satu byte di ASCII dan biner.
Thomas W.
Saya merasa pasti ada cara yang rapi dengan bitmap 1bit. tapi bitshiftkata yang panjang.
luser droog
Tapi itu hanya token biner dua byte
Thomas W.
Ya. Tapi entah kenapa masih terasa seperti curang bagiku. :) Saya merasa perlu melakukan sebanyak mungkin dengan sumber yang dapat dibaca sebelum beralih ke biner.
luser droog
4

APL 101 86 73 69

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

Input dari layar melalui ⍞

1101101

Yang menghasilkan matriks karakter 9x5 terdiri dari kosong dan and sebagai berikut:

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

Tujuh digit angka diubah menjadi vektor partisi untuk memilih koordinat ⎕.

Graham
sumber
Kepalaku sakit ...
Rob
4

Mathematica 112 103 100 96 88, menggunakan Grafik

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

masukkan deskripsi gambar di sini

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

Grafik Mathematica

Belisarius
sumber
Masukan seperti apa yang Anda harapkan? Baik [123][[123 "]] maupun IntegerDigits[123]bekerja untuk saya. Saya hanya mendapatkan z, tanpa menyoroti.
DavidC
@ Bung Coba `SorotGraph [z = GridGraph @ {3, 2}, Pilih [EdgeList [z] [[{3, 4, 1, 2, 6, 7, 5}]], Karakter @ #," 1 "] ] & @ "1111111" `` :)
Dr. belisarius
3

Python (107)

Jelas lebih golf.

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

Keluaran:

1101101
 .. 
   .
   .
 .. 
.   
.   
 .. 

Penjelasan:

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
sumber
3

Python 2.7 (93 karakter):

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

Penjelasan:

Dengan input stdin, gunakan operator ternary darurat untuk memberikan yang *benar dan ruang untuk yang salah. Ambil nilai-nilai itu dan hubungkan ke dalam format pernyataan yang ada dalam format tampilan 7 digit. Paling banyak 83 karakter jika tampilan berfungsi seperti ini:

 a
b c
 d
e f
 g

tapi pemesanan membuatnya lebih lama. Adakah yang bisa mengatasi ini?

Contoh:

$ ./7seg.py
111000

 *
  *

  *

$ ./7seg.py


1111111

 *
* *
 *
* *
 *
Perampok
sumber
1
Bagus, tetapi lambda itu tampaknya tidak perlu:; print' {0}\n{5} {1}\n {6}\n{4} {2}\n {3}'.format(*[' *'[i=='1']for i in raw_input()])) Tidak perlu kurung dan ruang untuk pernyataan cetak.
daniero
Wow! Saya tidak tahu Anda bisa menempatkan booleans di pengindeks. Terima kasih :-)
Brigand
Np. Selain itu, >'0'alih-alih =='1'dan input()(dengan backticks ada, tetapi itu tidak akan muncul karena pemformatan di sini) raw_input().
daniero
fyi, Anda dapat menggunakan backpicks tripple jika Anda perlu backticks dalam kodex = `input()`
Brigand
Keren. Kemudian saya belajar sesuatu hari ini juga :)
daniero
3

Saya pikir kami membutuhkan jawaban lispy ...

Clojure, 159 karakter

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

Di atas akan berjalan di REPL dan memberikan jawaban yang benar. Sebagai contoh:

1111111
 o 
o o
 o 
o o
 o 

Melemparkan angka dengan modifikasi kecil:

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

hasil:

 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

Tidak mudah dibaca, tetapi mereka ada di sana!

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

Saya dapat menurunkan jumlah karakter (101) jika kami hanya menggunakan satu karakter untuk status "on", tetapi kurang terbaca:

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
sumber
+1 Ini mengesankan. Saya masih mencoba merekayasa balik. Itu sudah mengajarkan saya beberapa hal!
guypursey
2

Catatan tambahan 136

Bukan pemenang, tetapi pendekatan yang berbeda.

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

Mengharapkan string input berada di tumpukan:

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

Yang ini bahkan lebih buruk. 294 untuk membuat bitmap "biner". Saya butuh beberapa saat untuk mengingat bahwa setiap baris diisi dengan byte genap. Jadi bitmap 3x5 adalah lima byte dengan bit 3 msb signifikan.

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

Output sama jeleknya dengan yang lain. :(

Baiklah inilah yang terlihat bagus. 190

Sunting: Itu terbalik dan mundur. Diperbaiki sekarang

(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
sumber
Ini menunjukkan saya beberapa pola lucu. Apakah masih ada bug di suatu tempat?
Thomas W.
hmm ya. (1111110) tidak terlihat seperti nol. Itu hanya bytemap yang diperbesar. Saya kira kotak terlalu disederhanakan. :(
luser droog
itu baik dalam sifat pendekatan bitmap ini, saya pikir. Saya tidak yakin bagaimana membuatnya tidak jelek.
luser droog
Beberapa komentar ringan tersedia di sini .
luser droog
2

Mathematica 264

Mendapatkan output agar terlihat benar memerlukan banyak byte, jadi jangan cerutu kali ini. Tapi inilah kode verbose (264 karakter).

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

Set karakter lengkap:

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

karakteris

Digit:

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

masukkan deskripsi gambar di sini

DavidC
sumber
2

PHP - 155 karakter

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

itu akan menjadi 150 karakter jika kita menggunakan deklarasi array tipe php 5.4, tetapi saya tidak menginstalnya di laptop saya jadi tidak bisa mengujinya.

Contoh put out.

masukkan deskripsi gambar di sini

Penjelasan:

Pertama saya membagi tampilan 7 segmen menjadi Lima baris dan 3 kolom. Dengan baris 1, 3, dan 5 havimg '-' di kolom tengah, dan spasi sebaliknya.

Baris ke-2 dan ke-4 memiliki pipa '|' karakter di kolom pertama dan terakhir. Sekarang keberadaan karakter ini harus dipandu oleh nilai input.

Saya membuat tabel pencarian, yang pada dasarnya adalah dua tabel pencarian. Yang pertama untuk perhitungan nilai untuk baris 1, 3 dan 5. Dan satu lagi di offset 2 (item ke-3) untuk perhitungan baris ke-2 dan ke-4.

D34man
sumber
2

Java - 204 karakter

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

Output sampel:

 _ 
 _|
|_ 

Diformat dengan benar:

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

Sungguh berharap saya bisa menghindari itu untuk loop, tetapi saya mencoba beberapa hal lain dan mereka semua lebih lama. Mungkin ada cara yang lebih baik untuk melakukan ini, tetapi ini adalah upaya pertama saya di golf kode. (Dan Java seperti bahasa terburuk untuk itu, itulah sebabnya saya pikir itu akan menarik.) Bahkan Brainfuck telah mengalahkan saya, tetapi setidaknya output saya terlihat lebih bagus.

EDIT: dapat menyingkirkan "publik" di kelas, menyelamatkan saya 7 karakter!

Dan terima kasih, daniero, karena menunjukkan kepadaku printf! (18 karakter tersimpan)

Menulis ulang format output, mengubah literal karakter menjadi desimal, 12 karakter disimpan.

pemecah kode
sumber
Selamat datang di codegolf.se! Java memperkenalkan printfmetode beberapa versi kembali, yang pada dasarnya printlndan formatdalam satu (seperti fungsi C); Ini akan menghemat beberapa karakter,
daniero
Berikut trik lain: Anda dapat menggabungkan "tubuh" forloop dan bagian pembaruan menjadi satu, menghemat satu karakter:for(int i=7;i>0;c[--i]=a[0].charAt(i)==49?(i%3==0?95:'|'):32);
daniero
1

VBA - 263

Itu jelek tapi berhasil, saya pikir. Saya mengalami masalah dalam melihat urutan bit yang tepat, jadi saya menyimpulkan dari jawaban orang lain. Bahkan jika potongan itu salah, panjang kode harus tetap 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
sumber
1

VBScript - 178 karakter

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
sumber
Terima kasih! Kekeliruan pasangan Bonehead membuat saya kehilangan 6 karakter Saya hampir bisa mendapatkan ini ke ukuran satu VBA bahkan dengan panggilan panjang bukan kepalang untuk mendapatkan argumen garis fungsi.
Comintern
Kecuali jika kode Anda berfungsi tanpa karakter baris baru, Anda harus menghitungnya juga. Ini memiliki 178 karakter menurut hitungan saya.
manatwork
1

CJam - 29

l0N]s7078571876784728737Ab\f=

CJam adalah bahasa baru yang saya kembangkan, mirip dengan GolfScript - http://sf.net/p/cjam . Berikut penjelasannya:

lmembaca garis dari input
0adalah angka 0
Nadalah variabel yang diinisialisasi ke string baris baru
]mengumpulkan elemen-elemen pada stack menjadi array yang
smengubah nilai (array) menjadi string, sehingga menambahkan nol dan baris baru ke input yang diberikan
7078571876784728737adalah angka (angka yang sama yang saya gunakan dalam python, tetapi dalam hex di sana)
Aadalah variabel yang diinisialisasi ke 10
bmelakukan konversi basis, menghasilkan array [7 0 7 8 ... 3 7]
\ menukar dua nilai terakhir pada stack
f=berlaku =operator (di sini, akses array yang diindeks) pada string input (ditambah nol dan baris baru) dan masing-masing nomor 7, 0, 7, ...
Indeks 7 sesuai dengan nol yang ditambahkan, dan 8 sesuai dengan baris yang ditambahkan.

Solusi python saya melakukan hal yang persis sama (kecuali pemisahan digit dilakukan melalui konversi string)

aditsu
sumber
Apa yang saya lihat di sini? Ingin memberikan penjelasan singkat tentang kode?
daniero
@daniero Saya menambahkan penjelasan
aditsu
1

VBA, 188 karakter

Perhatikan bahwa seseorang harus mengetikkan 188 karakter jika hanya menyertakan spasi kosong wajib - IDE memperluasnya saat Anda menyalinnya ke editor 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

Sayangnya, VBScript tidak memiliki array Byte yang sangat diketik, atau yang bisa lebih pendek menggunakan metode ini.

Komintern
sumber
1

Javascript (ECMAScript 2016) - 108 byte

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

Ini mungkin bisa bermain golf lebih jauh, tetapi saya tidak bisa memikirkan apa pun.

M Dirr
sumber
Selamat datang di situs ini! Itu entri pertama yang bagus :)
daniero
1

JavaScript, 148 byte

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

Cobalah online! (Footer adalah Node.js untuk dibaca .input.tio)

Menerima input ABCDEFG dalam flag biner dan mengembalikan:

 #
# #
 #
# #
 #
facepalm42
sumber
0

SmileBASIC, 136 byte

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

Outputnya grafis.

12Me21
sumber
0

05AB1E , 4 byte

C₄+ç

Cobalah secara online atauverifikasi semua input yang mungkin .

Lihat memverifikasi semua input yang mungkin atas untuk melihat pemetaan yang digunakan untuk setiap input.

Penjelasan:

Ini menyalahgunakan aturan di mana ia menyatakan:

Bagaimana Anda merepresentasikan tampilan terserah Anda - satu simbol Unicode atau ASCII , seni ASCII, secara grafis, atau apa pun yang dapat Anda buat. Namun, setiap input harus memiliki output sendiri yang berbeda.

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)

Alternatif lain dalam semangat tantangan menggunakan format-output:

 -
| |
 -
| |
 -

38 byte :

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

Pasti bisa bermain golf ..

Cobalah online atau verifikasi semua input yang mungkin .

Penjelasan:

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

Lihat ini 05AB1E ujung tambang ( bagian Cara kompres bilangan bulat besar? ) Untuk memahami mengapa •L7וadalah 1367524.

Kevin Cruijssen
sumber
0

PHP 5.6, 65 byte ASCII polos

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

atau, tanpa linebreak tambahan, tetapi dengan sedikit kesenangan:

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

Jalankan sebagai pipa dengan -nRatau coba online .

gangguan 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
;

gangguan 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
Titus
sumber
1
Apakah bahasanya baru atau lama tidak masalah lagi sejak Musim Panas 2017 . Jadi, Anda tidak perlu menyebutkan non-bersaing.
Kevin Cruijssen
@KevinCruijssen Terima kasih saya melewatkannya. Tapi itu juga tantangan yang bagus untuk menghidupkan kembali versi PHP lama; terkadang juga memberikan pandangan yang berbeda pada fitur yang lebih baru: Saya menemukan, kadang-kadang, bahwa cara "lama" lebih efisien (dalam ukuran, dalam kinerja, dalam keterbacaan dan kadang-kadang ketiganya) daripada menggunakan hal-hal yang ditambahkan ke PHP nanti Tidak ada keuntungan bermain golf dalam kasus ini: pendekatan pertama akan membutuhkan 8 byte tambahan, yang kedua 5.
Titus