全体として、それはただ、ええと、コードゴルフの別のトリックです


64

このチャレンジの目的は、ロックバンドのピンクフロイドによるこの素晴らしいアルバムの表紙のASCIIバージョンを作成することです。

レンガジャンクションはキャラクター_とでできてい|ます。レンガには、接合部を除く幅7および高さ2の文字があります。したがって、ジャンクションを含む基本単位は次のとおりです。

_________
|       |
|       |
_________

レンガの各行は、前の行に対してレンガの幅の半分(4文字)オフセットされています。

________________________________________
  |       |       |       |       |     
  |       |       |       |       |     
________________________________________
      |       |       |       |       | 
      |       |       |       |       | 
________________________________________
  |       |       |       |       |     
  |       |       |       |       |     

壁は次のようにパラメーター化されます。すべてのパラメーターは、ジャンクションを含む文字で測定されます。

  1. 最初の行の水平オフセットF。これは、左マージンと最上行の最初の垂直ジャンクション間の距離です。(行間のハーフブリック相対オフセットも覚えておいてください)。その可能な値は01、...、 7
  2. W。これにはジャンクションが含まれます。その値は正の整数です。
  3. 高さH。これにはジャンクションが含まれます。その値は正の整数です。

壁の上部は常に行の上部と一致します。底面が不規則になる場合があります(合計の高さがの倍数でない場合3)。例えば、ここのための出力です64411

____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       |     
  |       |       |       |       |       |     
____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       |     

パラメータの視覚的な説明:

          F=6
         ......   
     .   ____________________________________________
     .         |       |       |       |       |    
     .         |       |       |       |       |     
     .   ____________________________________________
     .     |       |       |       |       |       | 
H=11 .     |       |       |       |       |       |      
     .   ____________________________________________
     .         |       |       |       |       |     
     .         |       |       |       |       |     
     .   ____________________________________________
     .     |       |       |       |       |       |      

         ............................................
                             W=44

追加のルール

プログラムまたは機能を提供できます。

入力形式は通常どおり柔軟です。出力は、STDOUTまたは関数から返される引数を介して行われます。この場合、改行を含む文字列または文字列の配列です。

末尾のスペースまたは改行を使用できます。

バイト単位の最短コードが優先されます。

テストケース

入力は上記の順序、つまり、最初の行の水平オフセット、合計幅、合計高さです。

6, 44, 11:
____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       | 
  |       |       |       |       |       | 
____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       |     


2, 20, 10:
____________________
  |       |       | 
  |       |       | 
____________________
      |       |     
      |       |     
____________________
  |       |       | 
  |       |       | 
____________________


1, 1, 1:
_


1, 2, 3:
__
 |
 |


3, 80, 21:
________________________________________________________________________________
   |       |       |       |       |       |       |       |       |       |    
   |       |       |       |       |       |       |       |       |       |    
________________________________________________________________________________
       |       |       |       |       |       |       |       |       |       |
       |       |       |       |       |       |       |       |       |       |
________________________________________________________________________________
   |       |       |       |       |       |       |       |       |       |    
   |       |       |       |       |       |       |       |       |       |    
________________________________________________________________________________
       |       |       |       |       |       |       |       |       |       |
       |       |       |       |       |       |       |       |       |       |
________________________________________________________________________________
   |       |       |       |       |       |       |       |       |       |    
   |       |       |       |       |       |       |       |       |       |    
________________________________________________________________________________
       |       |       |       |       |       |       |       |       |       |
       |       |       |       |       |       |       |       |       |       |
________________________________________________________________________________
   |       |       |       |       |       |       |       |       |       |    
   |       |       |       |       |       |       |       |       |       |    

34
あなたは私にhnqのクリックベイトで私を手に入れた
Rohan Jhunjhunwala

2
@RohanJhunjhunwala右の音
非常識

4
歌詞の音節の数を一致させてくれてありがとう...曲をスピンオフして音節を間違えようとする人がどれだけいるのか信じられないでしょう。
クリスクレフィス

1
@ChrisCirefice母、ありがとう!タイトルはこの挑戦の重要な部分でした
ルイスメンドー

回答:


17

Pyth、43 27バイト

重いゴルフをする必要があります...スコアが恥ずかしいです。

AQVE<*H?%N3X*8d+G*4/N3\|\_H

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

入力形式

6,44
11

出力フォーマット

____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       | 
  |       |       |       |       |       | 
____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       | 

説明

AQVE<*H?%N3X*8d+G*4/N3\|\_H   First two inputs as list in Q,
                              third input as E.

AQ                            Assign G to the first item in Q
                              and H to the second item in Q.
  VE                          For N from 0 to E-1:
                   /N3            N floor-div 3.
                                    if N gives a remainder of 3 or 4 or 5
                                    when divided by 6, this will be odd;
                                    otherwise, this will be even.
                 *4               Multiply by 4.
                                    if the above is odd, this will leave
                                    a remainder of 4 when divided by 8;
                                    otherwise, the remainder would be 0.
               +G                 Add G (as an offset).
           X*8d       \|          In the string "        " (*8d),
                                  replace (X) the character with the
                                  index above with "|" (modular indexing,
                                  hence the manipulation above).
       ?%N3             \_        If N%3 is non-zero, use the above;
                                  otherwise, use "_".
     *H                           The above repeated H times.
    <                     H       Take the first H characters of above.
                                  Implicitly print with newline.

あなたが勝つように見える
言葉forthewise

30

C、86 85 83 82バイト

Lynnのおかげで3バイト節約されました。
チャーリーのおかげで1バイト節約されました。

i;f(o,w,h){++w;for(i=0;++i<w*h;)putchar(i%w?i/w%3?i%w+i/w/3*4+~o&7?32:124:95:10);}

1
for(i=0;++i<w*h;)または、iローカルにした場合(param trick):for(;++i<w*h;)
チャーリー

forループでさらに1バイトを置き換えi;i=1;保存します。
xryl669

for(i=1;i<w*h;++i)- > for(i=0;++i<w*h;)1セーブ
Yay295

@ xryl669それは無効です。関数は再利用可能でなければなりません。
orlp

@ Yay295チャーリーはそれを7時間前に投稿したので、私はそれをクレジットしました。
orlp


13

Perl、63バイト

#!perl -nl
$y+=print+map$y%3?$_++-$`&7?$":'|':_,($y%6&4)x$&for/ \d+/..$'

シバンを2としてカウントすると、入力は空白で区切られたstdinから取得されます。

サンプルの使用法

$ echo 2 20 10 | perl bricks.pl
____________________
  |       |       |
  |       |       |
____________________
      |       |
      |       |
____________________
  |       |       |
  |       |       |
____________________

11

Haskell、83バイト

q s="_":[s,s]
(f!w)h=take h$cycle$take w.drop(7-f).cycle<$>q"       |"++q"   |    "

これは、!文字列のリストを返す三項中置関数を定義します。使用例:

*Main> putStrLn $ unlines $ (3!14) 7
______________
   |       |  
   |       |  
______________
       |      
       |      
______________

使い方:

            q"       |"++q"   |    "  -- build a list of 6 strings
                                      --   1:     "_"
                                      --   2:     "       |"
                                      --   3:     "       |"
                                      --   4:     "_"
                                      --   5:     "   |    "
                                      --   6:     "   |    "
         <$>                          -- for each of the strings
     take w.drop(7-f).cycle           -- repeat infinitely, drop the first 7-f chars
                                      --    and take the next w chars
  cycle                               -- infinitely repeat the resulting list
take h                                -- and take the first h elements

1
このような答えにより、この言語を学びたいと思うようになります。
GuitarPicker

3
問題の説明を読むとき、Haskellについて考えました。「無限に繰り返す」という機能は非常に便利です。
DLosc

10

JavaScript(ES6)、96 95バイト

g=
(f,w,h)=>[...Array(h)].map((_,i)=>(i%3?`       |`:`_`).repeat(w+7).substr(f^7^i%6&4,w)).join`
`
;
<div onchange=o.textContent=g(f.value,w.value,+h.value)><input id=f type=number min=0 max=7 placeholder=Offset><input id=w type=number min=0 placeholder=Width><input id=h type=number min=0 placeholder=Height></div><pre id=o>

説明:繰り返しの7つのスペースと|パターン、または単に繰り返された_sのいずれかの文字列を作成しますが、少なくともw各行に必要な文字を抽出するのに十分な長さです。最初の3行は位置f^7から始まり、次の3行は位置f^3から始まるので、6の各ブロックの最後の2行の反対のビット2を使用して3行ごとにビット2を切り替えてf 1を節約することでこれを実現しますバイト。


7

MATL、42 36 33バイト

:-Q'_ | |'[DClCl]Y"8et4YShwi:3$)!

入力形式は次のとおりです。nColsoffsetnRows

オンラインで試す

ここでのアプローチは[1 2 ... nRows]、最初の入力([1 2 ... nCols] - shift)でシフトされた行インデックス()と列インデックスを使用してインデックスを作成する「テンプレート」をセットアップすることです。MATLのモジュール式インデックス作成のおかげで、自動的にタイル出力になります。サイドノートとして、スペースを節約するために、技術的にはテンプレートの転置バージョンを使用!し、最後に転置()するだけです。

テンプレートは次のとおりです。

________
       |
       |
________
  |     
  |     

1
パターンを生成するためのランレングスコーディングの良い使用
ルイスメンドー

6

Python 2、93 88バイト

2番目のインデントレベルはタブです Leaky Nunといくつかの独自の変更のおかげで、いくつかのバイトを節約できます。また、正しいオフセットになりました。

def f(F,W,H):
 for h in range(H):print["_"*W,((("|"+7*" ")*W)[8-F+h%6/3*4:])[:W]][h%3>0]

前のコード:

def f(F,W,H,x="|"+7*" "):
 for h in range(H):
    print ["_"*W,(x[F+4*(h%6>3):]+x*W)[:W]][h%3>0]

名前のないラムダと同じ長さ:

lambda F,W,H,x="|"+7*" ":"\n".join(["_"*W,(x[F+4*(h%6>3):]+x*W)[:W]][h%3>0]for h in range(H))

F,W,H=input()
リーキー修道女

後の空白を削除しますprint
Leaky Nun

使用h/3%2*4またはh%6/3*4代わりに4*(h%6>3)
漏れ修道女

2番目のインデントレベルは必要ありません。ただ置くprintと同じラインで声明をfor声明
漏れ修道女

"| "("|"+7*" ")私が正しく数える場合よりも短い
リーキー修道女

6

QBasic、121 109バイト

(QB64でテスト済み)

私のIF声明を数学的に同等のものでゴルフしてくれた@DLoscに感謝します。これは12バイトの価値がありました。

一般的な方法:

一度に各セルの一方を介してループし、それがなければならないかどうかを決定する_または|その位置に応じ。 MODステートメントとブール論理を使用して、ブリックの境界とブリックをずらす量を決定します。

コード:

INPUT F,W,H
FOR y=0TO H-1:FOR x=0TO W-1
?CHR$((y MOD 3>0)*(((x-(y MOD 6>3)*4)MOD 8=F)*92+63)+95);
NEXT:?:NEXT

使用上の注意:

QBasicは、入力がコンマで区切られた数字であると想定しています。


1
代わりに数学を使用するIF/してTHEN、さらに括弧を追加しますが、12のバイトを保存します?CHR$((y MOD 3>0)*(((x-(y MOD 6>3)*4)MOD 8=F)*92+63)+95);
DLosc

コメントありがとう。私は頭の後ろで数学を探求することを考えていましたが、しませんでした。最近の投稿で画像に色を付けるために、これと似たようなことをしましたが、使用した実装にはMOD演算子がありませんでした。
GuitarPicker

5

Java(登録商標)、149147146、143のバイト

ゴルフ:

String f(int o,int w,int h){String s="";for(int y=0,x;y<h;++y){for(x=0;x<w;++x){s+=y%3>0?(x-o+(y-1)/3%2*4)%8==0?'|':' ':'_';}s+='\n';}return s;}

ゴルフをしていない:

public class AllInAllItsJustUhAnotherTrickInCodeGolf {

  public static void main(String[] args) {
    int offset = 6;
    int width = 44;
    int height = 11;
    System.out.println(new AllInAllItsJustUhAnotherTrickInCodeGolf()
        .f(offset, width, height));
  }

  // Begin golf
  String f(int o, int w, int h) {
    String s = "";
    for (int y = 0, x; y < h; ++y) {
      for (x = 0; x < w; ++x) {
        s += y % 3 > 0 ? (x - o + (y - 1) / 3 % 2 * 4) % 8 == 0 ? '|' : ' ' : '_';
      }
      s += '\n';
    }
    return s;
  }
  // End golf

}

1
多分、> 02つの文字を節約できるのと比較して、3進数の順序を切り替えることができます。そしてもちろん、宣言をに結合できますint y=0,x
Frozn

Froznが言っているように、2バイトを節約する代わりに、最初のforループのint 前で削除しxて使用できint y=0,xます。また、現在お使いのは変更することができますy%3==0y%3<1。(ただし、操作は負の数値を返す可能性があるため...%8==0、これは不可能...&8<1です。)
ケビンクルーイッセン

完了しました。2番目のモジュロは負の値を返す可能性があり、この関数を最初に書いたときにデバッグ中にそれが返されたということは正しいです。

1
わからない我々はこれを逃したどのようにしていますが、使用して、代わりに... -2バイトのためにあなたのパラメータでスペースを削除することができint...o、パラメータとして、変化wo[1]ho[2]oしてo[0]-3バイトの代わりです。
ケビンCruijssen

4

ルビー、 72 66バイト

->f,w,h{h.times{|i|puts i%3<1??_*w:((?|+' '*7)*w)[8-f+i%6/4*4,w]}}

@Value Inkに6バイトをありがとう!

単純な文字列の乗算とスライス。

Ruby 2.3.0で動作します(Ideoneのバージョン2.1は構文エラーをスローしました)。


2
i%6/4*4代わりに(i%6>3?4:0)使用し、の?_代わりに'_'、の?|代わりに使用します'|'
バリューインク

ありがとうございました。?シングルチャートリックを忘れてしまいました。「数学」の部分は本当に印象的です。
ライブルグ

1
((' '*7+?|)*w)[f^7^i%6&4,w]2バイト節約できると思います。
ニール

@ニールありがとうございます。コードを編集します...あなたの提案がどのように機能するかを理解したらすぐに:)
Leibrug

4

ジュリア:150の 128 116 108 107バイト

# in codegolf.jl
r=repmat;b=r([' '],6,8);b[[1,4],:]='_';b[[2,3,23,24]]='|';b=r(b,h,w)[1:h,o+=1:o+w];b[:,end]=10;print(b'...)

引数付きで実行するには: julia -e 'o=2;h=18;w=40;include("codegolf.jl")'

bashからの呼び出しが不正行為であり、インタープリター内に関数が必要な場合、関数のバージョンは117バイトです:)

f(o,h,w)=(r=repmat;b=r([' '],6,8);b[[1,4],:]='_';b[[2,3,23,24]]='|';b=r(b,h,w)[1:h,o+=1:o+w];b[:,end]=10;print(b'...))

デモ

(追加のバイト節約のヒントをありがとう、@ glen-o!)


PPCGへようこそ!ここでお会いできてうれしいです!
ルイスメンドー

入力は明示的に取得する必要があることに注意してください。つまり、これらの3つの変数には何らかの入力ステートメントが必要です。または、引数として引数を取り、結果を出力または表示する関数を使用できます。完了したら、Try it online!
ルイスメンドー


ああ。はい、やった!:p
タソスパパスティリアヌ

1
文字の代わりにrepmat(repmat([32],6,8))を使用し、次にrepmatの名前を変更して別の文字(g=repmat;b=g([32],6,8)およびそれ以降b=g(b,h,w)[1:h,o+1:o+w+1])を剃ることにより、いくつかの文字を保存できます。その後、交換してくださいreinterpretmap。私の数では、これらの変更の間に9バイト節約できます。
グレンO

3

JavaScript、172 168 165 157 147 142 137バイト

(O,W,H)=>{t='_'.repeat(W),x='|       '.repeat(W),f=t+`
`;for(i=0;++i<H;)f+=(!(i%3)?t:(i%6)>3?x.substr(O,W):x.substr(8-O,W))+`
`;return f}

N = (O,W,H)=>{t='_'.repeat(W),x='|       '.repeat(W),f=t+`
`;for(i=0;++i<H;)f+=(!(i%3)?t:(i%6)>3?x.substr(O,W):x.substr(8-O,W))+`
`;return f}

let test_data = [[6,44,11],
                 [2,20,10],
                 [1,1,1],
                 [1,2,3],
                 [3,80,21]];

for (test of test_data)
    console.log(N(...test));


s.repeat(w)代わりに使用しないのはなぜArray(w).fill(s).join``ですか?
ニール

@ニール:いい考えですが、もっと良いものを考えました。
Yay295

そして、あなたのソリューションが思ったよりも優れていることに気付きました。ありがとう!
Yay295

3

Dyalog APL、29バイト

↑⎕⍴⎕⍴¨a,4⌽¨a←'_',2⍴⊂⌽⎕⌽¯8↑'|'

テスト: 6 44 112 20 101 1 11 2 33 80 21

評価された入力です。式は右から左に実行して、それがために促しFW、及びHその順序で

¯8↑'|'' |'

⎕⌽ 回転し、前からF文字を切り取り、文字列の最後に配置します

他の手段は逆

'_',2⍴⊂ これまでに3つのタプル「_」の後に文字列の2つのコピーが続きます

a,4⌽¨a← これまでのすべての4回転を追加すると、6タプルになります

⎕⍴¨ 各要素を幅に合わせて変形します

⎕⍴ 高さに形を変える

ベクトルのベクトルを行列に混ぜる


2

実際には44 43 40バイト

これはNeilのJS answerのアルゴリズムの実際のポートです。ゴルフの提案を歓迎します。オンラインでお試しください!

╗╝r⌠;6(%4&╜7^^╛'|7" "*+*t╛@H╛'_*3(%YI⌡Mi

アンゴルフ:

          Takes implicit input in the order h, w, f.
╗╝        Save f to register 0. Save w to register 1.
r⌠...⌡M   Map over range [0..h-1]. Call this variable i.
  ;         Duplicate i
  6(%       i%6...
  4&        ...&4
  ╜7^^      ...^i^7. Call it c.
  ╛         Push w.
  '|7" "*+  The string "       |"
  *t╛@H     (("       |" * w)[c:])[:w]
  ╛'_*      Push "_" * w
  3(%       Push 3, move duplicate i to TOS, mod.
  YI        If not i%3, take "_"*w, else (("       |" * w)[c:])[:w]
            Function ends here.
i         Flatten the resulting list and print the bricks implicitly.


1

オクターブ80 76バイト

% in file codegolf.m
c(6,8)=0;c([1,4],:)=63;c([2,3,23,24])=92;char(repmat(c+32,h,w)(1:h,o+1:o+w))

ターミナルから実行するには: octave --eval "o=2;h=18;w=44; codegolf"

(あるいは、端末呼び出しが:pをだましていると思う場合、匿名関数の実装は86バイトかかります:)

c(6,8)=0;c([1,4],:)=63;c([2,3,23,24])=92;f=@(o,h,w)char(repmat(c+32,h,w)(1:h,o+1:o+w))

f(2,18,44)オクターブインタープリターを呼び出します。


1

バッシュ+セッド、411 395 381 370バイト:

F=`printf '_%.s' $(eval echo {1..$2})`;V="       |";(($[($2-$1)/8]>0))&&L=`printf "$V%.s" $(eval echo {1..$[($2-$1)/8]})`||L=;Z=`printf "%$1.s|%s\n" e "$L"`;I=$[($2-(${#Z}-4))/8];(($I>0))&&W=`printf "$V%.s" $(eval echo {1..$I})`||W=;J=${Z:4}$W;for i in `eval echo {1..$[$3/3+1]}`;{ (($[$i%2]<1))&&O+="$F\n$J\n$J\n"||O+="$F\n$Z\n$Z\n";};echo "`echo -e "$O"|sed -n 1,$3p`"

さて、これがBashでの私の最初の答え、またはそれに関するシェルスクリプト言語です。これもここで最も長い答えです。形式でスペースで区切られたコマンドライン引数のシーケンスを取りますOffset Width Height。これはおそらく現在よりもはるかに短くなる可能性があるため、これをより多くゴルフするためのヒントやトリックは大歓迎です。


1

デルファイ/オブジェクトパスカル、305302、292のバイト

3つのパラメーターを読み取る完全なコンソールプログラム。

uses SySutils,Math;var i,q,o,w,h:byte;begin o:=StrToInt(paramstr(1));w:=StrToInt(paramstr(2));h:=StrToInt(paramstr(3));for q:=0to h-1do begin for i:=1to w do if q mod 3=0then Write('_')else if IfThen(Odd(q div 3),((i+o)mod 8),((i-o)mod 8))=1then Write('|')else Write(' ');Writeln('');end end.

食べない

uses
  SySutils,
  Math;
var
  i,q,o,w,h:byte;
begin
  o:=StrToInt(paramstr(1));
  w:=StrToInt(paramstr(2));
  h:=StrToInt(paramstr(3));

  for q := 0 to h-1 do
  begin
    for i := 1 to w do
      if q mod 3 = 0  then
        Write('_')
      else
        if IfThen(Odd(q div 3),((i+o)mod 8),((i-o)mod 8)) = 1 then
          Write('|')
        else Write(' ');
    Writeln('');
  end
end.

悲しいことに、Delphiには三項演算子がなく、非常に冗長な言語です。

テストケース

D:\Test\CodeGolfWall\Win32\Debug>Project1.exe 2 20 10
____________________
  |       |       |
  |       |       |
____________________
      |       |
      |       |
____________________
  |       |       |
  |       |       |
____________________

D:\Test\CodeGolfWall\Win32\Debug>Project1.exe 6 44 11
____________________________________________
      |       |       |       |       |
      |       |       |       |       |
____________________________________________
  |       |       |       |       |       |
  |       |       |       |       |       |
____________________________________________
      |       |       |       |       |
      |       |       |       |       |
____________________________________________
  |       |       |       |       |       |

編集:すべての変数のタイプとしてバイトを使用することにより、3バイトを削ることができます。

編集2:そして、コンソールアプリケーションはプログラム宣言を必要としません、-10

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.