Me gera um chip QFP!

23

Me gera um chip QFP!

Da caixa de areia!

QFP é um tipo de fator de forma para um componente elétrico no qual os pinos saem pelas laterais de um chip. Aqui está uma imagem de um componente QFP típico:
insira a descrição da imagem aqui

você pode ver que a fórmula geral é ter 4 lados de igual número de pinos.

Seu desafio é criar um programa que inclua um número inteiro, que represente o número de pinos de um lado e crie um componente ASCII QFP com pinos numerados.

Entrada:

um único inteiro que representa o número de pinos de um lado

Saída:

Um chip ASCII QFP com uma pinagem apropriada.

Exemplo:

entrada: 1

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

entrada: 2

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

entrada: 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

Regras:

  • todos os chips QFP devem ser fechados e selados, assim como o ASCII fornece. o espaçamento é de extrema importância. Poeira dentro de um microprocessador é uma coisa ruim!
  • a numeração dos pinos deve ser feita como nos exemplos (leia da esquerda para a direita, de cima para baixo, numerado no sentido anti-horário)
  • Você pode começar a numerar em 0, mas isso não deve afetar o chip (uma entrada de 12 ainda precisa de 12 pinos por lado)
  • Os únicos caracteres válidos na sua saída são 1,2,3,4,5,6,7,8,9,0,┌,┴,┐,├,┘,┬,└,┤espaços e novas linhas.
  • todas as codificações para idiomas são permitidas, mas sua saída DEVE ser consistente com as regras acima.

Este é um codegolf e, como tal, vence o código com o menor número de bytes! Boa sorte!

tuskiomi
fonte
2
O zero precisa ser tratado.
Magic Octopus Urn
1
Não, você não.
Tuskiomi
Algum limite superior na entrada?
Arnauld
@Arnauld única limites deve ser transborda e limites baseados na linguagem
tuskiomi
1
"todos os chips QFP devem ser fechados e selados, assim como o ASCII fornece." Metade dos caracteres fornecidos não é ASCII.
Jordan

Respostas:

3

Mathematica, 271 bytes

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=#]&

Função anônima. Pega um número como entrada e retorna uma string como saída. O caractere Unicode sem desenho de caixa é U + F3C7 (uso privado) para \[Transpose].

LegionMammal978
fonte
7

KOTLIN , 397 393 bytes

Lambda sem nome.

Você pode experimentá-lo aqui , mas precisará colar a fonte em si mesmo, porque o editor não parece salvar programas na codificação UTF-8. A versão não-gasta é um programa completo, portanto você deve poder usá-lo na íntegra.

Golfe

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

(Mais ou menos) 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)
}

Economizou um monte de bytes sobrecarregando o %operador e usando-o para imprimir. Provavelmente revisitarei isso mais tarde - acho que posso salvar alguns bytes se usar modalgum outro operador como uma função de concatenação. Mais interpolação e menos chamadas de impressão.

Tyler MacDonell
fonte
Claro, deixe-me incluir um programa completo.
Tyler MacDonell
1
@tuskiomi Agora você deve poder usar a versão não destruída por completo.
Tyler MacDonell
Uma excelente solução!
tuskiomi
3

Python 2, 352 343 331 bytes

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

Experimente aqui. Observe que o arquivo deve começar com a UTF-8 BOM \xef\xbb\xbfpara que os literais unicode funcionem no interpretador CPython padrão. Esses 3 bytes são contados em relação ao tamanho aqui. repl.itjá está usando unicode, então o link tem apenas o código mostrado aqui.

Obrigado @tuskiomi pela idéia de codificação que salvou 9 21 bytes.

Parcialmente sem golfe:

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
  ])
Jake Cobb
fonte
Consistente e rápido. Maravilhoso!
tuskiomi 8/12/16
estranho. Online, isso é impresso perfeitamente. no entanto, no IDLE do meu computador, ele imprime literais em vez de pontos de código. Ainda é uma resposta válida, mas você pode conseguir ainda mais, usando os caracteres reais em vez dos pontos de código!
Tuskiomi
Eu pensei que precisaria de # -*- coding: utf-8 -*-uma nova linha no topo para que o intérprete o aceitasse. A codificação UTF-8 de cada um desses caracteres é de 3 bytes, portanto não foi suficiente para pagar o custo da diretiva de codificação. Acabei de verificar o PEP 263 e posso usar apenas #coding=utf-8uma nova linha para que ele economize alguns bytes.
Jake Cobb
1
Aparentemente, o BOM UTF-8 de três bytes também funciona.
Jake Cobb
3

JavaScript (ES6), 295 284 bytes (268 caracteres), não concorrente

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

Esse código não suporta números de pinos acima de 99 e, portanto, provavelmente não se qualifica como uma entrada totalmente válida. É por isso que eu o marquei como não competitivo por enquanto.

Poderia ser facilmente modificado para suportar um grande número arbitrário de pinos usando margens estáticas mais amplas ao redor do chip. No entanto, isso também pode infringir as regras (não tenho certeza disso). Margens totalmente dinâmicas custariam significativamente mais bytes.

Demo

Arnauld
fonte
1

Java 11, 451 425 393 bytes

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 bytes graças a @ceilingcat .

Explicação:

Experimente 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
Kevin Cruijssen
fonte