Hasilkan saya chip QFP!

23

Hasilkan saya chip QFP!

Dari kotak pasir!

QFP adalah jenis faktor bentuk untuk komponen listrik tempat pin keluar dari sisi chip. Berikut adalah gambar komponen QFP yang khas:
masukkan deskripsi gambar di sini

Anda dapat melihat bahwa rumus umum adalah memiliki 4 sisi pin dengan jumlah yang sama.

Tantangan Anda adalah membuat program yang menggunakan integer, yang mewakili jumlah pin di satu sisi, dan membuat komponen ASCII QFP dengan pin bernomor.

Memasukkan:

bilangan bulat tunggal yang mewakili jumlah pin di satu sisi

Keluaran:

Chip ASCII QFP dengan pinout yang sesuai.

Contoh:

input: 1

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

input: 2

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

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

Aturan:

  • semua chip QFP harus tertutup dan disegel serta ascii menyediakan. jarak sangat penting. Debu di dalam mikroprosesor adalah hal buruk!
  • penomoran pin harus dilakukan seperti pada contoh (Baca kiri ke kanan, atas ke bawah, bernomor berlawanan arah jarum jam)
  • Anda dapat memulai penomoran pada 0, tetapi ini tidak boleh mempengaruhi chip (input 12 masih membutuhkan 12 pin per sisi)
  • Satu-satunya karakter yang valid dalam output Anda adalah 1,2,3,4,5,6,7,8,9,0,┌,┴,┐,├,┘,┬,└,┤, spasi, dan baris baru.
  • semua penyandian untuk bahasa diperbolehkan, tetapi hasil Anda HARUS konsisten dengan aturan di atas.

Ini adalah codegolf, dan karena itu, Kode dengan jumlah byte paling sedikit menang! Semoga berhasil!

tuskiomi
sumber
2
Apakah nol perlu ditangani.
Magic Gurita Guci
1
Tidak kamu tidak.
tuskiomi
Adakah batas atas pada input?
Arnauld
@Arnauld hanya batas yang harus dilampaui dan batas berbasis bahasa
tuskiomi
1
"semua chip QFP harus tertutup dan disegel serta ascii sediakan." Setengah dari karakter yang diberikan bukan ASCII.
Jordan

Jawaban:

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

Fungsi anonim. Mengambil angka sebagai input dan mengembalikan string sebagai output. Karakter Unicode non-kotak-gambar adalah U + F3C7 (penggunaan pribadi) untuk \[Transpose].

LegionMammal978
sumber
7

Kotlin , 397 393 byte

Lambda yang tidak disebutkan namanya.

Anda dapat mencobanya di sini , tetapi Anda harus menempelkan sumbernya sendiri karena editor sepertinya tidak menyimpan program dalam pengkodean UTF-8. Versi ungolfed adalah program lengkap, jadi Anda harus dapat menggunakannya secara keseluruhan.

Golf

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

(Semacam) Tidak Disatukan

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

Menyimpan banyak byte dengan membebani %operator dan menggunakannya untuk mencetak. Saya mungkin akan meninjau kembali nanti - saya pikir saya dapat menyimpan beberapa byte jika saya menggunakan modatau operator lain sebagai fungsi gabungan. Interpolasi lebih banyak dan lebih sedikit panggilan cetak.

Tyler MacDonell
sumber
Tentu, izinkan saya memasukkan program lengkap.
Tyler MacDonell
1
@tuskiomi Anda seharusnya dapat menggunakan versi yang tidak diserang secara keseluruhan sekarang.
Tyler MacDonell
Solusi yang sangat bagus!
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)])

Coba di sini. Perhatikan bahwa file harus mulai dengan BOM UTF-8 \xef\xbb\xbfagar unicode literals berfungsi dalam juru bahasa CPython standar. 3 byte ini dihitung berdasarkan ukuran di sini. repl.itsudah menggunakan unicode sehingga tautannya hanya memiliki kode yang ditampilkan di sini.

Terima kasih @tuskiomi untuk ide penyandian yang disimpan 9 21 byte

Sebagian tidak diserang:

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
sumber
Konsisten, dan cepat. Hebat!
tuskiomi
aneh. Online, ini mencetak dengan sempurna. namun pada IDLE komputer saya, ia mencetak literal alih-alih poin kode. Masih jawaban yang valid, tetapi Anda mungkin bisa menurunkannya lebih jauh dengan menggunakan karakter aktual alih-alih codepoint!
tuskiomi
Saya pikir saya perlu # -*- coding: utf-8 -*-ditambah satu baris baru ke atas untuk penerjemah menerimanya. Pengkodean UTF-8 untuk masing-masing karakter tersebut adalah 3 byte, sehingga tidak cukup untuk membayar biaya arahan pengodean. Saya baru saja memeriksa PEP 263 dan saya bisa pergi dengan adil #coding=utf-8dan baris baru sehingga akan menghemat beberapa byte.
Jake Cobb
1
Tiga byte BOM UTF-8 ternyata juga berfungsi.
Jake Cobb
3

JavaScript (ES6), 295 284 byte (268 karakter), tidak bersaing

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

Kode ini tidak mendukung nomor pin di atas 99 dan karenanya mungkin tidak memenuhi syarat sebagai entri yang sepenuhnya valid. Itu sebabnya saya menandainya sebagai non-bersaing untuk saat ini.

Itu bisa dengan mudah dimodifikasi untuk mendukung sejumlah besar pin yang sewenang-wenang dengan menggunakan margin statis yang lebih luas di sekitar chip. Namun, itu mungkin melanggar aturan juga (tidak yakin tentang itu). Margin yang sepenuhnya dinamis akan membutuhkan biaya yang lebih banyak byte.

Demo

Arnauld
sumber
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 berkat @ceilingcat .

Penjelasan:

Cobalah 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
sumber