Fammi un chip QFP!


23

Fammi un chip QFP!

Dalla sandbox!

QFP è un tipo di fattore di forma per un componente elettrico in cui i pin escono dai lati di un chip. Ecco un'immagine di un tipico componente QFP:
inserisci qui la descrizione dell'immagine

puoi vedere che la formula generale è di avere 4 lati di uguale numero di pin.

La tua sfida è creare un programma che includa un numero intero, che rappresenta il numero di pin su un lato e crea un componente ASCII QFP con pin numerati.

Ingresso:

un singolo intero che rappresenta il numero di pin su un lato

Produzione:

Un chip ASCII QFP con una piedinatura appropriata.

Esempio:

ingresso: 1

  4
 ┌┴┐
1┤ ├3
 └┬┘
  2

Ingresso: 2

  87
 ┌┴┴┐
1┤ ├6
2┤ ├5
 └┬┬┘
  34

ingresso: 12

   444444444333
   876543210987
  ┌┴┴┴┴┴┴┴┴┴┴┴┴┐
 1┤ ├36
 2┤ ├35
 3┤ ├34
 4┤ ├33
 5┤ ├32
 6┤ ├31
 7┤ ├30
 8┤ ├29
 9┤ ├28
10┤ ├27
11┤ ├26
12┤ ├25
  └┬┬┬┬┬┬┬┬┬┬┬┬┘
   111111122222
   345678901234

Regole:

  • tutti i chip QFP devono essere chiusi e sigillati così come ascii fornisce. la spaziatura è della massima importanza. La polvere all'interno di un microprocessore è roba cattiva!
  • la numerazione dei pin deve essere eseguita come negli esempi (leggi da sinistra a destra, dall'alto verso il basso, numerato in senso antiorario)
  • È possibile iniziare la numerazione da 0, ma ciò non deve influire sul chip (un input di 12 richiede comunque 12 pin per lato)
  • Gli unici caratteri validi nel tuo output sono 1,2,3,4,5,6,7,8,9,0,┌,┴,┐,├,┘,┬,└,┤, spazi e newline.
  • sono consentite tutte le codifiche per le lingue, ma l'output DEVE essere coerente con le regole sopra.

Questo è un codegolf e come tale vince il codice con il minor numero di byte! In bocca al lupo!


2
Lo zero deve essere gestito.
Magic Octopus Urn

1
No tu no.
tuskiomi,

Qualche limite superiore sull'input?
Arnauld,

I limiti di @Arnauld dovrebbero essere solo overflow e limiti basati sulla lingua
tuskiomi l'

1
"tutti i chip QFP devono essere chiusi e sigillati così come ascii provvede." La metà dei caratteri indicati non è ASCII.
Giordania,

Risposte:


3

Mathematica, 271 byte

c=Table;d=StringPadLeft[#<>"\n",(b=IntegerLength[4a])+a+2]&/@(#)&;d@Reverse@#4<>{e=" "~c~b,"┌"<>"┴"~c~a,"┐
",({#,"┤"," "~c~a,"├",#2,"
"}&)~MapThread~{#,Reverse@#3},e,"└","┬"~c~a,"┘
",d@#2}&@@Partition[Characters@StringPadLeft[ToString/@Range[4#]],a=#]&

Funzione anonima. Accetta un numero come input e restituisce una stringa come output. Il carattere Unicode senza disegno a scatola è U + F3C7 (uso privato) per \[Transpose].


7

Kotlin , 397 393 byte

Lambda senza nome.

Puoi provarlo qui , ma dovrai incollare la fonte in te stesso perché l'editor non sembra salvare i programmi nella codifica UTF-8. La versione ungolf è un programma completo, quindi dovresti essere in grado di utilizzarlo nella sua interezza.

golfed

{n:Int->operator fun String.mod(x:Int){(1..x).map{print(this)}};val l={s:String->s.padStart(n/10+2)};var s=(1..n).map{"${n*4+1-it}".reversed()};val z={i:Int->l(" ")%1;s.map{print(it.getOrElse(i,{' '}))};"\n"%1};(s[0].length-1 downTo 0).map(z);l("┌")%1;"┴"%n;"┐\n"%1;(1..n).map{l("$it┤")%1;" "%n;"├${n*3+1-it}\n"%1};l("└")%1;"┬"%n;"┘\n"%1;s=(1..n).map{"${n+it}"};(0..s.last().length-1).map(z)}

(Sorta di) Ungolfed

fun main(args: Array<String>) {
    var q = { n: Int ->
        operator fun String.mod(x: Int) {
            (1..x).map { print(this) }
        }

        val l = { s: String ->
            s.padStart(n / 10 + 2)
        }

        var s = (1..n).map { "${n * 4 + 1 - it}".reversed() }

        val z = { i: Int ->
            l(" ")%1
            s.map { print(it.getOrElse(i, { ' ' })) }
            "\n"%1
        }

        (s[0].length - 1 downTo 0).map(z)

        l("┌")%1
        "┴"%n
        "┐\n"%1

        (1..n).map { l("$it┤") % 1;" " % n;"├${n * 3 + 1 - it}\n" % 1 }

        l("└")%1
        "┬"%n
        "┘\n"%1

        s = (1..n).map { "${n + it}" }
        (0..s.last().length - 1).map(z)
    }

    q(30)
}

Ho salvato un sacco di byte sovraccaricando l' %operatore e utilizzandolo per stampare. Probabilmente lo rivedrò più tardi - penso di poter salvare parecchi byte se uso modo qualche altro operatore come funzione di concatenazione. Più interpolazione e meno chiamate di stampa.


Certo, lasciami includere un programma completo.
Tyler MacDonell,

1
@tuskiomi Ora dovresti essere in grado di utilizzare la versione non golfata nella sua interezza.
Tyler MacDonell,

Un'ottima soluzione!
tuskiomi,

3

Python 2, 352 343 331 byte

def q(n,j=''.join,k='\n'.join,m=map):a,b,c,d=zip(*[iter(m(str,range(n*4)))]*n);l=len(`n-1`);r=lambda x:k(m(lambda s:' '*(l+1)+j(s),m(j,[m(lambda t:t or' ',v)for v in m(None,*x)])));return k([r(d[::-1]),' '*l+u'┌'+u'┴'*n+u'┐',k(x.rjust(l)+u'┤'+' '*n+u'├'+y for x,y in zip(a,c[::-1])),' '*l+u'└'+u'┬'*n+u'┘',r(b)])

Provalo qui. Nota che il file deve iniziare con la distinta base UTF-8 \xef\xbb\xbfaffinché i letterali unicode funzionino nell'interprete CPython standard. Questi 3 byte vengono conteggiati rispetto alla dimensione qui. repl.itsta già utilizzando Unicode, quindi il link ha solo il codice mostrato qui.

Grazie @tuskiomi per l'idea di codifica che ha salvato 9 21 byte.

Parzialmente non golfato:

def q(n):
  a,b,c,d = zip(*[iter(map(str,range(n*4)))]*n) # get numbers for sides
  l = len(`n-1`) # left padding
  r = lambda x: '\n'.join(
    map(lambda s: ' '*(l+1) + ''.join(s), # padding and row of digits
      map(''.join,
        [map(lambda t: t or ' ', v)  # rows of digits with spaces where missing
          for v in map(None, *x)]))
  )
  return '\n'.join([
    r(d[::-1]), # top row in reverse order
    ' '*l+u'\u250c'+u'\u2534'*n+u'\u2510', # top border
    # 1st, 3rd (reversed) side numbers
    '\n'.join(x.rjust(l) + u'\u2524'+ ' '*n + u'\u251c' + y for x,y in zip(a,c[::-1])),
     ' '*l+u'\u2514'+u'\u252c'*n+u'\u2518', # bottom border
    r(b) # bottom numbers
  ])

Coerente e veloce. Meraviglioso!
tuskiomi,

strano. Online, questo stampa perfettamente. tuttavia sull'IDLE del mio computer, stampa letterali anziché punti di codice. Ancora una risposta valida, ma potresti essere in grado di giocarci ulteriormente usando i caratteri reali invece di punti di codice!
tuskiomi l'

Ho pensato che avrei dovuto # -*- coding: utf-8 -*-aggiungere una nuova riga in alto affinché l'interprete lo accettasse. La codifica UTF-8 di ciascuno di quei caratteri è di 3 byte, quindi non è bastato pagare per il costo della direttiva di codifica. Ho appena controllato PEP 263 e posso cavarmela con solo #coding=utf-8e una nuova riga in modo da risparmiare qualche byte.
Jake Cobb,

1
Apparentemente funziona anche la DBA UTF-8 a tre byte.
Jake Cobb l'

3

JavaScript (ES6), 295 284 byte (268 caratteri), non concorrenziale

n=>(a=[...(' '[r='repeat'](W=n+6)+`
`)[r](W++)],a.map((_,i)=>i<n*2&&([p,s,L,R,C]=i<n?[(i+3)*W-1,1,i+1,n*3-i,0]:[i-n+3-W,W,n*5-i,i+1,1],[...(' '+L).slice(-2)+'┤┴'[C]+' '[r](n)+'├┬'[C]+R].map(c=>a[p+=s]=c))),[2,3,W-4,W-3].map((p,i)=>a[W*p+2-6*(i&1)]='┌┐└┘'[i]),a.join``)

Questo codice non supporta numeri di pin superiori a 99 e quindi probabilmente non si qualifica come una voce completamente valida. Ecco perché per ora lo contrassegno come non competitivo.

Potrebbe essere facilmente modificato per supportare un numero arbitrario di pin utilizzando margini statici più ampi attorno al chip. Tuttavia, ciò potrebbe violare anche le regole (non ne sono sicuro). I margini completamente dinamici costerebbero significativamente più byte.

dimostrazione


1

Java 11, 451 425 393 byte

n->{int d=(n+"").length(),i,j=-1,l=(int)Math.log10(n*4);String p=" ".repeat(d),P=p+" ",r=P;for(;j++<l;r+="\n"+(j<l?P:p))for(i=n*4;i>n*3;)r+=(i--+"").charAt(j);r+="┌"+"┴".repeat(n)+"┐\n";for(i=0;i<n;r+="├"+(n*3-i+++1)+"\n")r+=p.substring((i+"").length())+i+"┤"+" ".repeat(n);r+=p+"└"+"┬".repeat(i)+"┘\n"+P;for(j=-1;j++<l;r+="\n"+P)for(i=n;i<n*2;)r+=(++i+"").charAt(j);return r;}

-26 byte grazie a @ceilingcat .

Spiegazione:

Provalo online.

n->{                      // Method with integer parameter and String return-type
  int d=(n+"").length(),  //  The amount of digits of the input
      i,j=-1,             //  Index integers
      l=(int)Math.log10(n*4);
                          //  Amount of digits of 4x the input, minus 1
  String p=" ".repeat(d), //  Padding String for the corners, set to `d` amount of spaces
         P=x+" ",         //  Padding String for the numbers, set to one additional space
         r=P;             //  Result-String, starting at `P` to pad the number
  for(;j++<l;             //  Loop `j` in the range (-1, l]:
      ;                   //    After every iteration:
       r+="\n"            //     Append a new-line, and padding spaces:
       +(j<l?P:p))        //      `p` if it's the last iteration; `P` otherwise
    for(i=n*4;i>n*3;      //   Inner loop `i` in the range [4n, 3n):
      r+=(i--+"")         //    Convert the current number to a String,
         .charAt(j));     //    and append the `j`'th digit to the result-String
  r+="┌"                  //  Append the top-left corner of the chip
     +"┴".repeat(n)       //  Append the top row of the chip
     +"┐\n";              //  Append the top-right corner of the chip, plus a new-line
  for(i=0;i<n             //  Loop `i` in the range [0, n):
      ;                   //    After every iteration:
       r+="├"             //     Append the right border of the chip
          +(n*3-i+++1)    //     Append the number
          +"\n")          //     And a trailing newline
    r+=p.substring((i+"").length())
                          //   Append padding spaces in front of the left number
       +i                 //   Append the current number
       +"┤"               //   Append the left border of the chip
       +" ".repeat(n);    //   Append the inner spaces
  r+=p                    //  Append padding spaces in front of the corner
     +"└"                 //  Append the bottom-left corner of the chip
     +"┬".repeat(i)       //  Append the bottom part of the chip
     +"┘\n"               //  Append the bottom-right corner of the chip, plus a new-line
     +P;                  //  Append padding spaces in front of the bottom number
  for(j=-1;j++<l;         //  Loop `j` in the range (-1, l]:
      ;                   //    After every iteration:
       r+="\n"            //     Append a new-line
          +P)             //     Append padding spaces for the number
    for(i=n;i<n*2;        //   Inner loop `i` in the range [n, 2n):
      r+=(++i+"")         //    Convert the current number to a String,
         .charAt(j));     //    and append the `j`'th digit to the result-String
  return r;}              //  Return the result-String
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.