Reflexão de arte ASCII


26

Nesse desafio, você receberá um bloco de texto e precisará refletir sobre o texto.

Entrada:

  1. Uma sequência a ser refletida. O texto não pode ser fornecido como uma matriz cujos elementos são as linhas de texto. Por exemplo, "ab\ncd"e ['a','b','\n','c','d']são permitidos, mas ['ab','cd']ou [['a','b'],['c','d']]não são. Você pode supor que todas as linhas tenham o mesmo número de caracteres (preenchido com espaço em branco quando necessário).
  2. Um booleano onde Trueindica reflexão Y e Falseindica reflexão X

As duas entradas podem ser passadas em qualquer ordem.

Saída:

A sequência refletida. Os personagens não mudam, apenas sua posição. O bloco de imagem resultante deve estar alinhado com o canto superior esquerdo (a primeira linha e coluna devem conter um caractere que não seja um espaço em branco). Espaço em branco à direita (em qualquer uma das linhas) é permitido.

Casos de teste:

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

Como é um , responda com a resposta mais curta no seu idioma favorito!


2
Podemos pegar o booleano em qualquer formato (por exemplo, 1e 0) ou devemos usar Truee False?
TuxCrafting

5
Colocar cada linha em uma matriz não é permitido Para alguns idiomas que seriam a única forma, se eles não permitem cordas de várias linhas
Luis Mendo

7
@LuisMendo Se uma representação de string natural do idioma não puder conter um, \neu diria que não é uma representação de string.
Fatalize

2
Você pode esclarecer um pouco a entrada booleana? Posso escolher qualquer dois valores, um dos quais é Falsey e outra de que é truthy, e fazer o meu trabalho programa com aqueles; ou meu programa deve lidar com todos os valores de falsey de uma maneira e todos os valores de verdade de outra maneira?
Lynn

2
Além disso, muitas das respostas parecem assumir que a entrada é retangular (todas as linhas são preenchidas com o mesmo comprimento usando espaços). Essa suposição está correta? De qualquer forma, você deve esclarecer isso na pergunta.
Lynn

Respostas:


11

C #, 168 144 141 120 bytes

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

Juntar a sobrecarga que leva um IEnumerable, a primeira solução foi usá-lo inadvertidamente, eu só era capaz de usá-lo para o outro lado do ternário.

Atualizar:

A nova versão é uma lambda anônima e usa currying para economizar 21 bytes no total. Isso muda o uso para estar f("text")(false)onde f é a função anônima.

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

Scott Kaye deixou um comentário que já foi removido que me levou a experimentar algumas coisas novas e a cortar 24 bytes.
JustinM - Restabelecer Monica

A função
corporada de

10

Pyke, 7 bytes

!I_)ncX

Experimente aqui!

!I )    - if not boolean:
  _     -  input = reversed(input)
    nc  - input.split("\n")
      X - splat(input)
        -  (print lines backwards)

9

Brainfuck, 143 140 131 bytes

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

Bata s C #.

O desafio foi fácil o suficiente para Brainfuck, e eu aparentemente estava cansado o suficiente para ter que fazer isso.

Leva o booleano como um 0x00byte (falso) ou qualquer outro (verdade) byte no início da entrada e, em seguida, uma string preenchida com retângulo.

Emite uma nova linha à direita para o flip Y e nenhuma para o flip X.

Requer um intérprete que suporte localizações de memória à esquerda do início (não tem certeza se ainda é necessário) e fornece EOF como 0x00. Um desses intérpretes está aqui . Obviamente, não suporta bytes nulos na entrada por causa disso.

O código tem muitos blocos com 10 +'ou -' s; esses provavelmente podem ser reduzidos.

Versão comentada

, 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

Código de máquina x86 de 32 bits, 76 bytes

Em hexadecimal:

31c031c9495789f7fcf2aef7d15192b00a89f7f2ae5829f7f7f787f95f4b89c3741287d94b534b8a041eaa75f95b01dea4e2f2c348f7e101c6b00a5651f3a4595e29ce4f4b0f44c3aa75f0c3

Entrada:: EBXsinalizador de direção (0/1),: ESIsequência de entrada,: EDIbuffer de saída. A entrada é necessária para ser retangular.

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 bytes

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

Exemplo de uso:

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

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

Divida em linhas, inverta as linhas (True) ou inverta cada linha (False) e junte-as em uma única string novamente. No caso de uma Trueentrada, map r:[r|b]há uma lista de duas funções [<reverse each line>, <reverse lines>]e, para uma Falseentrada, uma lista com uma função [<reverse each line>]. lastescolhe o último elemento desta lista.


5

Geléia , 8 bytes

ṣ⁷ṚU⁴?j⁷

Experimente aqui.

ṣ⁷         Split over newlines.
  ṚU⁴?     If ⁴ (2nd argument), then Ṛ (reverse rank ∞), else U (reverse rank 1).
      j⁷   Join with newlines.

4

Python, 56 bytes

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

Ligue com uma string se qualquer valor de verdade / falsey r.


Não é assim que funciona. Seu programa deve assumir qualquer valor verdadeiro ou apenas True, o que também poderia ser 1. Você não pode restringir a entrada para ser apenas 0ou 2.
Mbomb007

Sim, eu não pensei na minha resposta. @ mbomb007 está correto aqui, ele precisa funcionar para qualquer valor de verdade / falsidade para o seu idioma.
Nathan Merrill

@NathanMerrill Apenas um FYI, você pode evitar coisas como a resposta de 3 bytes dizendo que a entrada não deve codificar nenhuma informação adicional. Isso teria permitido a segunda resposta (que eu achei bastante inteligente), mas é claro que você gostaria de ver.
FryAmTheEggman

Essa resposta é inválido de acordo com o OP como ele gera este para caso de teste # 1 quando se deveria, antes, a saída que é dado no post para esse caso de teste (ou seja, o espaço preenchido com o comprimento da primeira linha).
R. Kap

4

Python 3.5, 61 bytes:

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

Uma função lambda anônima simples que assume entrada retangular. Chame-o primeiro nomeando a função e, em seguida, chamando-a de dentro print(). Em outras palavras, se a função foram nomeados H, chamá-lo assim print(H(<Bool value>, <String>)), onde <Bool Value>é qualquer valor verdadeiro ou falso (ie 0/1, true/falseetc.) e <String>é a seqüência de entrada.

Veja em ação! (repl.it)

Aqui está outra versão com o mesmo comprimento que também assume entrada retangular, mas desta vez uma função nomeada , ou seja, você não precisa nomeá-la primeiro nem envolvê-la por dentro print():

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

Simplesmente chame este de como J(<Bool Value>,<String>).

Veja isso em ação! (repl.it)

No entanto, eu não sou o único a parar por aí. Embora nos seja permitido assumir uma entrada retangular, também criei uma versão que não assume esse tipo de entrada. Portanto, ele espaçará todas as linhas com o mesmo comprimento, com base na linha com o comprimento máximo se e somente se a <Bool>entrada for False, pois apenas uma reflexão X resultará no "flipping" da string. Agora, sem mais delongas, aqui está a versão assumida não retangular, com um comprimento de 134 129 bytes na forma de uma função normal:

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')]))

Veja este último em ação! (repl.it)


3

MATL , 11 bytes

10&Ybc2i-&P

Experimente online!

A primeira entrada é a cadeia de linhas múltiplas. Como o MATL não reconhece \ncomo avanço de linha, a sequência de múltiplas linhas deve ser definida como uma concatenação de substrings ou caracteres individuais e 10(ASCII para avanço de linha, que é interpretado como um caractere). A concatenação no MATL é [... ...]ou [..., ...](vírgulas são opcionais). Portanto, por exemplo, a entrada pode ser a seguinte (concatenação de uma sequência, avanço de linha e outra sequência):

['first line' 10 'second']

ou equivalente (concatenação de caracteres individuais)

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

ou (o mesmo com vírgulas)

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

A segunda entrada pode ser inserida como 1/ 0ou equivalente como T/ Fpara true/ falserespectivamente.

Explicação

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 É por causa de como MATL e MATLAB lêem a entrada. Cada linha é uma entrada diferente
Luis Mendo

2

Brachylog , 26 24 16 bytes

t1,?h@nr~@nw|hrw

Espera uma lista contendo a string e o booleano 1 ou 0, por exemplo,

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

Explicação

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

Pitão, 10 bytes

j?Q_.z_M.z

Suíte de teste.

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

Bash + utilitários comuns do linux, 16

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

Valor booleano (zero ou diferente de zero) passado como um parâmetro de linha de comando. E / S do bloco de texto via STDIN / STDOUT. Supõe que todas as linhas tenham o mesmo comprimento, conforme indicado nos comentários .


1

C (Ansi), 193 bytes

Golfe:

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

Uso:

Argumentos de compilação:

gcc -O3 -ansi

Exemplo de entrada:

A entrada está em ou não t para true de false, seguida por um lead do espaço de notícias e uma sequência arrastada.

./reverseString t "
truck
ducky
quack
moose
"

Saída de exemplo:

moose
quack
ducky
truck

1

JavaScript (ES 6) 83 bytes

(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  
  /|--
   |  
  \ / "

Vejo uma saída diferente para f(c,0)quando tento - talvez o seu cnão tenha todos os espaços nos lugares certos.
314 Neil

O espaço em branco à direita após o primeiro "o /" é significativo?
Peter Mortensen

@ PeterMortensen & Neil: Tenho certeza de que é da minha cópia-colagem. O console javascript coloca o seu início "na primeira linha e faz tudo parecer terrível assim que eu formatado um pouco quando eu colei aqui Muito provavelmente eu tenho um bug também..
Charlie Wynn


1

J, 29 bytes

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

A entrada LHS é o booleano em que 0 é falso e 1 é verdadeiro. RHS é a entrada da string.


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 bytes

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

Golfe:

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 bytes

Código de 34 bytes + 1 para -n.

Requer que as linhas de entrada sejam preenchidas com espaços. 13 (!) Bytes salvos graças a @ Dada .

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

Uso

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,<>'deve salvar 13 bytes :-)
Dada

@ Dadá que é realmente uma grande economia! Não faço ideia por que eu não teria feito isso, mas vou atualizar, obrigado!
Dom Hastings

0

Mathematica, 70 bytes

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

Função anônima, recebe um valor booleano como primeiro argumento (explicitamente Trueou Falseno Mathematica) e a cadeia de caracteres (multilinhas) como segundo argumento. Importa a sequência como uma lista de sequências correspondentes às linhas da sequência multilinha (a sequência NÃO é passada para a função como uma matriz). Se True, inverta a lista. Se False StringReversea lista, que é aplicada automaticamente a cada elemento por vez. Em seguida, exporte a lista como uma sequência, em que cada elemento é uma nova linha.


0

05AB1E , 10 bytes

U|XiRë€R}»

Explicação

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

Experimente online!


0

Vim, 33 bytes

Mudou a resposta V anterior para o Vim. Qualquer resposta em V seria bem diferente, então não era realmente justo.

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

Experimente online!

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                                       .

Você provavelmente poderia salvar um monte de bytes com esse mapeamento
DJMcMayhem
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.