สร้างชิป QFP ให้ฉัน!


23

สร้างชิป QFP ให้ฉัน!

จากกล่องทราย!

QFP เป็นรูปแบบของฟอร์มแฟคเตอร์สำหรับอุปกรณ์ไฟฟ้าที่หมุดออกมาด้านข้างของชิป นี่คือรูปภาพขององค์ประกอบ QFP ทั่วไป:
ป้อนคำอธิบายรูปภาพที่นี่

คุณจะเห็นได้ว่าสูตรทั่วไปนั้นมี 4 ด้านของจำนวนพินเท่ากัน

ความท้าทายของคุณคือการสร้างโปรแกรมที่ใช้จำนวนเต็มซึ่งแสดงถึงจำนวนพินที่ด้านหนึ่งและสร้างองค์ประกอบ ASCII QFP ด้วยหมายเลขที่มีหมายเลข

การป้อนข้อมูล:

เลขจำนวนเต็มเดียวซึ่งแทนจำนวนพินที่ด้านหนึ่ง

เอาท์พุท:

ชิป ASCII QFP ที่มี pinout ที่เหมาะสม

ตัวอย่าง:

การป้อนข้อมูล: 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,┌,┴,┐,├,┘,┬,└,┤ช่องว่างและบรรทัดใหม่
  • อนุญาตให้เข้ารหัสทั้งหมดสำหรับภาษา แต่ผลลัพธ์ของคุณต้องสอดคล้องกับกฎข้างต้น

นี่คือ codegolf และเป็นเช่นนั้นรหัสที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ! โชคดี!


2
ต้องจัดการศูนย์หรือไม่
Magic Octopus Urn

1
ไม่คุณทำไม่ได้
tuskiomi

มีขีด จำกัด บนของการป้อนข้อมูลหรือไม่
Arnauld

@Arnauld ข้อ จำกัด ควรเป็นแบบโอเวอร์โฟลและแบบ จำกัด ภาษา
tuskiomi

1
"ชิป QFP ทั้งหมดจะต้องถูกปิดล้อมและปิดผนึกเช่นเดียวกับ ascii ให้" ครึ่งหนึ่งของอักขระที่ระบุไม่ใช่ ASCII
Jordan

คำตอบ:


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

Kotlin , 397 393 ไบต์

แลมบ์ดาที่ไม่มีชื่อ

คุณสามารถลองได้ที่นี่แต่คุณจะต้องวางแหล่งที่มาในตัวคุณเองเพราะตัวแก้ไขดูเหมือนจะไม่บันทึกโปรแกรมในการเข้ารหัส 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)}

(เรียงจาก) 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)
}

บันทึกจำนวนไบต์โดยการโหลดตัว%ดำเนินการมากเกินไปและใช้เพื่อพิมพ์ ฉันจะกลับมาทบทวนอีกครั้งในภายหลัง - ฉันคิดว่าฉันสามารถบันทึกได้ไม่กี่ไบต์ถ้าฉันใช้modหรือโอเปอเรเตอร์อื่นเป็นฟังก์ชั่นการต่อข้อมูล การแก้ไขเพิ่มเติมและการโทรพิมพ์น้อยลง


แน่นอนฉันขอรวมโปรแกรมทั้งหมดไว้ด้วย
Tyler MacDonell

1
@tuskiomi คุณน่าจะสามารถใช้เวอร์ชั่นที่ไม่ได้รับการอวดได้ในตอนนี้
Tyler MacDonell

ทางออกที่ยอดเยี่ยม!
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\xbfเพื่อให้ตัวอักษร unicode ทำงานใน CPython interpreter มาตรฐาน 3 ไบต์เหล่านี้จะถูกนับกับขนาดที่นี่ repl.itใช้ยูนิโค้ดอยู่แล้วดังนั้นลิงก์ก็มีรหัสแสดงที่นี่

ขอบคุณ @tuskiomi สำหรับแนวคิดการเข้ารหัสที่บันทึกไว้ 9 21 ไบต์

ungolfed บางส่วน:

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 ของคอมพิวเตอร์ของฉันมันพิมพ์ตัวอักษรแทนรหัสจุด ยังเป็นคำตอบที่ถูกต้อง แต่คุณสามารถตีมันให้ไกลกว่านี้ได้โดยใช้ตัวละครจริงแทนที่จะเป็น codepoints!
tuskiomi

ฉันคิดว่าฉันต้อง# -*- coding: utf-8 -*-มีการขึ้นบรรทัดใหม่เพื่อให้ล่ามยอมรับ การเข้ารหัส UTF-8 ของตัวละครแต่ละตัวนั้นมีขนาด 3 ไบต์ดังนั้นจึงไม่เพียงพอที่จะจ่ายสำหรับค่าใช้จ่ายของคำสั่งการเข้ารหัส ฉันเพิ่งตรวจสอบ PEP 263 และฉันสามารถออกไปได้ด้วย#coding=utf-8การขึ้นบรรทัดใหม่เพื่อที่จะได้ประหยัดไบต์
Jake Cobb

1
เห็นได้ชัดว่า UTF-8 BOM สามไบต์ทำงานได้ดีเช่นกัน
Jake Cobb

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.