Foi apenas um erro de entrada

17

Continuando meu Foi apenas um desafio de bug :

Entrada:

Uma sequência que consiste em caracteres ASCII imprimíveis sem espaços em branco nem novas linhas.

Resultado:

Primeiro, transforme a entrada em um palíndromo revertendo a entrada e adicionando-a antes de si mesma, excluindo o caractere do meio (ou seja, com uma entrada 1234567890, ela se tornará0987654321234567890 ).

E, em seguida, imprima este texto:

0        9        8        7        6        5        4        3        2        1        2        3        4        5        6        7        8        9        0
         0       9       8       7       6       5       4       3       2       1       2       3       4       5       6       7       8       9       0
                  0      9      8      7      6      5      4      3      2      1      2      3      4      5      6      7      8      9      0
                           0     9     8     7     6     5     4     3     2     1     2     3     4     5     6     7     8     9     0
                                    0    9    8    7    6    5    4    3    2    1    2    3    4    5    6    7    8    9    0
                                             0   9   8   7   6   5   4   3   2   1   2   3   4   5   6   7   8   9   0
                                                      0  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9  0
                                                               0 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 0
                                                                        0987654321234567890
                                                               0 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 0
                                                      0  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9  0
                                             0   9   8   7   6   5   4   3   2   1   2   3   4   5   6   7   8   9   0
                                    0    9    8    7    6    5    4    3    2    1    2    3    4    5    6    7    8    9    0
                           0     9     8     7     6     5     4     3     2     1     2     3     4     5     6     7     8     9     0
                  0      9      8      7      6      5      4      3      2      1      2      3      4      5      6      7      8      9      0
         0       9       8       7       6       5       4       3       2       1       2       3       4       5       6       7       8       9       0
0        9        8        7        6        5        4        3        2        1        2        3        4        5        6        7        8        9        0

(Do meio para fora em ambas as direções, cada caractere é separado por mais um espaço que a linha anterior.)

Regras do desafio:

  • Você precisa imprimir duas vezes o comprimento da entrada, menos três linhas. Então, com a entrada1234567890 , a saída exibida acima é de 17 linhas (comprimento 10 * 2 - 3).
  • A entrada conterá apenas ASCII imprimível (excluindo espaço, tabulação e nova linha).
  • Os espaços à direita são opcionais.
  • Uma única linha nova à direita é opcional.
  • Espaços à esquerda (adicionais) ou novas linhas à esquerda não são permitidos.
  • Você pode assumir que a entrada sempre terá pelo menos quatro caracteres.
  • Ao contrário do que foi apenas um desafio, os formatos de entrada e saída são flexíveis. Portanto, você pode gerar o resultado como uma matriz de strings, uma lista de strings etc.

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
  • Lacunas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código.
  • Além disso, adicione uma explicação, se necessário.

Casos de teste:

Input: 1234567890
Output:
0        9        8        7        6        5        4        3        2        1        2        3        4        5        6        7        8        9        0
         0       9       8       7       6       5       4       3       2       1       2       3       4       5       6       7       8       9       0
                  0      9      8      7      6      5      4      3      2      1      2      3      4      5      6      7      8      9      0
                           0     9     8     7     6     5     4     3     2     1     2     3     4     5     6     7     8     9     0
                                    0    9    8    7    6    5    4    3    2    1    2    3    4    5    6    7    8    9    0
                                             0   9   8   7   6   5   4   3   2   1   2   3   4   5   6   7   8   9   0
                                                      0  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9  0
                                                               0 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 0
                                                                        0987654321234567890
                                                               0 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 0
                                                      0  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9  0
                                             0   9   8   7   6   5   4   3   2   1   2   3   4   5   6   7   8   9   0
                                    0    9    8    7    6    5    4    3    2    1    2    3    4    5    6    7    8    9    0
                           0     9     8     7     6     5     4     3     2     1     2     3     4     5     6     7     8     9     0
                  0      9      8      7      6      5      4      3      2      1      2      3      4      5      6      7      8      9      0
         0       9       8       7       6       5       4       3       2       1       2       3       4       5       6       7       8       9       0
0        9        8        7        6        5        4        3        2        1        2        3        4        5        6        7        8        9        0

Input: ABCD
Output:
D  C  B  A  B  C  D 
   D C B A B C D
      DCBABCD
   D C B A B C D
D  C  B  A  B  C  D

Input: =>)}]
Output:
]   }   )   >   =   >   )   }   ]
    ]  }  )  >  =  >  )  }  ]
        ] } ) > = > ) } ]
            ]})>=>)}]
        ] } ) > = > ) } ]
    ]  }  )  >  =  >  )  }  ]
]   }   )   >   =   >   )   }   ]

Input: XXxxXX
Output:
X    X    x    x    X    X    X    x    x    X    X
     X   X   x   x   X   X   X   x   x   X   X
          X  X  x  x  X  X  X  x  x  X  X
               X X x x X X X x x X X
                    XXxxXXXxxXX
               X X x x X X X x x X X
          X  X  x  x  X  X  X  x  x  X  X
     X   X   x   x   X   X   X   x   x   X   X
X    X    x    x    X    X    X    x    x    X   X
Kevin Cruijssen
fonte
Uma quantidade igual de espaços à esquerda em todas as linhas está OK?
Adám
@ Adám Desculpe, mas não. Qualquer número de espaços à direita é bom, mas espaços à esquerda não. Vou especificar esta regra no desafio.
Kevin Cruijssen
2
"Você precisa imprimir o comprimento da entrada menos 3 linhas." então "(comprimento 10 * 2 - 3)". A primeira frase diz "no double", a segunda diz "double". Então qual é?
Olivier Grégoire
@ OlivierGrégoire Opa, primeira linha deve ter contido 2x o comprimento menos 3. Fixa
Kevin Cruijssen

Respostas:

5

Carvão , 14 bytes

E⁻Lθ¹⪫θ× ι‖O←↑

Experimente online!

AST:

Program
├Print
│└E: Map
│ ├⁻: Difference
│ │├L: Length
│ ││└θ: Identifier θ
│ │└1: Number 1
│ └⪫: Join
│  ├θ: Identifier θ
│  └×: Product
│   ├' ': String ' '
│   └ι: Identifier ι
└‖O: Reflect overlap
 └Multidirectional
  ├←: Left
  └↑: Up
Erik, o Outgolfer
fonte
Pode haver 16 pontos de código, mas como o UTF-8 Python 3 relata que são 41 bytes. Qual conjunto de caracteres você usa para torná-lo em 16 bytes?
Janus Troelsen
@JanusTroelsen É um conjunto de caracteres personalizado.
Erik the Outgolfer
Huh, ⪫ trabalha em cordas? Preciso lembrar que para a próxima vez ...
Neil
@ Neil Sim, faz sentido, não é?
Erik the Outgolfer
Tecnicamente, sua edição não é competitiva porque o commit relevante pós o desafio.
Neil
7

Japt , 22 21 bytes

¬Å£¬qYîÃy w ê y w ê ·

Teste online!

Explicação

Os primeiros 8 bytes geram o quadrante inferior direito do padrão:

 ¬ Å  £    ¬ qYîÃ
Uq s1 mXY{Uq qYî} 

Uq                 : Split the input into characters.
   s1              : Slice off the first.
      mXY{      }  : Map each item X and index Y to
          Uq       :   the input split into chars,
             q     :   joined with
              Yî   :     Y spaces.

Neste ponto, temos uma matriz de por exemplo ["ABCD", "A B C D", "A B C D"]. Infelizmente, são necessários 13 bytes para formar o quadrado:

y w ê y w ê ·
y w ê y w ê qR
y                : Pad each line to the same length with spaces and transpose.
  w              : Reverse the array, and
    ê            : palindromize. Now we have the bottom half of the output transposed.
      y          : Transpose back.
        w ê      : Reverse and palindromize again, giving the full output.
            qR   : Join with newlines.
                 : Implicit: output result of last expression
ETHproductions
fonte
Desejo que eu tinha pensado para uso transposição - bem feito :)
Shaggy
Posso fazer uma pergunta com medo de saber a resposta? Você e o resto aqui estão realmente codificando isso em sua versão reduzida?
Gdbj 15/07
Se você ousar. Provavelmente não.
CalculatorFeline
11
@gdbj Eu costumo fazer ... isso é um mau sinal? : P
ETHproductions
O @ETHproductions estava apenas dizendo a um amigo que isso é semelhante ao golfe real: frustrante para aprender, estranhamente viciante e demonstrar habilidade nele exige respeito.
Gdbj
5

05AB1E , 17 bytes

g<F¹RSðN×ýû})Rû.c

Experimente online!

-1 graças a kalsowerus .

Erik, o Outgolfer
fonte
Você pode salvar um byte, substituindo .c.∊porû.c
kalsowerus
@kalsowerus E eu sabia que haveria uma maneira de usar û... obrigado!
Erik the Outgolfer
5

JavaScript (ES6) , 159 136 129 127 bytes

f=(i,x=1-(l=i.length-1),y=x<0?-x:x,[,...b]=i)=>l>x?''.padEnd(l*(l+~y))+[...b.reverse(),...i].join(''.padEnd(y))+`
`+f(i,x+1):''

Experimente online! Explicação abaixo

// This is a recursive function
// First, inputs and various variable initializations
// by using defaults
let func = (
  // Text input, will not be modified through recursion
  input,

  // Current line, for the first function call we start from -lines to +lines
  // It's roughly equivalent to lines*2 but this helps us computing the spacing
  // Also computing the total amount of lines
  currentLine = 1 - (totalLines = input.length - 1),

  // Getting the absolute value of the current line (like Math.floor)
  absCurrentLine = currentLine < 0 ? -currentLine : currentLine,

  // Getting the input without it's first letter, useful for the palidrome of the input
  [,...slicedInput] = input

// Base case, stopping the recursion if the current line
// is still below the total amount of lines
) => totalLines > currentLine

  // Leading spacing
  ? ''.padEnd(totalLines * (totalLines + ~absCurrentLine)) + 

  // Putting together the palindrome version and adding spaces between the chars
    [...slicedInput.reverse(), ...input].join(''.padEnd(absCurrentLine)) + `

  // Line return + recursion call
` + f(input, currentLine + 1)
  : ''

Primeira entrada no codegolf, peço desculpas antecipadamente por quaisquer erros óbvios.

Agradecimentos a Justin Mariner por salvar 23 bytes! Agradecemos a Craig Ayre por salvar 11 bytes e pelo relatório de erros.

Saming
fonte
Ótima primeira resposta, +1 de mim e bem-vindo ao PPCG. Eu não estou muito familiarizado com Js, mas é possível iniciar xem -2 em vez de -1 e alterar x<=lpara ++x<=lpara que você possa remover x++e salvar um byte?
Kevin Cruijssen 5/07
Eu tentei, mas não consegui, porque também linesestá envolvido com o espaçamento e, portanto, acaba custando mais bytes para que tudo funcione novamente. Mas tenho quase certeza de que existe uma maneira melhor de organizar o código e adicionar sua sugestão.
Saming
11
Bem-vindo ao PPCG, bom primeiro post e explicação! Jogou até 133 bytes aqui . Inclui explicação do que foi alterado.
23678 Justin Mariner
Infelizmente a sua saída não parece corresponder bastante o resultado esperado: veja aqui
Craig Ayre
11
Isso é ótimo, eu adicionei a sua nova função e atualizado a explicação
Saming
4

SOGL V0.12 , 22 18 bytes

ā,⁄H{,čFH@*∑Κ}▓±╬-

Experimente aqui!

Explicação:

ā                   push an empty array - canvas
 ,⁄H{        }      input length-1 times do
     ,                push the input
      č               chop it into chars
       FH@*           get the current iteration-1 amount of spaces
           ∑          join the chopped input with the spaces
            Κ         prepend it to the array
              ▓     space to a square
               ±    reverse each string in that list
                ╬-  quad-palindromize with 1 X and 1 Y overlap and without swapping characters
dzaima
fonte
O ╬-comando palindromize em quatro direções é? Eu estava aqui desejando que Japt tivesse algo assim ...: P
ETHproductions
@ETHproductions FWIW, é muitas coisas
dzaima
Eu sei, daí por que eu especifiquei ╬-. Mas, graças, não consegui encontrar essa página por algum motivo
ETHproductions
@ETHproductions Oh. Ele existe apenas na cópia SOGLOnline do intérprete: / Em algum momento, preciso unir os dois: |
Dzaima 5/07
Hmm ... você deve implementar automático Fpara se for necessário.
Erik the Outgolfer
4

Python 3 , 149 141 95 bytes

def f(s):l=len(s)-1;[print((' '*abs(i)).join(s[:0:-1]+s).center(2*l*l+1))for i in range(1-l,l)]

Experimente online!

Agradecemos a @KevinCruijssen e @ETHproductions por salvar alguns bytes

Agradecimentos especiais a @notjagan por salvar 46 bytes!

Mr. Xcoder
fonte
11
Mudar l=len(s);para l=len(s)-1;e depois alterar todos os valores que envolvem l(ou seja, l-1-> l; -l+2-> -l+1; etc.) é 8 bytes mais curto. Experimente aqui.
Kevin Cruijssen
11
-l+2-> 2-l:)
ETHproductions
Obrigado @KevinCruijssen, infelizmente não posso editar no momento, você pode editar?
XCoder #
@KevinCruijssen Muito obrigado!
XCoder #
3
Até 95 bytes usando em centervez do forloop!
precisa saber é
4

PHP, 145 131 bytes

Demorou um pouco para pensar nesse byte adicional; Mas valeu a pena.

while($y<=2*$e=strlen($a=$argn)-1)echo($p=str_pad)("
",$e*($e-$d=abs($y++-$e))+1),chunk_split($a.substr(strrev($a),1),1,$p("",$d));

imprime uma nova linha principal. Execute como pipe -nRou experimente online .

demolir

while($y<=2*$e=strlen($a=$argn)-1)  # $e=length-1, loop through rows
                                        # 1. print linebreak and left padding
    echo($p=str_pad)("\n",$e*($e-$d=abs($y++-$e))+1),
        chunk_split(
            $a.substr(strrev($a),1)     # 2. palindromize input
            ,1,$p("",$d));              # 3. insert $e..0..$e spaces between characters

solução alternativa , mesmo comprimento:

for($d=-$e=strlen($a=$argn)-1;$d<$e;)echo($p=str_pad)("
",$e*($e-$b=abs($d++))+1),chunk_split($a.substr(strrev($a),1),1,$p("",$b));
Titus
fonte
11
Você pode economizar 13 bytes com Experimente online!
Jörg Hülsermann
3

APL (Dyalog) , 37 bytes

Requer ⎕IO←0qual é o padrão em muitos sistemas.

{⍉m(2-d)↓⍉(m←⊖⍪1↓⊢)↑∊¨(1↓⍳d←≢⍵)↑¨¨⊂⍵}

{} Função anônima em que o argumento é representado por

()↑¨¨⊂⍵ Para cada ( ¨) um dos seguintes números aceita ( ) o número de caracteres de cada ( ¨) todo o argumento ( ), preenchendo os espaços conforme necessário:

  ≢w o número de caracteres no argumento

  d← armazene isso em d

   que muitos índices (0… d - 1)

  1↓ solte um (o zero)

∊¨ε nlist (achatar) cada

 elevar a classificação (converter a lista de listas em uma matriz)

(m←) Aplique a seguinte função tácita m , definida como:

   o argumento de cabeça para baixo

   Em cima de

  1 uma linha]

   Caiu de

   o argumento

 transpor

()↓ Drop:

  2-d = - ( d - 2), ou seja, d - 2 linhas a partir do fundo

m aplicar m

 transpor

Experimente online!

Adão
fonte
3

Java (OpenJDK 8) , 201 196 bytes

s->{for(int l=s.length()-1,i=-l,x=0;++i<l;x+=i<0?l:-l)System.out.printf("%1$"+(x<1?"":x)+"s"+s.join("%1$"+(i<0?-i:i>0?i:"")+"s",(new StringBuffer(s.substring(1)).reverse()+s).split(""))+"%n","");}

Experimente online!

É a mesma ideia que usei para o desafio anterior , exceto que a cadeia do gerador agora é um pouco mais longa e com mais casos difíceis de lidar.

%1$Ns0%1$Ns9%1$Ns8%1$Ns7%1$Ns6%1$Ns5%1$Ns4%1$Ns3%1$Ns2%1$Ns1%1$Ns2%1$Ns3%1$Ns4%1$Ns5%1$Ns6%1$Ns7%1$Ns8%1$Ns9%1$Ns0%n
Olivier Grégoire
fonte
3

Python 3 , 134 124 bytes

f=lambda s:'\n'.join([' '*(len(s)-1)*abs(len(s)-abs(i)-2)+(' '*abs(i)).join(s[::-1]+s[1:]) for i in range(2-len(s),len(s)-1)])

Experimente online!

Primeiro post no PPCG depois de um tempo escondido. Procurando sugestões / conselhos!


Obrigado a @LyricLy e a Łukasz Rogalski pelas melhorias!

Chase Vogeli
fonte
11
Você não precisa imprimir a saída dentro da função, a saída pode ser fornecida em um valor de retorno. Além disso, você não precisa contar o número de f=bytes, basta fornecer uma função anônima.
precisa
11
Além disso, -len(s)+2é apenas 2-len(s), um byte a menos.
Łukasz Rogalski
Obrigado @ Łukasz Rogalski e @LyricLy; você me salvou 10 bytes!
Chase Vogeli
3

Haskell, 177 163 bytes

import Data.List
k n=[1..n]>>" "
f s=let n=length s in map(\x->(k(((n-1)*(n-(abs x)))))++(intercalate (k(abs x))$map(\z->[z])$((++)=<<reverse.tail) s))[n,n-1.. -n]

A função fé a função de desafio e retorna uma lista de strings ( [String]), usando unlinesnela deve fornecer a mesma saída visual que os casos de teste ( main = putStr $ unlines $ f "test string"para compilá-la).

Experimente online!

-14 bytes graças a @nimi

Mephy
fonte
11
kpode ser definido como k n=[1..n]>>" "e pcomo p=(++)=<<reverse.tail(você pode até alinhar esta definição).
nimi
2

Mathematica, 141 bytes

Column[Join[Reverse@(s=Row/@Table[Riffle[Reverse@Rest@b~Join~b,""<>Table[" ",i]],{i,0,Length[b=Characters@#]-1}]),Rest@s],Alignment->Center]&
J42161217
fonte