为我生成一个QFP芯片!


23

为我生成一个QFP芯片!

在沙盒中!

QFP是一种电气元件的形状因数,其中引脚从芯片的侧面伸出。这是典型的QFP组件的图片:
在此处输入图片说明

您会看到,通用公式是具有4个边数相等的引脚。

您的挑战是创建一个使用整数的程序,该程序代表一侧上的引脚数,并创建带有编号引脚的ASCII QFP组件。

输入:

一个整数,代表一侧上的引脚数

输出:

带有适当引脚分配的ASCII QFP芯片。

例:

输入1

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

输入2

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

输入: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

规则:

  • 所有QFP芯片必须按照ascii的规定进行密封和密封。间距是最重要的。微处理器内部的灰尘是坏东西!
  • 引脚编号必须按照示例进行(从左至右,从上至下,逆时针编号)
  • 您可以从0开始编号,但这不会影响芯片(输入12仍需要每侧12个引脚)
  • 输出中唯一有效的字符是1,2,3,4,5,6,7,8,9,0,┌,┴,┐,├,┘,┬,└,┤,空格和换行符。
  • 允许使用所有语言的编码,但是您的输出必须与上述规则一致。

这是一个代码高尔夫,因此,字节数最少的代码胜出!祝好运!


2
是否需要处理零。
魔术章鱼缸

1
你不可以。
tuskiomi

输入有上限吗?
Arnauld

@Arnauld只有限制应该是溢出和基于语言的限制
tuskiomi

1
“所有QFP芯片都必须按照ascii的规定进行封装和密封。” 给定字符的一半不是ASCII。
约旦

Answers:


3

Mathematica,271个字节

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

匿名函数。以数字作为输入,并返回一个字符串作为输出。非框式Unicode字符是U + F3C7(专用)\[Transpose]


7

Kotlin397 393字节

未命名的lambda。

你可以试试 在此处,但是您必须将源代码自己粘贴,因为编辑器似乎并未以UTF-8编码保存程序。非高尔夫版本是一个完整的程序,因此您应该可以完整使用它。

打高尔夫球

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

(排序的)未高尔夫

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

通过重载%运算符并使用它进行打印,节省了一堆字节。我可能稍后再讨论-如果我使用mod串联运算符或其他运算符,我可以节省很多字节。插补更多,打印调用更少。


当然,让我包括一个完整的程序。
泰勒·麦克唐纳

1
@tuskiomi您现在应该可以完整使用完整版本。
泰勒·麦克唐纳

一个极好的解决方案!
tuskiomi

3

Python 2 352 343 331字节

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

在这里尝试。请注意,文件必须以UTF-8 BOM开头,\xef\xbb\xbfUnicode文字才能在标准CPython解释器中工作。这3个字节计入此处的大小。 repl.it已经在使用unicode,因此链接仅显示此处显示的代码。

感谢@tuskiomi的编码想法已保存 9 21个字节。

部分未打高尔夫球:

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

一致,快速。精彩!
tuskiomi

奇怪。在线上,可以完美打印。但是,在我的计算机的IDLE上,它打印出文字而不是代码点。仍然是一个有效的答案,但是您可以通过使用实际字符而不是代码点来进一步解决它!
tuskiomi

我以为我需要# -*- coding: utf-8 -*-在顶部加上换行符才能让翻译接受。这些字符中每个字符的UTF-8编码为3个字节,因此不足以支付编码指令的费用。我只是检查了PEP 263,而我只用#coding=utf-8了换行符就可以了,这样可以节省一些字节。
杰克·科布

1
三字节的UTF-8 BOM显然也可以使用。
杰克·科布 Jake Cobb)2016年

3

的JavaScript(ES6),295个 284字节(268个字符),非竞争

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

该代码不支持大于99的引脚号,因此可能不符合完全有效的条件。这就是为什么我现在将其标记为不竞争。

通过在芯片周围使用更大的静态余量,可以轻松地对其进行修改以支持任意数量的引脚。但是,这也可能会违反规则(对此不确定)。完全动态裕量将花费更多的字节。

演示版


1

Java的11,451个 425 393字节

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个字节 @ceilingcat

说明:

在线尝试。

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.