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,┌,┴,┐,├,┘,┬,└,┤、スペース、改行のみです。
  • 言語のすべてのエンコーディングが許可されていますが、出力は上記の規則と一致している必要があります。

これはcodegolfであるため、バイト数が最小のコードが勝ちです!がんばろう!


2
ゼロを処理する必要はありません。
魔法のタコ

1
いいえ、あなたはしません。
tuskiomi

入力に上限はありますか?
アーナルド

唯一の制限は、言語ベースの制限オーバーフローであるべきで@Arnauld
tuskiomi

1
「すべてのQFPチップは、asciiが提供するのと同様に、密閉および密封する必要があります。指定された文字の半分はASCIIではありません。
ヨルダン

回答:


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バイト

名前のないラムダ。

ここで試すことができますが、エディターは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連結関数として他の演算子を使用すると、かなりのバイトを節約できると思います。より多くの補間と少ない印刷呼び出し。


もちろん、完全なプログラムを含めてください。
タイラーマクドネル

1
@tuskiomiこれで、ungolfedバージョン全体を使用できるようになります。
タイラーマクドネル

優れたソリューション!
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)])

ここで試してみてください。\xef\xbb\xbfUnicodeリテラルが標準CPythonインタープリターで機能するには、ファイルがUTF-8 BOM で始まる必要があることに注意してください。ここでは、これらの3バイトがサイズに対してカウントされます。 repl.itはすでにユニコードを使用しているため、リンクにはここに示すコードのみが含まれます。

保存したエンコーディングのアイデアを@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-81つの改行で逃げることができるので、バイトを節約できます。
ジェイクコブ

1
3バイトのUTF-8 BOMも明らかに動作します。
ジェイクコブ

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

@ceilingcatのおかげで-26バイト。

説明:

オンラインでお試しください。

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.