ASCII художественное отражение


26

В этом задании вам дадут текстовый блок, и вам нужно выполнить размышление над текстом.

Входные данные:

  1. Строка для отражения. Текст не может быть представлен в виде массива, элементами которого являются строки текста. Например, "ab\ncd"и ['a','b','\n','c','d']разрешены, но ['ab','cd']или [['a','b'],['c','d']]нет. Вы можете предположить, что все строки имеют одинаковое количество символов (с пробелами, где это необходимо).
  2. Логическое значение, где 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

Это , поэтому ответьте кратчайшим ответом на вашем любимом языке!


2
Можем ли мы взять логическое значение в любом формате (например, 1и 0) или мы должны использовать Trueи False?
TuxCrafting

5
Нельзя помещать каждую строку в массив. Для некоторых языков это будет единственным способом, если они не допускают многострочные строки
Луис Мендо

7
@LuisMendo Если естественное строковое представление языка не может содержать \nI, я бы сказал, что это не строковое представление.
Фатализировать

2
Можете ли вы немного уточнить логический ввод? Могу ли я выбрать любые два значения, одно из которых ложное, а другое правдивое, и заставить мою программу работать с ними; или моя программа должна обрабатывать все ложные значения одним способом, а все истинные значения - другим?
Линн

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())));

Новая версия использует очевидную строку. Перегрузка Join, которая принимает IEnumerable, первое решение было использовать его непреднамеренно, я просто смог использовать его и для другой стороны троичного.

Обновить:

Новая версия является анонимной лямбдой и использует каррирование для экономии всего 21 байта. Это меняет использование, чтобы быть f("text")(false)где f является анонимной функцией.

Ungolfed:

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 - Восстановить Монику

Функция выражения в
теле


9

Brainfuck, 143 140 131 байт

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

Удар с C #.

Брейнфак бросил вызов достаточно легко, и я, видимо, достаточно устал, чтобы просто сделать это.

Принимает логическое значение в качестве 0x00(ложного) или любого другого (истинного) байта в начале ввода, а затем строку с прямоугольным заполнением.

Выводит завершающий символ новой строки для переворота Y и ни одного для переворота X.

Требуется интерпретатор, который поддерживает области памяти слева от начала (не уверен, если все еще требуется) и дает EOF как 0x00. Один такой переводчик здесь . Очевидно, из-за этого не поддерживает нулевые байты на входе.

В коде много блоков с 10 +или -s; те могут быть уменьшены.

Комментируемая версия

, 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 байт

В шестнадцатеричном виде:

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) и снова объединиться в одну строку. В случае Trueввода map r:[r|b]- это список из двух функций, [<reverse each line>, <reverse lines>]а для Falseввода - список с одной функцией [<reverse each line>]. lastвыбирает последний элемент этого списка.



4

Python, 56 байт

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

Вызовите со строкой sи любым значением true / falsey r.


Это не работает таким образом. Ваша программа должна либо принять любое значение truthy, или принимать только True, что также может быть 1. Вы не можете ограничить ввод только 0или 2.
mbomb007

Да, я не продумал свой ответ. @ mbomb007 здесь верный, он должен работать для любых значений правда / ложь для вашего языка.
Натан Меррилл

@NathanMerrill Просто к сведению, вы можете избежать таких вещей, как трехбайтовый ответ, сказав, что ввод не должен кодировать какую-либо дополнительную информацию. Это позволило бы второй ответ (который я считал довольно умным), но, конечно, то, что вы хотели бы видеть, зависит от вас.
FryAmTheEggman

Этот ответ недопустим в соответствии с OP, поскольку он выводит его для контрольного примера № 1, когда вместо этого он должен выводить то, что указано в сообщении для этого контрольного примера (т. Е. Пространство дополняется до длины первой строки).
Р. Кап

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/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/ Fдля true/ 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

Брахилог , 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


1

Bash + общие утилиты Linux, 16

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

Логическое значение (ноль или не ноль), переданное в качестве параметра командной строки. Ввод / вывод текстового блока через STDIN / STDOUT. Предполагается, что все строки имеют одинаковую длину, как указано в комментариях .


1

C (Ansi), 193 байта

Golfed:

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));}

Ungolfed:

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

Пример ввода:

Вводится в или нет для истины ложь, за которым следуют ведущий газеты и завершенная строка.

./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 равно false, а 1 - true. 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;
}

Golfed:

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.

Требуется, чтобы строки ввода были дополнены пробелами. 13 (!) Байтов сохранено благодаря @ Dada .

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или Falseв Mathematica) и строку (многострочная) в качестве второго аргумента. Импортирует строку как список строк, соответствующих строкам многострочной строки (строка НЕ ​​передается функции в виде массива). Если 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"

Попробуйте онлайн!

HexDump

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                                       .

Вы могли бы, вероятно, сохранить кучу байтов с этим отображением
DJMcMayhem
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.