Emula un display a 7 segmenti


24

Compito

Il compito è di visualizzare uno qualsiasi dei 128 stati possibili di un display a 7 segmenti .

Il programma dovrebbe accettare una stringa di 7 caratteri ("bit") che sono 0o 1. Il primo bit di input corrisponde al segmento A della seguente illustrazione, il secondo a B, ecc. (Ignora dp):

7SEG

Il modo in cui rappresenti il ​​display dipende da te: un singolo simbolo Unicode o ASCII, un'arte ASCII , graficamente o qualsiasi altra cosa tu possa inventare. Tuttavia, ogni input deve avere un output distinto. Se ti viene in mente qualcosa di stravagante, sono sicuro che puoi raccogliere voti mostrando alcuni esempi.

Tutti i 128 possibili stati del display sono:

stati

Regole

  • Codegolf
  • Come ho detto, è consentito qualsiasi tipo di output, ma sarebbe bello se lo specificassi.
  • L'input può essere stdin o argomento della riga di comando.

Esempi

Ingresso

1101101

Produzione

Come ASCII / Unicode:
2
Diversi tipi di arte ASCII (non sono troppo bravo in questo)
 _   ╺┓  ╒╗   ---
 _|  ┏┛  ╔╝     |
|_   ┗╸  ╚╛   ---
              |
              ---


@DavidCarraher: sono imparentati, sì; Mi sono persino collegato ad esso da solo. Tuttavia, questo è leggermente più difficile, direi, poiché hai 118 più "numeri" da generare. La maggior parte (?) Delle risposte all'altra domanda non funzionerebbe qui o dovrebbe essere pesantemente riscritta. Inoltre, qui non è necessario codificare i diversi numeri, quindi potrebbero essere possibili altre ottimizzazioni.
daniero,

Hai ragione. Grazie per la segnalazione.
DavidC,

è un requisito che utilizziamo la codifica fornita? ad es. "1101101" dovrebbe sempre rappresentare "2"?
Ardnew,

@ardnew: si. La posizione dei bit in input dovrebbe essere mappata nell'ordine alfabetico dei segmenti da A a G nella prima immagine.
daniero,

Risposte:


5

J (51)

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

produzione:

1101101
 ## 
   #
 ## 
#   
 ## 

1
Questo può essere rasata fino a 38 char con un piccolo sforzo: 1 2 1#"1' #'{~5 3$,0,.502 A.".&>1!:1]1.
algoritmo

16

C, 106

La dimensione è di 74 caratteri se è possibile rinominare il programma "W00WG5WW1GW66WG4WW2GW33WG"

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

in esecuzione:

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

gli appunti:

'W' e 'G' (0x47 e 0x57) sono scelti in modo tale che il valore & 7 = 7, cioè indicizzano in modo sicuro il carattere null che termina la stringa di input.


15

Brainfuck - 224

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

Stampa utilizzando i punti di esame:

 ! 
! !
 !
! !
 !

Non il più leggibile, ma neanche troppo orribile.

Sorpreso da quanto è vicino a non essere l'ultimo posto.


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

richiede ndi essere definito come la stringa da elaborare così invocare come

gs -g7x14 -sn=1101101 lcd.ps

ottenere

image of number two

il set completo è

complete set of characters


11

Mathematica: 135 129 118, visualizzazione delle immagini

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

spazi aggiunti "per chiarezza"

enter image description here

modificare

Per quegli utenti esigenti del sito: Senza usare una maschera esterna:

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

Il codice sembra essere incompleto. Non credo che tu volessi che il tuo programma terminasse &.
DavidC

@DavidCarraher È una funzione , quindi finisce con &.
Dr. belisarius,

Sì, ma non si applica a nulla. Come si ottiene l'output?
DavidC,

2
@belisarius Non mi piace ancora il fatto che tu abbia incorporato risorse esterne.
FUZxxl,

1
Penso che non abbia alcun senso rimuovere il mio commento precedente in quanto ciò renderebbe molto più difficile per qualcun altro seguire questa discussione. Importi dati esterni che sono divertenti come uno scherzo ma non fanno parte di una risposta seria al golf. -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]]

Esempio di input:

1101101

Produzione:

 _ 
 _|
|_ 

⍞='1' accetta l'input come una matrice di caratteri e la converte in una matrice numerica.

1 2 2 1 2 2 1×⍞='1'converte quell'array in: 0for blank, 1for _, 2for|

(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3]assegnare quell'array alla variabile xe riordinare per rappresentare i segmenti 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] concatena uno spazio vuoto, segmento A e un altro spazio vuoto nella parte anteriore

3 3⍴0,x[1],0,(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3] rimodellare in una matrice 3x3

1+3 3⍴0,x[1],0,(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3] converte in indicizzazione basata su 1

Infine utilizza la stringa ' _|'per convertire le indicazioni in caratteri


modificare

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

Hai eliminato 3 caratteri concatenando a 0per fronteggiare l'array e usando indicazioni duplicate, impedendo un'assegnazione variabile


Se il tuo APL lo supporta, penso che la funzione from{ sia più corta di 1 carattere dell'indicizzazione delle parentesi [].
Luser droog

9

PHP 66 byte

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

Un lieve miglioramento utilizzando una md5formula magica, ma richiede Altri 3 byte binari:
¡, æe Úsono caratteri 161, 230, e 218 rispettivamente. Dovrebbe funzionare come se fosse copiato direttamente e salvato come formato ANSI.


PHP 73 (70) byte

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

Se mi permetti tre caratteri binari, questo può essere ridotto a 70 byte :

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

dove ƒ, ße õsono rispettivamente i caratteri 131, 223 e 245.

Riceve input come argomento della riga di comando. Esempio di utilizzo:

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

$ php seven-seg.php 0111011

|_|
 _|

ho provato ad eseguire il tuo codice, ma sto ricevendo un sacco di errori :( non capisco la tua logica ma sembra interessante.
D34dman,

1
@ D34dman Gli unici messaggi che produrrà sono gli avvisi (variabili non definite, ecc.). Questi possono essere disattivati php.ini(per impostazione predefinita lo sono già) oppure, per i test, è possibile anteporre il seguente codice allo script:<? error_reporting(E_ALL & ~E_NOTICE); ?>
primo

eccezionale! ho funzionato: D naice!
D34dman,

7

JavaScript + jQuery + HTML + CSS ( 210 201)

Questa soluzione utilizza sprite CSS e l'immagine fornita come esempio :

HTML (3)

<a>

CSS ( 82 71)

Grazie a xem per il trucco " background: url ":

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

JavaScript (125 dopo aver rimosso le nuove righe aggiunte qui per la leggibilità)

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/


1
Ehi, ma per quanto riguarda i 17.937 byte dell'immagine ?? ;)
Thomas W.

@ThomasW. Non so se anche questo debba essere contato. Lasciamo questo all'OP per decidere.
Cristian Lupascu,

È possibile utilizzare <p>tag ed evitare display:blocksu CSS per risparmiare spazio
Roberto Maldonado,

immagine di sfondo: url ( bit.ly/VesRKL ); => background: url (// bit.ly/VesRKL);
xem,

@xem grazie per il suggerimento; Ho modificato la mia risposta
Cristian Lupascu l'

6

R (65 caratteri):

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

Si basa su alcune approssimazioni approssimative per alcuni nuumbers trascendentali ...


6

Python 2 - 65

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

Esempio:

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

5

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

Hexdump del programma usando token binari:

$ 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

Scarica questo file per provarlo.

Utilizzo dei token ASCII:

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

Il primo forallciclo mette tutte le coordinate richieste in pila. Le coordinate sono memorizzate in una stringa per ridurre al minimo lo spazio richiesto. Le coordinate sono in ordine inverso, ovvero gli ultimi 4 caratteri sono per il segmento A. Tracciamo una linea da (0,8)a (4,8)per questo segmento (in realtà, dobbiamo aggiungere 48 a tutte le coordinate, perché forallmette tutti i codici ASCII nello stack).

Il secondo forallscorre attraverso tutte le 0s 1nella stringa di input e le trasforma in un valore di grigio. 0s sono disegnati in bianco (valore grigio 1) e 1s sono disegnati in nero (valore grigio 0). Quindi usiamo le coordinate che il primo forallanello ha lasciato sulla pila per disegnare le linee.

Invoca il programma usando Ghostscript, proprio come Geoff Reedy:

gs -sn=1101101 lcd.ps

Questo mostra: Uscita campione


Penso che puoi sostituire neg 49 add(il che è fantastico a proposito) con 1 and.
Luser droog

@luserdroog: operatori brillanti e bit per bit, non ci hanno pensato. Ma deve essere not 1 andvero? Salva ancora un byte sia in ASCII che binario.
Thomas W.

Penso che ci debba essere un modo pulito con una bitmap a 1 bit. ma bitshiftè una parola così lunga.
Luser droog

Ma è solo un token binario a due byte
Thomas W.

Si. Ma in qualche modo mi sembra ancora un imbroglione . :) Sento di dover fare il più possibile con una fonte leggibile prima di ricorrere al binario.
Luser droog

4

101 86 73 69 APL

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

L'ingresso viene dallo schermo tramite ⍞

1101101

Che produce una matrice di caratteri 9x5 composta da spazi vuoti e ⎕ come segue:

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

Il numero di sette cifre viene convertito in un vettore di partizione per selezionare le coordinate ⎕.


Mi fa male la testa ...
Rob,

4

Mathematica 112 103 100 96 88, usando i grafici

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

inserisci qui la descrizione dell'immagine

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

Grafica Mathematica


Che tipo di input ti aspetti? Né [123][[123 "], né IntegerDigits[123]lavoro per me. Ottengo solo z, senza evidenziare.
DavidC,

@dude Prova `HighlightGraph [z = GridGraph @ {3, 2}, Scegli [EdgeList [z] [[{3, 4, 1, 2, 6, 7, 5}]], Characters @ #," 1 "] ] & @ "1111111" `` :)
Dr. belisarius,

3

Python (107)

Decisamente più golfabile.

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

Produzione:

1101101
 .. 
   .
   .
 .. 
.   
.   
 .. 

Spiegazione:

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

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

Spiegazione:

Con l'input stdin, utilizzare un operatore ternario improvvisato per dare il *vero e uno spazio per il falso. Prendi quei valori e inseriscili in un'istruzione di formato nel formato del display a 7 cifre. Sarebbe al massimo 83 caratteri se il display funzionasse in questo modo:

 a
b c
 d
e f
 g

ma l'ordinamento lo allunga. Qualcuno ha un modo per aggirare questo?

Esempio:

$ ./7seg.py
111000

 *
  *

  *

$ ./7seg.py


1111111

 *
* *
 *
* *
 *

1
Bello, ma quel lambda sembra inutile:; print' {0}\n{5} {1}\n {6}\n{4} {2}\n {3}'.format(*[' *'[i=='1']for i in raw_input()])) Non c'è bisogno di parentesi e spazio per l'istruzione print.
daniero,

Wow! Non sapevo che potessi mettere booleani negli indicizzatori. Grazie :-)
Brigand,

NP. Inoltre, >'0'anziché =='1'e input()(con i backtick in giro, ma ciò non verrà visualizzato a causa della formattazione qui) anziché raw_input().
daniero,

a proposito, puoi usare backtick tripple se hai bisogno di backtick nel codicex = `input()`
Brigand,

Freddo. Poi ho imparato qualcosa anche oggi :)
daniero il

3

Pensavo avessimo bisogno di una risposta concisa ...

Clojure, 159 caratteri

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

Quanto sopra verrà eseguito nel REPL e fornirà la risposta corretta. Per esempio:

1111111
 o 
o o
 o 
o o
 o 

Lanciandoli contro con piccole modifiche:

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

rendimenti:

 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

Non è facile da leggere, ma sono lì!


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)

Posso ridurre il numero di caratteri (101) se utilizziamo un solo carattere per lo stato "on", ma è meno leggibile:

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 Questo è impressionante. Sto ancora cercando di decodificarlo. Mi ha già insegnato alcune cose!
guypursey

2

Postscript 136

Non vincitore, ma un approccio diverso.

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

Si aspetta che la stringa di input sia nello stack:

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

Questo è anche peggio. 294 per creare una bitmap "binaria". Mi ci è voluto un po 'di tempo per ricordare che ogni riga è riempita con un byte pari. Quindi una bitmap 3x5 è di cinque byte con significativi 3 bit di bit.

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

L'output è brutto quanto l'altro. :(

Bene, eccone uno che sembra buono. 190

Modifica: era capovolto e al contrario. Riparato ora.

(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

Questo mi mostra alcuni schemi divertenti. C'è ancora un bug da qualche parte?
Thomas W.

hmm. si. (1111110) non sembra uno zero. È solo un bytemap ingrandito. Immagino che le scatole siano troppo semplificate. :(
luser droog

è una specie di natura di questo approccio bitmap, credo. Non sono sicuro di come renderlo non brutto.
Luser droog

Alcuni commenti chiari disponibili qui .
Luser droog

2

Mathematica 264

Far apparire l'output giusto richiedeva molti byte, quindi questa volta niente sigaro. Ma ecco comunque il codice dettagliato (264 caratteri).

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

Il set completo di caratteri:

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

Carattere di

Le cifre:

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

inserisci qui la descrizione dell'immagine


2

PHP - 155 caratteri

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

sarebbe di 150 caratteri se usiamo la dichiarazione dell'array di tipo php 5.4, ma non l'ho installato sul mio laptop, quindi non ho potuto testarlo.

Il campione esce.

inserisci qui la descrizione dell'immagine

Spiegazione:

Innanzitutto ho diviso il display a 7 segmenti in cinque righe e 3 colonne. Con la 1a, 3a e 5a fila hanno '-' nella colonna centrale, e lo spazio altrimenti.

La 2a e 4a fila hanno una pipe "|" carattere nella prima e ultima colonna. Ora la presenza di questi caratteri dovrebbe essere guidata dai valori di input.

Ho creato una tabella di ricerca, che è fondamentalmente due tabelle di ricerca. Il primo per il calcolo dei valori per la 1a, 3a e 5a fila. E un altro all'offset 2 (3 ° elemento) per il calcolo delle righe 2a e 4a.


2

Java - 204 caratteri

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

Uscita campione:

 _ 
 _|
|_ 

Formattato correttamente:

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

Vorrei davvero che potessi evitarlo per loop, ma ho provato alcune altre cose ed erano tutte più lunghe. Probabilmente c'è un modo migliore per farlo, ma questo è il mio primo tentativo di code golf. (E Java è il peggior linguaggio per questo, motivo per cui ho pensato che sarebbe stato interessante.) Anche Brainfuck mi ha battuto, ma almeno la mia produzione sembra più bella.

EDIT: può sbarazzarsi di "pubblico" in classe, mi fa risparmiare 7 caratteri!

E grazie, daniero, per avermi mostrato printf! (18 caratteri salvati)

Riscritto il formato di output, modificato i letterali dei caratteri in decimale, 12 caratteri salvati.


Benvenuto su codegolf.se! Java ha introdotto un printfmetodo alcune versioni precedenti, che è sostanzialmente printlne formatin una (come la funzione C); Questo ti farà risparmiare alcuni personaggi,
daniero,

Ecco un altro trucco: puoi combinare il "corpo" del forloop e la parte di aggiornamento in uno, salvando un personaggio:for(int i=7;i>0;c[--i]=a[0].charAt(i)==49?(i%3==0?95:'|'):32);
daniero

1

VBA - 263

È brutto ma funziona, penso. Ho problemi a visualizzare il corretto ordine dei bit, quindi desumo dalle risposte degli altri. Anche se quel pezzo è sbagliato, la lunghezza del codice dovrebbe rimanere la stessa.

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 caratteri

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

Grazie! Gli errori di coppia in bonehead mi costano 6 caratteri. Posso quasi ridurlo alla dimensione di quello VBA anche con la chiamata assurdamente lunga per ottenere l'argomento della linea di funzione.
Comintern

A meno che il tuo codice non sia funzionale senza i caratteri di nuova riga, devi contarli anche tu. Questo ha 178 caratteri secondo il mio conteggio.
arte

1

CJam - 29

l0N]s7078571876784728737Ab\f=

CJam è un nuovo linguaggio che sto sviluppando, simile a GolfScript - http://sf.net/p/cjam . Ecco la spiegazione:

llegge una riga dall'input
0è il numero 0
Nè una variabile preinizializzata nella stringa newline
]raccoglie gli elementi sullo stack in un array
sconverte un valore (l'array) in string, quindi aggiungendo uno zero e una newline all'input dato
7078571876784728737è un number (lo stesso numero che ho usato in Python, ma era lì in esadecimale)
Aè una variabile preinizializzata a 10
bfa una conversione di base, generando l'array [7 0 7 8 ... 3 7]
\scambia gli ultimi due valori nello stack
f=applica l' =operatore (qui, accesso array indicizzato) sulla stringa di input (più zero e newline) e ogni numero 7, 0, 7, ...
L'indice 7 corrisponde allo zero aggiunto e 8 corrisponde alla nuova riga aggiunta.

La mia soluzione Python fa esattamente la stessa cosa (tranne che la separazione delle cifre avviene tramite la conversione di stringhe)


Cosa sto guardando qui? Vuoi offrire una breve spiegazione del codice?
daniero,

@daniero Ho aggiunto una spiegazione
aditsu il

1

VBA, 188 caratteri

Nota che uno deve digitare 188 caratteri includendo solo gli spazi obbligatori: l'IDE lo espande quando lo copi nell'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

Sfortunatamente, VBScript non ha un array di byte fortemente tipizzato, o che uno potrebbe essere molto più breve usando questo metodo.


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

Questo probabilmente può essere ulteriormente approfondito, ma non riesco a pensare a nulla.


Benvenuti nel sito! È un bel primo ingresso :)
daniero il

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

Provalo online! (Il piè di pagina è Node.js da leggere .input.tio)

Accetta input di ABCDEFG in flag binari e restituisce:

 #
# #
 #
# #
 #

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

L'output è grafico.


0

05AB1E , 4 byte

C₄+ç

Provalo online o verifica tutti i possibili input .

Vedi il link verifica tutti gli input possibili sopra per vedere la mappatura utilizzata per ciascun input.

Spiegazione:

Questo abusa delle regole in cui afferma:

Il modo in cui rappresenti il ​​display dipende da te: un singolo simbolo Unicode o ASCII , un'arte ASCII, graficamente o qualsiasi altra cosa tu possa inventare. Tuttavia, ogni input deve avere un output distinto.

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)

Alternativa più nello spirito della sfida utilizzando il formato di output:

 -
| |
 -
| |
 -

38 byte :

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

Può sicuramente essere giocato a golf ..

Provalo online o verifica tutti i possibili input .

Spiegazione:

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

Vedere questo 05AB1E punta del mio ( sezione Come comprimere grandi numeri interi? ) Per capire il motivo per cui •L7וè 1367524.


0

PHP 5.6, 65 byte ASCII normale

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

o, senza interruzione di riga finale, ma con un po 'di divertimento bit a bit:

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

Esegui come pipe -nRo provali online .

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

ripartizione 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
Se la lingua è nuova o vecchia non ha più importanza dall'estate del 2017 . Quindi non dovrai menzionare la non competizione.
Kevin Cruijssen,

@KevinCruijssen Grazie, mi sono perso. Ma è anche una bella sfida far rivivere le vecchie versioni di PHP; a volte dà anche una visione diversa delle funzionalità più recenti: ho scoperto, a volte, che il "vecchio" modo è più efficiente (in termini di dimensioni, prestazioni, leggibilità e talvolta tutti e tre) rispetto all'utilizzo di elementi che sono stati aggiunti in seguito a PHP Nessun vantaggio nel golf in questo caso, tuttavia: il primo approccio richiederebbe 8 byte extra, il secondo 5.
Titus
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.