ASCIIアートの反映


26

この課題では、テキストブロックが与えられ、テキストのリフレクションを実行する必要があります。

入力:

  1. 反映される文字列。テキストは、要素がテキスト行である配列として提供されない場合があります。例えば、"ab\ncd"および['a','b','\n','c','d']許可されているが、['ab','cd'][['a','b'],['c','d']]ではありません。すべての行が同じ文字数(必要に応じて空白が埋め込まれる)であると想定できます。
  2. TrueY反射をFalse示し、X反射を示すブール値

2つの入力は任意の順序で渡すことができます。

出力:

反映された文字列。文字は変更されず、位置のみが変更されます。結果の画像ブロックは左上に揃える必要があります(最初の行と列にはそれぞれ空白以外の文字が含まれている必要があります)。(任意の行の)末尾の空白は許可されます。

テストケース:

False
  o /
--|/
  |
 / \

/ o
 /|--
  |
 \ /

True
  o /
--|/
  |
 / \

 / \
  |
--|/
  o /

True
text

text

False
text

txet

True
P
P
C
G

G
C
P
P

False
P
P
C
G

P
P
C
G

True
abcde
fghij
kl mn
opqrs
tuvwx

tuvwx
opqrs
kl mn
fghij
abcde

これはですので、あなたの好きな言語で最短の答えで答えてください!


2
ブール値を任意の形式(たとえば1and 0)で使用できますかTrue、またはand を使用する必要がありFalseますか
TuxCrafting

5
アレイ内の各ラインを置くことが許可されていない、彼らは複数行の文字列を許可しない場合、唯一の方法だろういくつかの言語について
ルイスMendoを

7
@LuisMendo言語の自然な文字列表現にを含めることができない場合、\nそれは文字列表現ではないと言えます。
16

2
ブール入力を少し明確にできますか?2つの値のうち、1つが偽であり、もう1つが真実である値を選択し、それらの値をプログラムで使用できるようにしますか。または私のプログラムはすべての偽の値を一方の方法で処理し、すべての真実の値を他の方法で処理する必要がありますか?
リン

2
また、多くの回答は、入力が長方形であると想定しているようです(すべての行はスペースを使用して同じ長さに埋め込まれます)。その仮定は大丈夫ですか?いずれにしても、質問でこれを明確にする必要があります。
リン

回答:


11

C位、168 144 141 120のバイト

using System.Linq;i=>y=>string.Join("\n",y?i.Split('\n').Reverse():i.Split('\n').Select(x=>string.Concat(x.Reverse())));

新しいバージョンでは、明らかな文字列を使用します。IEnumerableを取得するオーバーロードを結合します。最初のソリューションでは、誤ってそれを使用していましたが、3項のelse側にも使用できました。

更新:

新しいバージョンは匿名ラムダであり、カリー化を使用して合計21バイトを節約します。これによりf("text")(false)、fが無名関数である使用法に変更されます。

ゴルフをしていない:

using System.Linq;

//Using currying to save one byte
input => IsYReflect =>
         //Lambda makes return implicit
         string.Join("\n", IsYReflect
            //Y Reflect, just need to reverse the array
            ? input.Split('\n').Reverse()
            //X Reflect, reverse each line into an IEnumerable
            : input.Split('\n').Select(x => string.Concat(x.Reverse())));

スコットケイはコメントを残しましたが、それはその後削除され、いくつかの新しいことを試して24バイトを削減するきっかけになりました。
JustinM -復活モニカ

C#6発現ボディ関数は、別の3つのバイトを保存
復元モニカ- JustinM


9

Brainfuck、 143の 140 131バイト

,[,[---------->+<[>-]>[->]<,]<[[<]>[++++++++++.>]++++++++++.<[<]<]],[---------->+<[++++++++++>-]>[-<<[.<]++++++++++.[>]>>]<,]<[.<]

Beat s C#。

挑戦はBrainfuckにとって十分に簡単であり、どうやらそれをしなければならないほど疲れていたようです。

0x00入力の先頭にある(偽の)または他の(真の)バイトとしてブール値を取り、次に長方形で埋められた文字列を取ります。

Yフリップの場合は末尾の改行を出力し、Xフリップの場合はなしを出力します。

開始位置の左側のメモリ位置をサポートするインタプリタが必要で(まだ必要かどうかは不明)、EOFをとして返します0x00。そのような通訳者の一人はこちら。そのため、入力のヌルバイトは明らかにサポートしていません。

コードには10 +のブロックがたくさんあるか、- 'の。それらはおそらく減らすことができます。

コメント版

, get mode
[ check truthy input
    ,[ loop thru input
        ---------- subtract newline
        >+ set flag
        < go back to char
        [ was not newline
            > move to flag
            - reset flag
        ]
        > move to flag or one past flag
        [ hit flag; was newline
            - reset flag
            > skip a cell
        ]
        < go to next position
        , read next input
    ]
    < find end of line
    [ loop thru lines
        [<]> find start of line
        [ loop thru line
            ++++++++++ add newline back
            . print this cell
            > go to next cell
        ]
        ++++++++++ change to newline
        . print newline
        <[<]< find end of previous line
    ]
]
,[ loop thru any input left
    ---------- subtract newline
    >+ set flag
    < go back to char
    [ was not newline
        ++++++++++ add newline back
        > move to flag
        - reset flag
    ]
    > move to flag or one past flag
    [ hit flag; was newline
        - clear flag
        < go back to char
        < go back to line chars
        [ loop thru line
            . print this cell
            < go to previous cell
        ]
        ++++++++++. print newline
        [>]>> find empty cell
    ]
    < go to next position
    , read next input
]
< go to line
[ loop thru line
    . print this cell
    < go to previous cell
]

6

32ビットx86マシンコード、76バイト

16進数で:

31c031c9495789f7fcf2aef7d15192b00a89f7f2ae5829f7f7f787f95f4b89c3741287d94b534b8a041eaa75f95b01dea4e2f2c348f7e101c6b00a5651f3a4595e29ce4f4b0f44c3aa75f0c3

入力::EBX方向フラグ(0/1)、: ESI入力文字列、EDI:出力バッファ。入力は長方形である必要があります。

0:  31 c0               xor eax,eax         ;EAX=0
2:  31 c9               xor ecx,ecx         
4:  49                  dec ecx             ;ECX=(uint)-1
5:  57                  push edi            
6:  89 f7               mov edi,esi         
8:  fc                  cld                 
9:  f2 ae               repne scasb         ;Scan input string for terminating NULL
b:  f7 d1               not ecx             ;ECX==<input string length (including NULL)>
d:  51                  push ecx            
e:  92                  xchg edx,eax        ;EDX=0
f:  b0 0a               mov al,0x0a         ;'\n'
11: 89 f7               mov edi,esi         
13: f2 ae               repne scasb         ;Scan input string for the first newline
15: 58                  pop eax             ;EAX==<input string length (including NULL)>
16: 29 f7               sub edi,esi         ;EDI==<single line length (including '\n')>
18: f7 f7               div edi             ;EAX==<# of lines>
1a: 87 f9               xchg ecx,edi        ;ECX=EDI
1c: 5f                  pop edi             ;EDI=<dest buffer>
1d: 4b                  dec ebx             ;Test input flag (0/1)
1e: 89 c3               mov ebx,eax         ;EBX=<# of lines>
20: 74 12               je _vertical        
22: 87 d9               xchg ecx,ebx        ;Horisontal flip, exchange ECX & EBX so we can use LOOP
24: 4b                  dec ebx             ;EBX=<single line length (excluding '\n')>
_hfouter:
25: 53                  push ebx            
_hfinner:
26: 4b                  dec ebx             ;Decrement inner loop counter
27: 8a 04 1e            mov al,[esi+ebx]    ;AL=ESI[EBX]
2a: aa                  stosb               ;*EDI++=AL
2b: 75 f9               jne _hfinner        ;EBX==0 => break
2d: 5b                  pop ebx             
2e: 01 de               add esi,ebx         ;*ESI=='\n' (\0 on the last line)
30: a4                  movsb               ;*EDI++=*ESI++, ESI now points to the next line
31: e2 f2               loop _hfouter       ;--ECX==0 => break
33: c3                  ret                 ;Nothing more to do here
_vertical:
34: 48                  dec eax             ;# of strings less one
35: f7 e1               mul ecx             ;Line length (including '\n')
37: 01 c6               add esi,eax         ;ESI+=ECX*(EAX-1), ESI now points to the beginning of the last line
39: b0 0a               mov al,0x0a         ;'\n'
_vfloop:
3b: 56                  push esi            
3c: 51                  push ecx            
3d: f3 a4               rep movsb           ;Copy the whole line to the output including newline/NULL at the end
3f: 59                  pop ecx             
40: 5e                  pop esi             
41: 29 ce               sub esi,ecx         ;Set ESI to the beginning of the previous line
43: 4f                  dec edi             ;*EDI=='\n' (0 on the first iteration), should overwrite it with correct value
44: 4b                  dec ebx             ;Decrement loop counter
45: 0f 44 c3            cmove eax,ebx       ;if (EBX==0) EAX=EBX, this clears EAX on the last iteration
48: aa                  stosb               ;*EDI++=EBX?'\n':0
49: 75 f0               jne _vfloop         ;EBX==0 => break
4b: c3                  ret                 

5

Haskell、51 49 45バイト

r=reverse
f b=unlines.last(map r:[r|b]).lines

使用例:

f True "abc\ndef\nghi\njkl"
"jkl\nghi\ndef\nabc\n"

f False "abc\ndef\nghi\njkl"
"cba\nfed\nihg\nlkj\n"

行に分割し、行を逆にする(True)か、各行を逆にする(False)かして、1つの文字列に再び結合します。以下の場合にはTrue入力、map r:[r|b]2つの関数のリストである[<reverse each line>, <reverse lines>]とするためのFalse一つの機能を有する入力Aリストは[<reverse each line>]lastこのリストの最後の要素を選択します。



4

Python、56バイト

lambda s,r:'\n'.join(s[::2*bool(r)-1].split('\n')[::-1])

文字列sとtrue / falsey値を使用して呼び出しますr


それはそのようには機能しません。あなたのプログラムは真実の価値をとる必要Trueがあります1。入力を0またはのみに制限することはできません2
mbomb007

ええ、私は答えを考えていませんでした。@ mbomb007はここで正しいです、あなたの言語の真実/偽の値に対して動作する必要があります。
ネイサンメリル

@NathanMerrill参考までに、入力が追加情報をエンコードしてはいけないと言うことで、3バイトの答えのようなものを避けることができます。これで2番目の回答(これはかなり賢いと思った)が可能になりますが、もちろんあなたが見たいのはあなた次第です。
-FryAmTheEggman

この回答は無効であるOPによると、それは出力としてこれをテストケース#1ではなく、そのテストケースのためのポストに記載されているものを出力しなければならないため(すなわちスペースは最初の行の長さにパディング)。
R. Kap

4

Python 3.5、61バイト:

lambda f,j:[print(r[::-1])for r in j[::[1,-1][f]].split('\n')]

矩形入力を想定した単純な匿名ラムダ関数。最初に関数に名前を付けて呼び出し、次に中にラップして呼び出しprint()ます。機能が命名された場合は、他の言葉で、Hそれが好き呼び出すprint(H(<Bool value>, <String>))場合は、<Bool Value>任意の真または偽の値(すなわちである0/1true/falseなど)と<String>入力文字列です。

実際にご覧ください!(repl.it)

長方形の入力を想定した同じ長さの別のバージョンを次に示しますが、今回は名前付き関数です。つまり、最初に名前を付けたり、内部にラップしたりする必要はありませんprint()

def J(f,j):[print(r[::-1])for r in j[::[1,-1][f]].split('\n')]

単純にこれをのように呼び出しますJ(<Bool Value>,<String>)

これを実際にご覧ください!(repl.it)

しかし、私はそこで止まる人ではありません。長方形の入力を想定していますが、そのタイプの入力を想定しないバージョンも作成しました。したがって、<Bool>入力がFalseである場合にのみ、最大長の行に基づいてすべての行を同じ長さにスペースで埋めます。X反射のみが文字列を「反転」させるためです。さて、これ以上苦労することなく、ここに通常の関数の形式での長さ134 129バイトの非長方形の想定バージョンがあります。

def J(f,j):print('\n'.join([' '*((max([len(i)for i in j.split('\n')])-len(r))*(not f))+r[::-1]for r in j[::[1,-1][f]].split('\n')]))

最後のアクションをご覧ください!(repl.it)


3

MATL、11バイト

10&Ybc2i-&P

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

最初の入力は、複数行の文字列です。MATLは\n改行として認識されないため、複数行の文字列は、部分文字列または個々の文字の連結として定義する必要があります。10(改行は文字として解釈されます)。MATLに連結される[... ...]か、[..., ...](コンマはオプションです)。したがって、たとえば、入力は次のようになります(文字列、改行、および別の文字列の連結)。

['first line' 10 'second']

または同等(個々の文字の連結)

['f' 'i' 'r' 's' 't' ' ' 'l' 'i' 'n' 'e' 10 's' 'e' 'c' 'o' 'n' 'd']

または(コンマと同じ)

['f', 'i', 'r', 's', 't', ' ', 'l', 'i', 'n', 'e', 10, 's', 'e', 'c', 'o', 'n', 'd']

第2の入力は、のように入力することができる1/ 0又は同等としてT/Ftrue/ false夫々 。

説明

10     % Push 10 (ASCII for linefeed)
&Yb    % Take input string implicitly. Split at linefeeds. Gives a cell array
c      % Convert to a 2D char array, right-padding with spaces
i~Q    % Input Boolean value. Negate and add 1. Gives 1/2 for true/false resp.
&P     % Flip along that dimension (1: vertically; 2: horizontally). Display implicitly


1
@Fatalizeこれは、MATLとMATLABが入力を読み取る方法が原因です。各行は異なる入力です
ルイスメンドー

2

Brachylog26 24 16バイト

t1,?h@nr~@nw|hrw

文字列とブール値1またはを含むリストが必要です0。例えば

run_from_file('code.bl',["P
|    P
|    C
|    G":1]).

説明

t1,              If the tail of the input is 1
   ?h@n              Split the string on \n
       r             Reverse the resulting list
        ~@n          Join the list of strings with \n
           w         Write to STDOUT
|                Or
hr                   Reverse the string
  w                  Write to STDOUT



1

C(ANSI)、193バイト

ゴルフ:

i,y,x;main(g,o,p)char**o;{p=(o[1][0]=='t');while(o[2][++i]!='\n');p?y=(strlen(o[2])-1)/i:(x=i);do do printf("%c",o[2][x+y*i]);while(p?++x<i:x-->0);while(p?x=0,y--:++y<(x=i-1,strlen(o[2])/i));}

ゴルフをしていない:

i,y,x;
main(g,o,p)char**o;{
    p=(o[1][0]=='t');
    while(o[2][++i]!='\n'); 
    p?y=(strlen(o[2])-1)/i:(x=i);
    do{
        do{
            printf("%c",o[2][x+y*i]);
        }while(p?++x<i:x-->0);
    }while(p?x=0,y--:++y<(x=i-1,strlen(o[2])/i));
}

使用法:

コンパイル引数:

gcc -O3 -ansi

入力例:

入力は、trueまたはfalseの後にtがあるかどうかに続いて、ニュースペースの先頭と末尾の文字列が続きます。

./reverseString t "
truck
ducky
quack
moose
"

出力例:

moose
quack
ducky
truck

1

JavaScript(ES 6)83バイト

(c,b)=>(p=c.split`
`)&&(b?p.reverse():p.map(a=>a.split``.reverse().join``)).join`
`

f=(c,b)=>(p=c.split`
`)&&(b?p.reverse():p.map(a=>a.split``.reverse().join``)).join`
`

f("abcde\nfghij\nkl mn\nopqrs\ntuvwx",1)

c="
  o / 
--|/
  | 
 / \
";

f(c,1)
" / \
   | 
 --|/
   o / "

f(c,0)
"/ o  
  /|--
   |  
  \ / "

f(c,0)試してみると異なる出力が表示されます- c適切な場所にすべてのスペースがない可能性があります。
ニール

最初の "o /"の後の空白は重要ですか?
ピーターモーテンセン

@PeterMortensen&Neil:それは私のコピーペーストからだと確信しています。javascriptコンソールでは、最初の行に「」が付けられ、すべてがひどく見えるので、ここに貼り付けたときに少しフォーマットしました。おそらくバグもあります。
チャーリー・ウィン


1

J、29バイト

}:@,@(,.&LF@{|."1,:|.)>@cutLF

LHS入力は、0が偽で1が真であるブール値です。RHSは文字列入力です。


1

JavaScript(ES6)、76

s=>b=>(s=s.split`
`,b?s.reverse():s.map(r=>[...r].reverse().join``)).join`
`

F=s=>b=>(s=s.split`
`,b?s.reverse():s.map(r=>[...r].reverse().join``)).join`
`

function test()
{
  var rows=I.value, r
  
  // Trim trailing newlines, pad to blank
  rows=rows.split('\n')
  while(!(r=rows.pop()));
  rows.push(r)
  var maxlen=Math.max(...rows.map(r=>r.length))
  rows=rows.map(r=>r+' '.repeat(maxlen-r.length)).join`\n`

  var t1=F(rows)(false)
  var t2=F(rows)(true)
  
  O.textContent = 'False\n'+t1+'\n\nTrue\n'+t2
}

test()
#I { width:50%; height:10em }
<textarea id=I>
  o /
--|/
  |
 / \
</textarea>  
<button onclick=test()>Go</button>
<pre id=O></pre>


1

Java 99バイト

public String[] reverse(String[]a){
  int i=-1,j=a.length;
  for(;++i<--j;){
    String b=a[i];
    a[i]=a[j];
    a[j]=b;
  }
  return a;
}

ゴルフ:

String[] e(String[]a){int i=-1,j=a.length;for(;++i<--j;){String b=a[i];a[i]=a[j];a[j]=b;}return a;}

1

Perl、35バイト

34バイトのコード+ 1 -n

入力行にスペースを埋め込む必要があります。@ Dadaのおかげで13(!)バイトが節約されました。

print/T/?reverse<>:map~~reverse,<>

使用法

perl -ne 'print/T/?reverse<>:map~~reverse,<>' <<< 'False
  o /
--|/ 
  |  
 / \ '

/ o  
 /|--
  |  
 \ / 

 perl -ne 'print/T/?reverse<>:map~~reverse,<>' <<< 'True
  o /
--|/ 
  |  
 / \ '
 / \ 
  |  
--|/ 
  o /

1
perl -ne 'print/T/?reverse<>:map~~reverse,<>'13バイト節約できます:
ダダ

@Dadaは本当に大きな節約です!なぜそうしなかったのかわかりませんが、更新します、ありがとう!
ドムヘイスティングス

0

Mathematica、70バイト

If[#,Reverse,StringReverse]@ImportString[#2,l="Lines"]~ExportString~l&

匿名関数は、ブール値を最初の引数として(明示的にTrueまたはFalseMathematicaで)、2番目の引数として(複数行)文字列を取ります。複数行の文字列の行に対応する文字列のリストとして文字列をインポートします(文字列は配列として関数に渡されません)。の場合True、リストを逆にします。False StringReverseリストの場合、各要素に順番に自動的に適用されます。次に、リストを文字列としてエクスポートします。各要素は新しい行です。


0

05AB1E、10バイト

U|XiRë€R}»

説明

U          Remove the first input line and store it in variable X
 |         Aggregate the rest of the input into an array
  XiR      If x is true, revert the array
     ë€R   Else revert each element
        }  End if
         » Join everything with newlines and implicitly display

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


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