ASCII 예술 반영


26

이 도전에서는 텍스트 블록이 주어지며 텍스트를 반영해야합니다.

입력:

  1. 반영 할 문자열입니다. 텍스트가 요소 인 텍스트 배열 은 텍스트 로 제공 되지 않을 수 있습니다. 예를 들어, "ab\ncd"['a','b','\n','c','d']허용되지만, ['ab','cd']또는 [['a','b'],['c','d']]하지 않습니다. 모든 줄의 문자 수가 동일하다고 가정 할 수 있습니다 (필요한 경우 공백으로 채워짐).
  2. TrueY 반사를 False나타내고 X 반사를 나타내는 부울

두 입력은 임의의 순서로 전달 될 수 있습니다.

산출:

반영된 문자열. 문자는 변경되지 않고 위치 만 변경됩니다. 결과 이미지 블록은 왼쪽 상단에 정렬되어야합니다 (첫 번째 행과 열에는 각각 공백이 아닌 문자가 포함되어야 함). 후행 공백 (행 중 하나)이 허용됩니다.

테스트 사례 :

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
우리는 모든 형식 (예를 들면.에서 부울 걸릴 수 10) 또는 우리가 사용해야 TrueFalse?
TuxCrafting

5
여러 줄 문자열을 허용하지 않는 유일한 방법 인 일부 언어의 경우
Luis Mendo

7
@LuisMendo 언어 자연 문자열 표현을 포함 할 수없는 경우 문자열 표현이 아니라고 \n말할 수 있습니다.
페이탈 라이즈

2
부울 입력을 약간 명확히 할 수 있습니까? 내가 데리러받을 수 있나요 어떤 두 값을, 하나는 falsey이며, 그 중 다른 하나는 truthy, 그리고 그와 함께 내 프로그램 작업을; 또는 내 프로그램이 모든 잘못된 값을 한 방향으로 처리하고 모든 진실한 값을 다른 방법으로 처리해야합니까?
Lynn

2
또한 많은 대답은 입력이 직사각형이라고 가정합니다 (모든 줄은 공백을 사용하여 동일한 길이로 채워집니다). 그 가정은 괜찮습니까? 어느 쪽이든, 당신은 질문에서 이것을 명확히해야합니다.
Lynn

답변:


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 진의 다른 쪽에도 사용할 수있었습니다.

최신 정보:

새 버전은 익명의 람다이며 카레를 사용하여 총 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())));

Scott Kaye는 그 이후로 제거 된 의견을 남겨서 새로운 일을 시도하고 24 바이트를 줄 이도록했습니다.
JustinM-복원 모니카

C # 6 expression bodied 함수는 또 다른 3 바이트를 절약합니다
JustinM-Reinstate Monica


9

브레인 퍽, 143 (140) 131 바이트

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

비트 C #을.

그 도전은 Brainfuck에게는 충분히 쉬웠고, 나는 그것을해야 할 정도로 피곤했습니다.

0x00입력 시작시 부울을 (거짓) 또는 다른 (거친) 바이트로 가져온 다음 사각형으로 채워진 문자열을 가져옵니다.

Y 플립의 후행 줄 바꿈을 출력하고 X 플립의 경우 줄 바꿈을 출력하지 않습니다.

시작 왼쪽의 메모리 위치를 지원하고 (여전히 필요한지 확실하지 않은) 통역사가 필요하고 EOF를로 제공합니다 0x00. 그러한 통역사가 여기 있습니다 . 분명히 입력 때문에 널 바이트를 지원하지 않습니다.

코드에는 10 +또는 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

하스켈, 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) 단일 문자열로 다시 결합합니다. (A)의 경우 True, 입력, map r:[r|b]두 기능의 목록 [<reverse each line>, <reverse lines>]과에 대한 False하나 개의 함수와 입력 A의리스트 [<reverse each line>]. last이리스트의 마지막 요소를 선택합니다.



4

파이썬, 56 바이트

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

문자열 s과 진실 / 거짓 값으로 전화하십시오 r.


그런 식으로 작동하지 않습니다. 여러분의 프로그램 중 하나를 수행하는 모든 truthy 값을, 또는 만 가지고 True도 할 수있는, 1. 입력을 0또는 로만 제한 할 수 없습니다 2.
mbomb007

그래, 나는 내 대답을 생각하지 않았다. @ mbomb007은 여기에 정확하며, 귀하의 언어에 대한 진실 / 허위 가치를 위해 작동해야합니다.
Nathan Merrill

@NathanMerrill 참고로 입력에 추가 정보를 인코딩해서는 안된다는 말로 3 바이트 응답과 같은 것을 피할 수 있습니다. 이것은 두 번째 대답을 허용했을 것입니다 (물론 영리하다고 생각했습니다). 물론 당신이보고 싶은 것은 당신에게 달려 있습니다.
FryAmTheEggman

이 응답은 유효하지 OP에 따라 그 출력으로 테스트 케이스 # 1 대신 그 테스트 케이스에 대한 포스트 주어진 어떤 출력한다 위해 (즉 공간은 제 1 라인의 길이에 패딩).
R. Kap

4

파이썬 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/1, true/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(줄 바꿈의 경우 ASCII 문자로 해석 됨). 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']

번째 입력 으로서 입력 될 수 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이 입력을 읽는 방식 때문입니다. 각 라인은 다른 입력입니다
Luis Mendo

2

Brachylog , 26 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

2

Pyth, 10 바이트

j?Q_.z_M.z

테스트 스위트.

j?Q_.z_M.z  first line evaluated as Q, all other lines as .z
 ?Q         if Q:
   _.z         yield reverse(.z)
      _M.z  else: yield map(reverse, .z)
j           join by newlines

1

배쉬 + 일반적인 리눅스 유틸리티, 16

(($1))&&tac||rev

부울 값 (0 또는 0이 아닌)이 명령 줄 매개 변수로 전달되었습니다. STDIN / STDOUT을 통한 텍스트 블록의 I / O. 주석에 표시된 대로 모든 행의 길이가 같다고 가정합니다 .


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

입력 예 :

입력은 t에 true이거나 false이면 newspace 리드와 후행 문자열입니다.

./reverseString t "
truck
ducky
quack
moose
"

출력 예 :

moose
quack
ducky
truck

1

자바 스크립트 (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올바른 장소에 모든 공간이 없을 수도 있습니다 .
Neil

첫 번째 "o /"뒤의 공백이 중요합니까?
Peter Mortensen

@ PeterMortensen & Neil : 필자가 복사하여 붙여 넣은 것 같습니다. 자바 스크립트 콘솔은 첫 줄에 "시작 부분을 표시하고 모든 것을 끔찍하게 보이게하여 여기에 붙여 넣을 때 약간 형식을 지정했습니다. 버그가있을 가능성이 높습니다.
Charlie Wynn


1

J, 29 바이트

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

LHS 입력은 0이 거짓이고 1이 참인 부울입니다. RHS는 문자열 입력입니다.


1

자바 스크립트 (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

자바 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

펄, 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

@Dada는 정말 큰 절약입니다! 왜 그렇게하지 않았는지 모르겠지만 업데이트 할 것입니다. 감사합니다!
Dom Hastings

0

Mathematica, 70 바이트

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

익명 함수는 부울 값을 첫 번째 인수 (명시 적으로 True또는 FalseMathematica)로, (여러 줄) 문자열을 두 번째 인수로 사용합니다. 문자열을 여러 줄 문자열의 줄에 해당하는 문자열 목록으로 가져옵니다 (문자열은 함수로 배열로 전달되지 않습니다). 인 경우 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

온라인으로 사용해보십시오!


0

Vim, 33 바이트

이전 V 답변을 Vim으로 변경했습니다. 모든 V 답변은 매우 다르므로 실제로 공평하지 않았습니다.

DgJ:if@"
g/^/m0
el
se ri
en
cG"

온라인으로 사용해보십시오!

육각 덤프

00000000: 4467 4a3a 6966 4022 0a67 2f5e 2f6d 300a  DgJ:if@".g/^/m0.
00000010: 656c 0a73 6520 7269 0a65 6e0a 6347 1222  el.se ri.en.cG."
00000020: 08                                       .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.