Bana bir QFP çipi üret!


23

Bana bir QFP çipi üret!

Kum havuzundan!

QFP, pimlerin bir çipin kenarlarından çıktığı bir elektrikli bileşen için bir form faktörü türüdür. İşte tipik bir QFP bileşeninin resmi:
görüntü tanımını buraya girin

Genel formülün 4 pim eşit sayıda pime sahip olduğunu görebilirsiniz.

Buradaki zorluk, bir tamsayı alan, bir taraftaki pin sayısını temsil eden ve numaralı pinlerle bir ASCII QFP bileşeni oluşturan bir program yaratmaktır.

Giriş:

bir taraftaki pin sayısını gösteren tek bir tamsayı

Çıktı:

Uygun bir pinout içeren bir ASCII QFP çipi.

Örnek:

girişi: 1

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

Giriş: 2

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

Giriş: 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

Kurallar:

  • tüm QFP yongaları ascii'nin sağladığı gibi kapatılmalı ve mühürlenmelidir. aralık çok önemlidir. Bir mikroişlemcinin içindeki toz kötüdür!
  • Pin numaralandırması örneklerde olduğu gibi yapılmalıdır (Soldan sağa, yukarıdan aşağıya doğru, saatin tersi yönünde numaralandırılmış)
  • 0'dan numaralamaya başlayabilirsiniz, ancak bu yongayı etkilememelidir (12 için bir giriş hala her tarafta 12 pime ihtiyaç duyar)
  • Çıktınızdaki tek geçerli karakterler 1,2,3,4,5,6,7,8,9,0,┌,┴,┐,├,┘,┬,└,┤, boşluklar ve yeni satırlardır.
  • diller için tüm kodlamalara izin verilir, ancak çıktılarınız yukarıdaki kurallara uygun olmalıdır.

Bu bir kod çözücüdür ve bu nedenle, en az bayt sayısına sahip olan kod kazanır! İyi şanslar!


2
Sıfır ele alınması gerekiyor mu.
Sihirli Ahtapot Urn

1
Hayır yapma.
tuskiomi

Girişte herhangi bir üst limit var mı?
Arnauld,

@Sadece sınırlar taşma ve dil temelli sınırlar olmalıdır
tuskiomi

1
"Tüm QFP yongaları ascii'nin sağladığı gibi kapalı ve mühürlenmiş olmalıdır." Verilen karakterlerin yarısı ASCII değil.
Ürdün

Yanıtlar:


3

Mathematica, 271 bayt

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

Anonim işlev Girdi olarak bir sayı alır ve çıktı olarak bir dize döndürür. Kutu çizimsiz Unicode karakteri, U + F3C7'dir (özel kullanım) \[Transpose].


7

Kotlin , 397 393 bayt

İsimsiz lambda.

Burada deneyebilirsiniz , ancak kaynağı kendinize yapıştırmanız gerekir, çünkü editör programları UTF-8 kodlamasında kaydetmiş gibi görünmez. Ungolfed versiyonu tam bir programdır, bu yüzden onu bütünüyle kullanabilmelisiniz.

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

(Sırala) 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)
}

%İşleci aşırı yükleyerek ve yazdırmak için kullanarak birkaç bayt kurtardı . Muhtemelen bunu daha sonra tekrar ziyaret edeceğim - sanırım modbir birleştirme işlevi olarak ya da başka bir operatör kullanırsam epeyce bayt kaydedebilirim . Daha fazla enterpolasyon ve daha az baskı çağrısı.


Tabii, tam bir program ekleyeyim.
Tyler MacDonell

1
@tuskiomi Ungolded sürümünü şimdi tamamen kullanabilmelisiniz.
Tyler MacDonell

Mükemmel bir çözüm!
tuskiomi

3

Python 2, 352 343 331 bayt

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

Burada dene. \xef\xbb\xbfUnicode değişmezlerin standart CPython yorumlayıcısında çalışması için dosyanın UTF-8 BOM ile başlaması gerektiğini unutmayın . Bu 3 bayt burada büyüklüğüne karşı sayılır. repl.itZaten unicode kullanıyor, bu yüzden link sadece burada gösterilen koda sahip.

Kurtarılan kodlama fikri için @tuskiomi teşekkürler 9 21 bayt.

Kısmen yıpranmış:

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

Tutarlı ve hızlı. Olağanüstü!
tuskiomi

garip. Çevrimiçi, bu mükemmel yazdırıyor. ancak bilgisayarımın IDLE'sinde kod noktaları yerine değişmezleri yazdırıyor. Yine de geçerli bir cevap, ancak kod noktaları yerine gerçek karakterleri kullanarak daha fazla golf oynayabilirsin!
tuskiomi

# -*- coding: utf-8 -*-Tercümanın kabul etmesi için üste yeni bir hatta ihtiyacım olacağını düşündüm . Bu karakterlerin her birinin UTF-8 kodlaması 3 bayttır, bu nedenle kodlama direktifinin maliyetini ödemek yeterli değildi. Yine de PEP 263'ü kontrol ettim ve #coding=utf-8bazı baytları kurtarması için sadece ve yeni bir çizgiden kurtulabilirim .
Jake Cobb

1
Üç bayt UTF-8 ürün listesi de görünüşe göre çalışıyor.
Jake Cobb

3

JavaScript (ES6), 295 284 bayt (268 karakter), rakipsiz

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

Bu kod 99'un üzerindeki pin numaralarını desteklemiyor ve bu nedenle muhtemelen tam olarak geçerli bir giriş olarak nitelenmiyor. Bu yüzden şimdilik rekabetsiz olarak işaretliyorum.

Çipin etrafındaki daha geniş statik kenar boşluklarını kullanarak isteğe bağlı çok sayıda pimi desteklemek için kolayca değiştirilebilir. Ancak, bu kuralları da ihlal edebilir (bundan emin değilsiniz). Tamamen dinamik kenar boşlukları çok daha fazla bayta mal olur.

gösteri


1

Java 11, 451 425 393 bayt

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

@Ceilingcat sayesinde -26 bayt .

Açıklama:

Çevrimiçi deneyin.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.