¡Generame un chip QFP!

23

¡Generame un chip QFP!

De la caja de arena!

QFP es un tipo de factor de forma para un componente eléctrico donde los pines salen de los lados de un chip. Aquí hay una imagen de un componente típico de QFP:
ingrese la descripción de la imagen aquí

puede ver que la fórmula general es tener 4 lados de igual número de pines.

Su desafío es crear un programa que tome un número entero, que represente el número de pines en un lado, y cree un componente ASCII QFP con pines numerados.

Entrada:

Un número entero que representa el número de pines en un lado

Salida:

Un chip ASCII QFP con un pinout apropiado.

Ejemplo:

entrada: 1

  4 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

Reglas:

  • Todos los chips QFP deben estar encerrados y sellados, así como ASCII proporciona. el espacio es de suma importancia. El polvo dentro de un microprocesador es algo malo.
  • la numeración del pin debe hacerse como en los ejemplos (Leer de izquierda a derecha, de arriba a abajo, numerados en sentido antihorario)
  • Puede comenzar a numerar en 0, pero esto no debe afectar el chip (una entrada de 12 todavía necesita 12 pines por lado)
  • Los únicos caracteres válidos en su salida son 1,2,3,4,5,6,7,8,9,0,┌,┴,┐,├,┘,┬,└,┤espacios y líneas nuevas.
  • todas las codificaciones para idiomas están permitidas, pero su salida DEBE ser coherente con las reglas anteriores.

Este es un codegolf, y como tal, ¡gana el código con el menor número de bytes! ¡Buena suerte!

tuskiomi
fuente
2
¿Cero necesita ser manejado?
Urna de pulpo mágico
1
No, no lo haces.
tuskiomi
¿Algún límite superior en la entrada?
Arnauld
Los límites de @Arnauld solo deben ser desbordamientos y límites basados ​​en el idioma
tuskiomi
1
"todos los chips QFP deben estar encerrados y sellados, así como lo proporciona ascii". La mitad de los caracteres dados no son ASCII.
Jordania

Respuestas:

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

Función anónima. Toma un número como entrada y devuelve una cadena como salida. El carácter Unicode sin dibujo de caja es U + F3C7 (uso privado) para \[Transpose].

LegionMammal978
fuente
7

Kotlin , 397 393 bytes

Lambda sin nombre.

Puedes probarlo aquí , pero tendrás que pegar la fuente en ti mismo porque el editor no parece guardar programas en codificación UTF-8. La versión sin golf es un programa completo, por lo que debería poder usarlo en su totalidad.

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

(Más o menos) Sin golf

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

Ahorró un montón de bytes al sobrecargar el %operador y usarlo para imprimir. Probablemente volveré a visitar esto más tarde; creo que puedo ahorrar bastantes bytes si uso modo algún otro operador como función de concatenación. Más interpolación y menos llamadas impresas.

Tyler MacDonell
fuente
Claro, déjame incluir un programa completo.
Tyler MacDonell
1
@tuskiomi Ahora deberías poder usar la versión sin golf en su totalidad.
Tyler MacDonell
¡Una excelente solución!
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)])

Pruébalo aquí. Tenga en cuenta que el archivo debe comenzar con la lista de materiales UTF-8 \xef\xbb\xbfpara que los literales unicode funcionen en el intérprete estándar de CPython. Estos 3 bytes se cuentan contra el tamaño aquí. repl.itya está utilizando Unicode, por lo que el enlace solo tiene el código que se muestra aquí.

Gracias @tuskiomi por la idea de codificación que guardó 9 9 21 bytes.

Parcialmente no golfista:

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
fuente
Consistente y rápido. ¡Maravilloso!
tuskiomi
extraño. En línea, esto se imprime perfectamente. sin embargo, en el IDLE de mi computadora, imprime literales en lugar de puntos de código. Sigue siendo una respuesta válida, ¡pero es posible que pueda seguir jugando golf utilizando los caracteres reales en lugar de los puntos de código!
tuskiomi
Pensé que necesitaría # -*- coding: utf-8 -*-más una nueva línea en la parte superior para que el intérprete lo aceptara. La codificación UTF-8 de cada uno de esos caracteres es de 3 bytes, por lo que no fue suficiente para pagar el costo de la directiva de codificación. Sin embargo, acabo de comprobar PEP 263 y puedo salir con solo #coding=utf-8y una nueva línea para que ahorre algunos bytes.
Jake Cobb
1
El BOM UTF-8 de tres bytes aparentemente también funciona.
Jake Cobb
3

JavaScript (ES6), 295 284 bytes (268 caracteres), no competidor

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

Este código no admite números de pin superiores a 99 y, por lo tanto, probablemente no califica como una entrada totalmente válida. Es por eso que lo marco como no competitivo por ahora.

Se podría modificar fácilmente para admitir una gran cantidad arbitraria de pines utilizando márgenes estáticos más amplios alrededor del chip. Sin embargo, eso también puede infringir las reglas (no estoy seguro de eso). Los márgenes totalmente dinámicos costarían significativamente más bytes.

Manifestación

Arnauld
fuente
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 gracias a @ceilingcat .

Explicación:

Pruébalo en línea.

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
fuente