ワードシェーピングの芸術


21

ワードシェーピングの芸術

バイナリマトリックスと文字列を指定すると、マトリックス内のすべての1を左から右に、文字列の文字で置き換えます。文字がマトリックスの形状に形成されたら、マトリックスを印刷し、0をスペースに置き換えます。たぶん1つまたは2つの例を挙げる方が簡単でしょう。


ケース:ベースケース...

入力1:

[0,0,1,0,0]
[0,1,0,1,0]
[1,0,0,0,1]
[0,1,0,1,0]
[0,0,1,0,0]

"PPCGPPCG"

出力1:

  P    
 P C  
G   P
 P C 
  G  

場合: 入力文字列が1の数よりも長い場合...

入力2:

[1,0,0]
[0,1,0]
[1,0,1]

lambda

出力2:

l  
 a 
m b

場合: 入力文字列が1の数よりも短い場合...

入力3:

[1,1,1]
[1,0,1]
[1,1,1]

PPCG

出力3:

PPC
G P
PCG

利用可能な仮定

  • 入力文字列が決して空ではないと仮定することができます。
  • マトリックスが空になることはないと想定できます。
  • バイナリマトリックスがすべてゼロになることはないと想定することはできません。

ルール

  • 文字列が1の数より短い場合は、文字列を繰り返します。すべてを交換する必要があります。
  • 文字列が1の数よりも長い場合は、必要なもののみを使用してください。
  • 入力に整数/ビットの代わりにTrue / Falseを使用できます。
  • 末尾のスペースが必要です。すべてゼロを置き換える必要がありますです。をスペースあります。
  • 単一の末尾の改行は許容されます。
  • これはコードゴルフであり、バイト数が最も少なくなります。

行列は配列として入力する必要がありますか、または複数行の文字列を使用できますか?
タイタス

@Titusは大丈夫、マーティン・エンダーはすでにやりました。
魔法のタコUr

基本ケースは左から右ではありません。上から下、左から右という意味ですか?
edc65

1
たとえば、マトリックスがゼロの2x2グリッドの場合、単一のスペースまたは2x2のスペースグリッドを出力する必要がありますか?
人工

@ pieman2201は、テストケース#4を改善しました。
魔法のタコUr

回答:


3

MATL、11バイト

yz:)1Gg!(c!

入力は、数値行列(;行区切り記号付き)と文字列です。

オンラインでお試しください!あるいは、テストケースを確認します。 1 2 3

y       % Take the two inputs implicitly. Duplicate the first
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lambda', [1,0,0; 0,1,0; 1,0,1]
z       % Number of nonzeros
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lambda', 4
:       % Range
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lambda', [1 2 3 4]
)       % Reference indexing (select values)
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lamb'
1Gg     % Push first input as a logical matrix; will be used as index
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lamb', [1,0,0; 0,1,0; 1,0,1]
!       % Transpose. This is necessary because MATL uses column-major order
        % (down, then accross)
(       % Assignment indexing (fill with values). Since the original matrix
        % is numeric, the new values are introduced as their ASCII codes
        % STACK: [108, 0, 109; 0, 97, 0; 1, 0, 98]
c       % Convert to char
        % STACK: ['l m'; ' a '; '  b']
!       % Transpose back. Implicitly display
        % STACK: ['l  '; ' a '; 'm b']

MATLは基本的に...私はいつものコレクションを見てきたどのように再定義
マジックタコ壺

@carusocomputing Matlabと同様に、主なデータ型は「長方形」配列です。つまり、行列またはn次元の類似物です。数値、文字、またはブール値を含めることができます。また、Pythonのリストのような任意のものを含むことができるセル配列もあります
ルイスメンドー

2週間のオープン後に選択されたベストアンサー。
魔法のタコUr

8

Vim、44 42バイト

qqy$P0xjf1"_xP{@qq@q:s/0/ /g^M:s/,/^V^M/g^M{D

@DjMcMoylexのおかげで2バイト節約できました

ここでは、^Mリテラルの改行があり、そして^VありますCTRL-V

次の形式で入力を受け取ります。

PPCG
00100,01010,10001,01010,00100

免責事項:文字列が40文字より長い場合、コンピューターのRAMが不足する可能性があります。

説明:

qq             @qq@q                            # Start recording a recursive macro.
  y$P0x                                         # Duplicate the string and cut out the first character
       jf1"_xP{                                 # Find the first 1, and replace it with the cut character from the string.
                                                # Now we have replaced all the 1's with their respective character, but we still have the array in the original format, and we have the string massivly duplicated at the first line, so we need to clean it up:
                    :s/0/ /g^M                  # Replace all 0's with a space
                              :s/,/^V^M/g^M     # Replace all ,'s with a newline. The ^V acts like a backslash, it escapes the newline so that the command isn't run too soon
                                           {D   # Delete the first line

「プログラム」を「実行」している私のgifは次のとおりです。

Me typing the keys


1
ハハハ、免責事項が大好きです。
魔法のタコUr

{代わりに使用してgg、カップルを離陸することができます。
DJMcMayhem

わかりました、gifは本当にきちんとしているが、リンクだけによってそれを含むことができると思いますか。過去にスクロールしようとするたびにクロームが遅れる:(
wnnmaw

6

網膜41 33バイト

0

+1`(.)(.*)(\D+)1
$2$1$3$1
A1`

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

入力文字列は、入力の最初の行に与えられ、その後にマトリックスが続きます。Retinaにはリスト(または実際には文字列以外のもの)の概念がないため、行を区切る改行を除いて、バイナリマトリックスにはセパレータはありません。

説明

0

ゼロをスペースに変換します。

+1`(.)(.*)(\D+)1
$2$1$3$1

1入力文字列の最初の文字を入力文字列の最後まで繰り返し回転させながら、最初の文字を繰り返し入力文字列の最初の文字に置き換えます。これは1、入力文字列の文字よりもs が多い場合に注意します。

A1`

最初の行、つまり入力文字列を破棄します。


2
(.)(.*)- Teehee ...
マジックタコ壺

6

JavaScriptのES6、67 53 50 49バイト

@ETHproductionsのおかげで3バイト節約@Neilのおかげでさらに1バイト節約

(a,b,i)=>a.replace(/./g,c=>+c?b[++i]||b[i=0]:' ')

f=
(a,b,i)=>a.replace(/./g,c=>+c?b[++i]||b[i=0]:' ')

G=_=>h.innerHTML = f(`00100
01010
10001
01010
00100`,z.value)
h.innerHTML = G()
<input id=z oninput="G()" value="PPCG"></input>
<pre id=h>

文字列行列が有効な入力形式であることを知る前の古いコード:

(a,b)=>a.map(c=>c.map(d=>d?b[i++%b.length]:' ').join``,i=0).join`
`


私はお勧めc=>' '[c]||b[i++%b.length]しますが、悲しいことにそれはバイト長です
...-ETHproductions

1
ただし、3バイトを節約する別の方法があります(a,b,i)=>a.replace(/\d/g,c=>+c?b[++i]||b[i=0]:' ')
。– ETHproductions

それは文字列の2番目の文字から始まると思います。スニペットの更新がいいでしょう。
タイタス

1
@Titus最初iundefinedであるため、を++i返しますNaN。プロパティbがないためNaN、をb[++i]返しundefined||演算子は右側の引数を実行し、に設定i0て最初の文字を返しbます。
ETHproductions

1
なぜテストするの\dですか?sとs .だけを処理する必要があるため(改行とは一致しません)、きっと十分です。01.
ニール

5

Perl、40バイト

36バイトのコード+ -i -pフラグ。

@F=$^I=~/./g;s/1/$F[$i++%@F]/g;y;0; 

(最後のスペースと最後の改行がないことに注意してください)。

実行するには、-iflagの後に入力文字列を記述し、入力にマトリックスを指定します。

perl -iPPCGPPCG -pe '@F=$^I=~/./g;s/1/$F[$i++%@F]/g;y;0; ' <<< "00100
01010
10001
01010
00100"

Perlが少し古い場合は、(スペースの後に)最後のセミコロンを追加する必要がある場合があります。


5

Python 2、114 71バイト

私は車輪を再発明していましたが、複数行の文字列の単純な二重置換は非常にうまくいきます。文字列には、s*len(L)*len(L[0])ネストされたリストに対して本当にいことをするのではなく、ゼロを直接カウントできるという追加の利点があります

lambda S,s:S.replace("0"," ").replace("1","{}").format(*s*S.count('0'))

古いソリューション:

lambda s,L:"\n".join(["".join(map(lambda n:chr(n+32),l)).replace("!","{}")for l in L]).format(*s*len(L)*len(L[0]))

最初にすべてを+ 32に変換しますchr(すべてゼロはスペースになります)。次に、すべてを!with {}に置き換えて、format関数ます。

NULLスペースとしてカウントできる場合スペースのNULL代わりにチートして使用することにした場合、32バイトの追加をスキップして12バイト節約できます。(スペースとしてprint表示'\x00'

lambda s,L:"\n".join(["".join(map(chr,l)).replace('\x01','{}')for l in L]).format(*s*len(L)*len(L[0]))

NULLを使用し、最後にそれらをスペースで置き換えると短くなりませんか?
nedla2004

@ nedla2004、私はそれをどのように提案しますか?.replace('\x00',' ')最後にa を追加するだけで20バイトが追加されます
-wnnmaw

しかし、私はあなたがこれを取り除くことができると思う:map(lambda n:chr(n + 32)、l)
nedla2004

第2の解決策は、末尾のスペースへのスワッピング、私に12のバイトが保存されます全体の時間が、より多くのそれよりも私の費用がかかります、NULL値で動作します
wnnmaw

あなたが実際にできる以上のものを削除できると思った。
nedla2004

3

APL、18バイト

{(⍴⍺)⍴X\⍵⍴⍨+/X←,⍺}

これは、ブール引数を左引数として、文字列を右引数として取る関数です。

      (↑(1 0 0)(0 1 0)(1 0 1)) {(⍴⍺)⍴X\⍵⍴⍨+/X←,⍺}'lambda'
l  
 a 
m b

説明:

APLには、このようなことを行うビルトインがあります\(展開)。ただし、ベクトルでのみ機能し、各文字を実際に使用する必要があります。

  • X←,⍺:行列を平坦化し、結果をXに保存します。
  • ⍵⍴⍨+/X:必要な量の要素を持つように文字ベクトルを変形します(必要に応じて文字を繰り返して文字列を長くします)。
  • X\:それぞれの文字の一つ取る1と、それぞれのスペース0ではX
  • (⍴⍺)⍴:結果を元のマトリックスの形状になるように形状変更します。

3

PHP、110 91 97 88 82 81 80 75バイト

@ user59178のおかげで6バイト節約

while(""<$c=$argv[1][$i++])echo$c<1?$c?:" ":($s=$argv[2])[$k++%strlen($s)];

で実行し-rます。行列を最初の引数に複数行の文字列、2番目の引数に文字列として期待します。


1
あなたの82に基づき、80バイトのバージョンはバージョンバイト:foreach(str_split($argv[1])as$c)echo$c<1?$c?:" ":($s=$argv[2])[$k++%strlen($s)];私は2つの三元系の順番を入れ替え、したがって、使用することにより、第2のブラケットを落とした<1のではなく>0
user59178

1
for(;""!=$c=$argv[1][$i++];)代わりに使用して4バイトを節約できますforeach(...)
-user59178

3

PowerShell v2 +、70バイト

param($a,$b)$b|%{-join($_|%{if($_){$a[$n++];$n%=$a.length}else{' '}})}

入力ワードas $aを、行列を配列の配列として取ります$b(以下の例を参照)。ループし$b、次に各行の要素をループします$_|%{...}。内側のループはif/ else条件$a[$n++]で、文字列の長さとmod-equalを出力するか、またはスペースを出力します' '。これらは-join一緒に文字列に戻されます。各文字列はパイプラインに残され、改行を含む暗黙的な出力Write-Outputはプログラムの完了時に発生します。

PS C:\Tools\Scripts\golfing> .\the-art-of-word-shaping.ps1 'PPCGPPCG' @(@(0,0,1,0,0),@(0,1,0,1,0),@(1,0,0,0,1),@(0,1,0,1,0),@(0,0,1,0,0))
  P  
 P C 
G   P
 P C 
  G  

PS C:\Tools\Scripts\golfing> .\the-art-of-word-shaping.ps1 'lambda' @(@(1,0,0),@(0,1,0),@(1,0,1))
l  
 a 
m b

PS C:\Tools\Scripts\golfing> .\the-art-of-word-shaping.ps1 'PPCG' @(@(1,1,1),@(1,0,1),@(1,1,1))
PPC
G P
PCG


2

Python 3、104(または83)バイト

import itertools as i
def f(s,L):s=i.cycle(s);return'\n'.join(' '.join(next(s)*e for e in l)for l in L)

短いオプション(83バイト)がありますが、文字列が必要な長さよりも999倍以上短いと失敗します。

def f(s,L):s=list(s)*999;return'\n'.join(' '.join(s.pop(0)*e for e in l)for l in L)

あなたはnextリストを呼び出すことができないので、2番目の解決策は私にとってはうまくいきません。行う場合s=iter(list(s)*999)(89バイト)
L3viathan

1
@ L3viathanごめんなさい、私はそれがなることを意味しましたs.pop(0)。間違ったバージョンをコピーしたようです。それを修正しました。
アリッサ

s[i++%s.length()]私はPythonを知らないが、良い方法論です。
魔法のタコ

それはクールになる、しかし、のようなものはありませんi++Pythonで
アリッサ

1

Pyth、12バイト

jms?R@z~hZ\ 

オンラインで試す:デモンストレーション

説明:

jms?R@z~hZ\ dQ   implicit d and Q at the end
                 I use the variable Z, which is initialized with 0 by default
 m           Q   map each line d of the Q (input matrix) to:
   ?R       d       map each number d of the line either to
     @z~hZ             input[Z++] (increase Z, but lookup in input string with old value)
          \            or space
  s                 join chars to a string
j                print each string on a separate line


1

Common Lisp、152バイト

(defun m(g w)(let((a 0))(loop for r in g do(loop for e in r do(format t"~[ ~;~c~]"e(char w a))(if(= e 1)(setf a(mod(1+ a)(length w)))))(format t"~%"))))

使用法:

* (m (list (list 1 0 1)
           (list 0 1 0)
           (list 1 0 1)) "ppcg")
p p
 c 
g p

この関数は、グリッドの各行の各要素をループします。format要素が0であるか、または要素が1 A改行がグリッドのすべての行の後に印刷されますある場合、文字引数を消費した場合、制御文字列は、スペースを印刷のいずれか。文字列が短すぎる場合、最初から繰り返します。長すぎる場合は、適切な部分のみが出力されます。


1

ピップ、18バイト

17バイトのコード、-lフラグの場合は+1 。

Yb{a?y@++vs}MMa^s

次のように、配列を最初のコマンドライン引数として使用します100 010 101(シェルで引用符で囲む必要があります)。2番目のコマンドライン引数として文字列を使用します。オンラインでお試しください!

説明

                   a and b are cmdline args, s is space, v is -1
Yb                 Yank b into global variable y
              a^s  Split a on space into list of rows
  {        }MM     Map this function to the items of the items of a (i.e. each character):
   a               Function argument
    ?              Ternary operator (truthy if 1, falsey if 0)
       ++v         If truthy, increment v...
     y@            ... and use it to index into y (cyclically)
                   I.e.: each time we hit a 1, replace it with the next character of y
          s        If falsey, space
                   The result is a list of lists of characters; -l concats sublists and
                   newline-separates the main list

1

Java、237 233バイト

編集:ムクルクマールのおかげで4バイトを保存しました

ゴルフ:

String T(int[][]m,String b){int l=m.length,a=0;String o="";for(int i=0;i<l;i++){for(int j=0;j<l;j++){if(m[i][j]==1&&a<b.length()){o+=Character.toString(b.toCharArray()[a]);a++;if(a== b.length()-1)a=0;}else o+=" ";}o+="\n";}return o;}

ゴルフをしていない:

public String T(int[][] m, String b) {
    int l = m.length,a=0;
    String o = "";
    for(int i = 0; i < l; i++)
    {
        for(int j = 0; j < l; j++)
        {
            if(m[i][j] == 1 && a < b.length())
            {
                o += Character.toString(b.toCharArray()[a]);
                a++;

                if(a == b.length() - 1)
                    a = 0;
            }
            else
             o += " ";
        }
        o += "\n";
    }
    return o;
}

テスト:

  int[][] matrix = new int[][]
  {{ 0, 0, 1, 0, 0 }, { 0, 1, 0, 1, 0 },
  { 1, 0, 0, 0, 1 },{ 0, 1, 0, 1, 0 },
  { 0, 0, 1, 0, 0 },};
  TheArtOfWordShaping taows = new TheArtOfWordShaping();
  System.out.println(taows.T(matrix, "PPCGPPCG"));

  matrix = new int[][] {{1,0,0}, {0,1,0}, {1,0, 1}};
  taows = new TheArtOfWordShaping();
  System.out.println(taows.T(matrix, "lamda"));

  matrix = new int[][] {{1,1,1},{1,0,1},{1,1, 1}};
  taows = new TheArtOfWordShaping();
  System.out.println(taows.T(matrix, "PPCG"));

  P  
 P C 
G   P
 P C 
  P  

l  
 a 
m d

PPC
P P
CPP

あなたは..... 1行ですべてのint型を宣言することができます
Mukulクマール

1

パイク、12バイト

.FdRIKQoQl%@

ここで試してみてください!

文字のマトリックスを出力します

または9バイト、非競合。

.FdRIKQo@

ここで試してみてください!

  • 要求されたインデックスがインデックス可能な長さよりも大きいインデックス可能なものにラッピングを追加します。.F-deep_for(input)I-if ^:Qo @-Q [o ++] dR-else ""

さらに非競争的な8バイト

.FIQo@(P

ここで試してみてください!

  • print_grid 空の文字列を適切に整列するようになりました
  • deep_for 現在、真実とは異なるタイプの偽物のタイプ推測を行います

.F    (  -  deep_for(input)
 I       -   if ^:
  Qo@    -    input[o++]
       P - pretty_print(^)

1

Java、122バイト

String g(int[][]a,char[]b){String r="";int e=0;for(int[]c:a){for(int d:c){r+=d==0?' ':b[e++%b.length];}r+='\n';}return r;}

0

Mathematica、76バイト

""<>(s=#2;f:=(s=RotateLeft[s];Last[s]);Map[If[#1,f," "]&,#,{2}]~Riffle~"\n")&

2つの引数の名前のない関数。最初の(#)はTruesの配列であり、False sの、2番目の(s)は文字のリストです。ヘルパー関数

f:=(s=RotateLeft[s];Last[s])

が定義されます。これにより、動きの最初の文字が s最後にばかりの文字を返します。f数回呼び出すと、次の文字が周期的に返されます。s順番にれます。

コア機能は

Map[If[#1,f," "]&,#,{2}]

f毎回呼び出すTrue入力配列の値すべての偽入力でスペースを返します。(リスト自体ではなく、配列のコンポーネントリストの要素で作業する{2}ように指示Mapします。)

これらの60バイトは、文字の配列を返します。sとスペースのます。ラッパー

    ""<>(...~Riffle~"\n")&

その配列の各リストの間に改行を入れてから、すべてを連結します。


0

C ++、61バイト

for(auto&i:m){for(int&j:i)cout<<(j?s[k++%l]:' ');cout<<'\n';}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.