이 도전에서는 텍스트 블록이 주어지며 텍스트를 반영해야합니다.
입력:
- 반영 할 문자열입니다. 텍스트가 요소 인 텍스트 배열 은 텍스트 로 제공 되지 않을 수 있습니다. 예를 들어,
"ab\ncd"
및['a','b','\n','c','d']
허용되지만,['ab','cd']
또는[['a','b'],['c','d']]
하지 않습니다. 모든 줄의 문자 수가 동일하다고 가정 할 수 있습니다 (필요한 경우 공백으로 채워짐). True
Y 반사를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
이것은 코드 골프 이므로 가장 좋아하는 언어로 가장 짧은 답변으로 답변하십시오!
답변
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())));
답변
파이크, 7 바이트
!I_)ncX
!I ) - if not boolean:
_ - input = reversed(input)
nc - input.split("\n")
X - splat(input)
- (print lines backwards)
답변
브레인 퍽, 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
]
답변
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
답변
하스켈, 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
이리스트의 마지막 요소를 선택합니다.