Levei muito tempo para fazer isso, por favor. (Comentários do YouTube # 1)

84

Espere ... isso não é corrico.


fundo

Atualmente, no YouTube, as seções de comentários estão repletas de padrões:

S
St
Str
Stri
Strin
String
Strin
Stri
Str
St
S

onde Stringé um mero marcador de posição e refere-se a qualquer combinação de caracteres. Esses padrões são geralmente acompanhados por um It took me a lot of time to make this, pls likeou algo assim, e muitas vezes o OP consegue reunir vários gostos.


A tarefa

Embora você tenha um grande talento para acumular votos positivos no PPCG com suas habilidades encantadoras de golfe, você definitivamente não é a melhor opção para fazer comentários espirituosos ou fazer referência a memes nas seções de comentários do YouTube. Assim, seus comentários construtivos feitos com pensamento deliberado acumulam alguns "gostos" no YouTube. Você quer que isso mude. Portanto, você recorre aos padrões clichês mencionados acima para alcançar sua ambição final, mas sem perder tempo tentando escrevê-los manualmente.

Simplificando, sua tarefa é pegar uma string, digamos s, e 2*s.length - 1gerar substrings sdelimitadas por uma nova linha, de modo a cumprir o seguinte padrão:

(para s= "Olá")

H
He
Hel
Hell
Hello
Hell
Hel
He
H

Entrada

Uma única sequência s. Os padrões de entrada da comunidade se aplicam. Você pode assumir que a sequência de entrada conterá apenas caracteres ASCII imprimíveis.


Resultado

Várias linhas separadas por uma nova linha, constituindo um padrão apropriado, conforme explicado acima. Os padrões de saída da comunidade se aplicam. Linhas em branco à esquerda e à direita (que não contêm caracteres ou caracteres que não podem ser vistos, como um espaço) na saída são permitidas.


Caso de teste

Um caso de teste com várias palavras:

Input => "Oh yeah yeah"

Output =>

O
Oh
Oh 
Oh y
Oh ye
Oh yea
Oh yeah
Oh yeah 
Oh yeah y
Oh yeah ye
Oh yeah yea
Oh yeah yeah
Oh yeah yea
Oh yeah ye
Oh yeah y
Oh yeah 
Oh yeah
Oh yea
Oh ye
Oh y
Oh 
Oh
O

Observe que há distorções aparentes no formato da saída do caso de teste acima (por exemplo, a linha dois e a linha três da saída parecem iguais). Isso ocorre porque não podemos ver os espaços em branco à direita. Seu programa NÃO precisa tentar corrigir essas distorções.


Critério vencedor

Isso é , então o código mais curto em bytes em cada idioma vence!

Arjun
fonte
19
Estou planejando fazer mais alguns desafios relacionados aos comentários do YouTube no futuro; daí o YouTube Comments #1no título.
Arjun
11
É permitido retornar uma matriz de linhas?
alguém
2
Podemos pegar a entrada como uma matriz de caracteres e retornar uma matriz de matrizes de caracteres?
Shaggy
3
A entrada pode ser ""? Que tal um único personagem como "H"? Em caso afirmativo, qual deve ser o resultado para ambos os casos?
AdmBorkBork 27/02

Respostas:

103

brainfuck , 32 bytes

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

Experimente online!

O mesmo loop é usado para as duas metades do padrão.

Explicação:

,             Take first input character as initial line
[             Until line to output is empty:
  [<]>        Move to beginning of line
  [.>]        Output all characters in line
  ++++++++++. Output newline
  ,           Input next character
  [>>]        Move two cells right if input character nonzero
  <[-]        Otherwise remove last character in line
  <           Move to new last character in line
]
Nitrodon
fonte
2
Isso é simplesmente incrível. Eu estava tentando fazer algo no cérebro, mas saiu cerca de 10 vezes mais e ainda não funcionou corretamente.
ElPedro 27/02
34
Nunca pensei que veria um desafio em que a resposta do cérebro estava realmente marcando competitivamente, um trabalho incrível!
Pontos de interrogação
54

JavaScript (ES6), 36 bytes

f=([c,...r],s=`
`)=>c?s+f(r,s+c)+s:s

Experimente online!

Comentado

f = (             // f is a recursive function taking:
                  //   the input string split into:
  [c,             //     c   = next character (may be undefined if we've reached the end)
      ...r],      //     r[] = array of remaining characters
  s = `\n`        //   the output string s, initialized to a linefeed
) =>              // 
  c ?             // if c is defined:
    s +           //   append s (top of the ASCII art)
    f(r, s + c) + //   append the result of a recursive call to f, using r[] and s + c
    s             //   append s again (bottom of the ASCII art)
  :               // else:
    s             //   append s just once (this is the final middle row) and stop recursion
Arnauld
fonte
3
resposta muito agradável: D
lois6b 27/02
10
@MartinBarker No Windows, estou usando o Notepad ++ com o final de linha padrão ativado Unix (LF). Problema resolvido de uma vez por todas. :)
Arnauld
3
Impressionante! Você pode escrever uma explicação para isso para quem é iniciante em JS?
Akhoy 01/03
3
@ Akhoy Adicionei uma versão comentada.
Arnauld
3
Obrigado. Muito mais claro agora.
Akhoy 01/03
47

05AB1E (legado) ,  4  3 bytes

Riscado &nbsp;4&nbsp;já não é 4 :)

η.∊

Experimente online ou verifique todos os casos de teste .

Explicação:

η     # Get the prefixes of the (implicit) input-string
 .∊   # Vertically mirror everything with the last line overlapping
      # (which implicitly joins by newlines in the legacy version of 05AB1E)
      # (and output the result implicitly)

Na nova versão do 05AB1E, »é necessário explícito após o η, e é por isso que eu uso a versão herdada do 05AB1E aqui para salvar um byte.

Kevin Cruijssen
fonte
7
Hmm, isso parece 6 bytes em UTF8:\xce\xb7\x2e\xe2\x88\x8a
rubenvb 28/02
10
@rubenvb Em UTF-8 é realmente mais. O 05AB1E usa, assim como algumas das linguagens de programação usadas em outras respostas (por exemplo, Jelly; Japt; Carvão), seu próprio código-fonte (que é o CP-1252 no caso de 05AB1E), onde cada um dos 256 caracteres que conhece é um byte único.
Kevin Cruijssen 28/02
Tudo bem, é justo :).
rubenvb 28/02
@KevinCruijssen O PHP parece achar que esses caracteres são inválidos para o CP-1252, mas poderia ser apenas um bug do PHP: 3v4l.org/UC1QE
hanshenrik
7
@hanshenrik Boa pergunta. Na verdade, não é o CP-1252, mas, na verdade, a codificação 05AB1E , que é a codificação personalizada usada. Os bytes deste código em hexadecimal são 08 2e 17, que você pode executar e verificar com o --osabiesinalizador: tio.run/…
Adnan
21

IBM PC DOS, montagem 8088,  44  43

d1ee ad8b d6b4 0948 8af8 8ac8 d0e1 49b3 243a cf7d 024e
4e46 861c cd21 861c 52ba 2901 cd21 5ae2 eac3 0d0a 24

Desmontado:

    SHR  SI, 1              ; point SI to DOS PSP at 80H (SI intialized at 100H)
    LODSW                   ; load arg length into AL, advance SI to 82H
    MOV  DX, SI             ; save start of string pointer
    MOV  AH, 9              ; DOS API display string function
    DEC  AX                 ; remove leading space from string length
    MOV  BH, AL             ; save string len in BH (AL gets mangled by INT 21H,9)
    MOV  CL, AL             ; set up loop counter in CL
    SHL  CL, 1              ; number of lines = 2 * string length - 1
    DEC  CX
    MOV  BL, '$'            ; end of string marker
LINE_LOOP:
    CMP  CL, BH             ; if CL >= string length, ascend
    JGE  ASCEND
    DEC  SI                 ; descend by backing up two places (always increments)
    DEC  SI                 ; (this is fewer bytes than 'SUB SI, 2' or two branches)
ASCEND:
    INC  SI                 ; increment current string position
    XCHG BL, [SI]           ; swap current string byte with end of string delimiter
    INT  21H                ; write substring to console
    XCHG BL, [SI]           ; restore string byte
    PUSH DX                 ; save output string pointer
    MOV  DX, OFFSET CRLF    ; load CRLF string
    INT  21H                ; write to console
    POP  DX                 ; restore output string pointer
    LOOP LINE_LOOP          ; move to next line
    RET
CRLF DB 0DH,0AH,'$'

Explicação

Loop 2 * input length - 1para cada linha. A função de exibição de seqüência de caracteres da API do DOS ( INT 21H,9) grava uma $seqüência de caracteres terminada na tela, portanto, toda vez que o loop é executado, o caractere após o último a ser exibido é trocado pelo terminador de fim de sequência.

O contador de loop é comparado com o comprimento da string e, se for maior (significando a parte ascendente da saída), a posição da string / swap é incrementada; caso contrário, é decrementada (na verdade, -1-1+1são menos bytes que uma estrutura de ramificação if / else).

Programa executável autônomo, pega a string de entrada da linha de comando.

Resultado

insira a descrição da imagem aqui

Download YT2.COM (43 bytes)

640KB
fonte
11
A maioria dos tipos de DOS tem SI = 100 h ao carregar um arquivo COM. Isso pode economizar um byte, substituindo a primeira instrução por SHR SI, 1.
gastropner 8/03
@gastropner muito inteligente! Acontece que o original não será executado no DOS 1.0 de qualquer maneira, já que conta com CH sendo 0 (custaria +2 bytes para inicializar, o que não vale a pena apenas para o DOS 1). Atualizado com nova versão!
640KB 08/03
Você precisa inserir a data sempre que abrir o terminal?
user14492 2/09
11
@ user14492 ha, não! Esqueci de cortar essa parte da captura de tela do DOS!
640KB 2/09
19

Python 2 , 60 52 bytes

f=lambda s,n=1:s[n:]and[s[:n]]+f(s,n+1)+[s[:n]]or[s]

Experimente online!

Python 3.8 (pré-lançamento) , 50 bytes

f=lambda s,n=1:s>(x:=s[:n])and[x,*f(s,n+1),x]or[s]

Experimente online!

TFeld
fonte
2
Isso depende de um próximo recurso de 3,8? Qual recurso?
alexis
7
@alexis Isso é usar uma expressão de atribuição : x:=s[:n].
Arnauld
11
Ah, agora vejo obrigado :-) Já li sobre o recurso antes, ansioso por ele. Ainda sinto falta dos meus dias C ...
alexis
11
Porém, eles não imprimem a saída. Eles apenas fazem a matriz, certo?
Jaden Travnik
@JadenTravnik Python automaticamente engana o resultado da última expressão se estiver executando de forma interativa por um console
Xeverous 4/03
18

MATL , 8 bytes

nZv"G@:)

Experimente online!

Por favor, goste deste post para o smiley :)no código que demorei muito tempo para fazer.

n  % Length of the input string
Zv % Symmetric range ([1 2 ... n ... 1])
"  % For each k in above range
G  % Push input
@: % Push [1 2 ... k]
)  % Index
Sanchises
fonte
17

J , 11 bytes

Função de prefixo tácito anônimo. Retorna uma matriz de caracteres preenchida com espaço.

[:(}:,|.)]\

Experimente online!

]\ a lista de prefixos

[:() Aplique a seguinte função a essa lista

|. a lista inversa

, anexado com

}: a lista reduzida (sem último item)

Adão
fonte
18
[:(e }:,|parece tão triste…
Adám
Mas é (}: que é uma pessoa feliz com um bigode chique
DonFusili
13

Perl 6 , 31 bytes

{[\~](@_)[0...@_-1...0]}o*.comb

Experimente online!

Bloco de código anônimo que pega uma string e retorna uma lista de linhas.

Explicação:

{                      }o*.comb   # Pass the list of characters into the codeblock
 [\~](@_)                 # Triangular reduce by concatenation
                          # e.g. The list [1,2,3,4] turns into [1,12,123,1234]
         [0...@_-1        # Return the elements from 0 to length of string minus 1
                  ...0]   # And back down to 0
Brincadeira
fonte
5
É engraçado que hoje em dia, mesmo o Perl jogado no golfe esteja entre os competidores mais legíveis.
deixou de girar contra-relógio em
7
@ceasedtoturncounterclockwis Bem, esse é o Perl 6. A resposta do Perl 5 ainda é ilegível
Jo King
12

Japt -R , 4 bytes

å+ ê

Redução cumulativa em uma string.

-1 byte graças a @Shaggy

Experimente online!

Quintec
fonte
Cético sobre o "-R" que deve ser incluído na string (sem ela a saída não funciona)
Flying Thunder
3
@FlyingThunder Não seja mais um cético :) veja aqui
Quintec 27/02
@ Quintec, comecei a vincular as bandeiras nos cabeçalhos da minha solução a essa meta post para tentar antecipar esse tipo de comentário.
Shaggy
11
A convenção com certeza é <language> + -flagou <language> -flag. Também: | Eu esqueci que a redução cumulativa era uma coisa, eu juro que pulava toda vez que a via
ASCII-only
@ ASCII-only Mesmo, eu só me lembrei disso porque estava pensando em como resolver isso no APL e disse: "Gostaria de saber se o Japt tem esse recurso embutido". Além disso, eu não usei <idioma> -flag?
Quintec
11

Japonês -R , 9 7 bytes

-2 bytes graças a Shaggy

Êõ@¯XÃê

Experimente online!

Somente ASCII
fonte
7 bytes
Shaggy
11
@ Shaggy oh espera ... Ãé uma coisa
apenas ASCII
Outros 300 representantes a caminho assim que essa pergunta for elegível para uma recompensa.
Shaggy
11
@ Quintec, redução cumulativa também funciona em strings, para que você não precise dividir no início. Eu também diria que isso é diferente o suficiente para garantir a publicação por si mesmo.
Shaggy
10

Perl 5 ( -p), 26 bytes

s,.,$\=$`.$/.$\;"$`$&
",ge

TIO

Nahuel Fouilleul
fonte
10

Haskell, 52 50. 44 bytes

f x=unlines$init<>reverse$scanr(\_->init)x x

Experimente online!

Joseph Sible
fonte
Bem vindo ao site. initsrequer que uma importação seja usada para que você precise adicionar import Data.Listou algo semelhante.
Wheat Wizard
@ SriotchilismO'Zaic Não tinha certeza se era necessário contar ou não. Adicionado, obrigado!
Joseph Sible
4
Também devo mencionar que temos uma sala de bate-papo para conversar sobre o golfe de Haskell. Se você tiver quaisquer pensamentos ou perguntas, é um ótimo lugar.
Wheat Wizard
11
Eu não posso acreditar que você veio exatamente com o que eu ia postar:import Data.List putStr.unlines.((++)<*>reverse.init).tail.inits
Axman6
9

R , 79 65 62 58 bytes

write(substring(s<-scan(,""),1,c(1:(r=nchar(s)),r-1:r)),1)

Experimente online!

-14 pelo conhecimento da função superior de Giuseppe

-3 com indexação mais limpa

-4 graças à mudança de Nick Kennedy e Giuseppe para scanewrite

Evitar loops (e substr) é bom.

CriminallyVulgar
fonte
2
os loops são completamente desnecessários, como são sapply- substringfarão o que você deseja (com uma linha vazia à direita) e por 65 bytes ! Definitivamente, eu não teria pensado substringse não tivesse visto seu bom uso substraqui.
Giuseppe
11
Haha, boa captura! Acho que aprendi mais sobre funções alternativas para o mesmo trabalho em suas edições do que em qualquer outro lugar neste momento.
CriminallyVulgar
2
Haha, R tem uma quantidade estúpida de sinônimos com diferenças sutis. Toda vez que sinto que conheço a melhor ferramenta para o trabalho, encontro outra coisa um pouco melhor em um caso estranho ...
Giuseppe
3
Que tal Experimente online! usando scane write? Apenas 59 bytes!
Nick Kennedy
11
@NickKennedy 58 bytes se você substituir ""por 1.
Giuseppe
7

Geléia , 5 4 bytes

-1 byte graças a @ JonathanAllan !

¹ƤŒḄ

Experimente online! Eu acho que esta é a minha segunda resposta Jelly? Não sei se isso é ótimo. Estou mais convencido de que isso é ótimo. Retorna uma matriz de linhas.

Explicação

¹ƤŒḄ     input: "Hi!"
¹Ƥ       prefixes of the input: [["H"], ["H", "i"], ["H", "i", "!"]]
  ŒḄ     bounce, using each array: [["H"], ["H", "i"], ["H", "i", "!"], ["H", "i"], ["H"]]

Outra abordagem, proposta por @ JonathanAllan, é a ;\ŒḄque reduz cumulativamente ( \) a concatenação ( ;), que é outra maneira de gerar prefixos.

Conor O'Brien
fonte
Temos permissão para produzir uma matriz de linhas, para que você possa esbarrar Yno código (eu faria o rodapé ÇYou ÇŒṘpara evitar uma impressão de esmagamento implícita de um programa completo). Em uma nota lateral, isso também é implementado de forma equivalente ;\ŒḄà mesma contagem de bytes (você também pode passar o argumento, "blah"pois Jelly interpreta isso como uma lista de caracteres - a sua é realmente uma lista de listas de caracteres, como você verá se você fizer o rodapé ÇŒṘ)
Jonathan Allan
@JonathanAllan thanks! muito interessante :)
Conor O'Brien
7

Python 3.8 (pré-lançamento) , 48 bytes

lambda s,r='':(l:=[r:=r+c for c in s])+l[-2::-1]

Experimente online!

Usa expressões de atribuição com :=para acumular uma lista de prefixos e, em seguida, novamente para salvar o resultado para concatenar seu reverso (sem o primeiro caractere).

Python 2 , 51 bytes

f=lambda s,l=[]:s and f(s[:-1],[s]+l)or l+l[-2::-1]

Experimente online!

Quase temos a seguinte solução agradável de 45 bytes, mas ela possui a string original duas vezes e não vejo uma maneira curta de corrigir isso.

f=lambda s,l=[]:s and f(s[:-1],[s]+l+[s])or l

Experimente online!

xnor
fonte
Você não precisaria adicionar uma nova linha e imprimir para obter a saída desejada?
Jaden Travnik
Algo como print('\n'.join(f(s))) ?
Jaden Travnik
@JadenTravnik Os padrões da comunidade (que este desafio segue) permitem funções além dos programas. E o autor do desafio disse nos comentários que está bem com uma lista de strings dentro da junção, conforme permitido por padrão , embora eu próprio não goste disso como padrão e o tenha diminuído. Veja também o resumo das regras do Python .
xnor 03/03
Hã. Ok, obrigado por apontar isso. Sou novo ¯_ (ツ) _ / ¯. Se for esse o caso, aqui está uma solução concorrente de 45 bytes:x=[s[:i+1]for i in range(len(s))];x+x[-2::-1]
Jaden Travnik
@JadenTravnik Sem problemas, infelizmente as regras estão espalhadas por todo o lugar. Seu exemplo, porém, é um trecho que não é permitido. Ele precisa fazer entrada e saída como s=input();x=[s[:i+1]for i in range(len(s))];print x+x[-2::-1]. Veja os exemplos no topo aqui .
xnor 03/03
6

Carvão , 5 bytes

G^Lθθ

Experimente online! Link é a versão detalhada do código. Explicação: desenha um polígono preenchido, ^especifica que os lados estão para baixo à direita e para baixo à esquerda (o polígono se fecha automaticamente), Lθespecifica o comprimento desses lados como sendo o comprimento da entrada original e o final θespecifica a sequência de preenchimento.

Neil
fonte
6

C # (Compilador interativo do Visual C #) , 123 109 94 84 84 bytes

Supõe que podemos retornar uma matriz de matriz de caracteres (acredito que podemos, pois uma matriz de caracteres é uma representação válida para uma string e uma matriz de strings é uma representação válida para várias linhas)

a=>new int[a.Length*2-1].Select((b,i)=>a.SkipLast(Math.Abs(a.Length-i-1)))

Experimente online!

alguém
fonte
5

Anexo , 15 bytes

Bounce@Prefixes

Experimente online!

Bem simples. Bounces (acrescenta reverso sem centro) o Prefixesda entrada.

Como alternativa, 21 bytes Bounce@{_[0..0:~-#_]} :, reimplementando o prefixo.

Conor O'Brien
fonte
5

Braquilog (v2), 6 bytes

a₀ᶠ⊆.↔

Experimente online!

Envio de função, retornando uma matriz de linhas. Vagamente baseado na resposta de @ Fatalize .

Explicação

a₀ᶠ⊆.↔
    .↔  Find a palindrome
   ⊆      that contains, in order,
  ᶠ       all
a₀        prefixes of {the input}

A ordem de desempate aqui é definida pelo , que, quando usado com esse padrão de fluxo, prefere a saída mais curta possível, com quebra de empate, colocando os elementos fornecidos o mais cedo possível . A saída mais curta possível é o que queremos aqui (porque não é possível ter prefixos duplicados), e colocar os elementos fornecidos (ou seja, os prefixos) o mais cedo possível os colocará na primeira metade (arredondada para cima) do resultado. Como também exigimos que eles sejam colocados na mesma ordem, obtemos exatamente o padrão necessário, embora a descrição que fornecemos ao Brachylog seja muito geral; acontece que os tiebreaks funcionam exatamente da maneira certa, fazendo com que o Brachylog escolha a saída que queremos, em vez de alguma outra saída que obedeça à descrição.

ais523
fonte
5

PowerShell, 89 87 66 bytes

-2 bytes graças a @AdmBorkBork

param($a)0..($d=$a.Length-1)|%{$b+=,-join$a[0..$_]};$b+$b[--$d..0]

Experimente online!

Na verdade, não funcionou como especificado antes, desculpe por isso! Eu editei e também consegui raspar alguns bytes.

Gabriel Mills
fonte
Você pode, em --$dvez de ($d-1)salvar um casal no final.
AdmBorkBork 27/02
@AdmBorkBork Thanks.
Gabriel Mills
Infelizmente, isso não funciona para a entrada de um caractere.
AdmBorkBork
5

PowerShell , 46 bytes

($l=$args|% t*y|%{($s+=$_);++$i})+$l[$i..0]|gu

Experimente online!


PowerShell , 42 bytes (especial do YouTube, sujo)

Sabe-se que o tamanho máximo de um comentário no youtube é de 10.000 caracteres. Ok, use isso como o limite superior.

($l=$args|% t*y|%{($s+=$_)})+$l[1e4..0]|gu

Experimente online!

confuso
fonte
4

APL (Dyalog Unicode) , SBCS de 9 bytes

Função de prefixo tácito anônimo. Retorna a lista de strings.

(⊢,1↓⌽),\

Experimente online!

,\ a lista de prefixos (lit, a concatenação cumulativa)

() Aplique a seguinte função a essa lista:

 a lista invertida

1↓ largue o primeiro item

, preceder

 a lista não modificada

Adão
fonte
4

Ruby , 51 42 40 bytes

f=->s,i=1{s[i]?[t=s[0,i],*f[s,i+1],t]:s}

Experimente online!

Graças à maçaneta da porta por -2 bytes.

Kirill L.
fonte
11
Você pode salvar 2 bytes substituindo ...por,
Maçaneta da porta
4

JavaScript (Node.js) , 90 bytes

Provavelmente isso pode ser jogado muito mais, Arnauld já tem um caminho bem mais curto, mas eu me diverti pelo menos!

s=>{a=[];for(c=s.length-1;c--;)a[c]=s.slice(0,c+1);return[...a,s,...a.reverse()].join`\n`}

Experimente online!

T. Dirks
fonte
4

SNOBOL4 (CSNOBOL4) , 118 bytes

	N =INPUT
	L =1
1	X =LT(X,SIZE(N)) X + 1	:F(D)
O	N ARB . OUTPUT POS(X)	:($L)
D	X =GT(X) X - 1	:F(END)
	L ='D'	:(O)
END

Experimente online!

Parece haver um erro nesta implementação do SNOBOL; tentar substituir o rótulo Dpelo rótulo 2causa um erro, embora o manual do Vanilla SNOBOL indique isso (ênfase adicionada)

Se um rótulo estiver presente, ele deverá começar com o primeiro caractere da linha. Os rótulos fornecem um nome para a declaração e servem como destino para a transferência de controle do campo GOTO de qualquer declaração. Os rótulos devem começar com uma letra ou dígito, opcionalmente seguido por uma sequência arbitrária de caracteres. O campo do rótulo é finalizado pelo caractere em branco, guia ou ponto e vírgula. Se o primeiro caractere de uma linha estiver em branco ou tabulado, o campo do rótulo estará ausente.

Minha suposição é que o interpretador CSNOBOL suporta apenas um único rótulo que começa com um número inteiro.

Giuseppe
fonte
4

APL + WIN, 31 bytes

Solicita a entrada da string:

 ⊃((⍳n),1↓⌽⍳n)↑¨(¯1+2×n←⍴s)⍴⊂s←⎕

Explicação:

(¯1+2×n←⍴s)⍴⊂s create a nested vector of the string of length =1+2x length of string

((⍳n),1↓⌽⍳n)↑¨ progressively select elements from each element of the nested vector 
              following the pattern 1  2 ...to n to n-1 ... 1

⊃ convert nested vector into a 2d array.
Graham
fonte
4

F # (.NET Core) , 67 61 bytes

let l=s.Length
[1..l*2-1]|>Seq.map(fun i->s.[..l-abs(i-l)-1])

Experimente online!

A entrada é a stringe a saída é umaseq<string>

Outra solução pode ser let f(s:string)=for i=1 to s.Length*2-1 do printfn"%s"s.[..s.Length-abs(i-s.Length)-1]para bytes 80ish ... Não tenho certeza de que vale a pena investigar.

aloisdg
fonte
4

sed , 31 35 bytes

:x
h
s/.\n.*\|.$//
/^$/{x;q}
H
G
bx

Experimente online!

Explicação

No início de cada iteração do loop, o espaço do padrão é um "pedaço central" da saída desejada e cada loop adiciona uma cópia abreviada à parte superior e inferior.

:x                 
h                  Copy the current chunk to hold space
s/.\n.*\|.$//      Remove the last letter of the first line, and all other lines (if there are any)
/^$/{x;q}          If pattern space is empty we're done; output hold space
H                  Add the shortened line to the end of hold space
G                  and add the new hold space to pattern space.
bx                 
Sophia Lechner
fonte
11
Bom, mas a linha do meio (a entrada original completa) parece ser emitida 3 vezes. Pelo menos com o GNU sed. O mesmo no TIO. Qual sedimplementação você usa e como passa a entrada? (BTW, alterando a substituição para s/.\n.*\|.$//
corrigi-
2
Ah, você está certo. Não é um problema com minha sedimplementação (usando o GNU versão 4.2.1), simplesmente não percebi o bug. Eu brinquei com algumas outras correções e não consigo encontrar nada que adicione menos de quatro bytes, por isso estou adotando sua correção, obrigado.
Sophia Lechner
4

Python 2 , 131 100 84 bytes

Minha primeira resposta no Code Golf!

-47 bytes em geral, graças a @ SriotchilismO'Zaic

a,b=[],len(x)
for i in range(2*b-1):
 if i<b:a+=x[i]
 else:a=a[:-1]
 print''.join(a)

Experimente online!

Yoni Matz
fonte
11
Bem-vindo ao PCG! Não deixe de ler o tour e o código de conduta . Boa solução!
akozi 28/02
2
Para python, você pode usar ;s em vez de novas linhas para evitar o recuo. Também não há necessidade de espaços entre printe''
Wheat Wizard
Obrigado pelas dicas @ SriotchilismO'Zaic, realmente ajudou a reduzir minha contagem de bytes!
Yoni Matz
2
E uma última coisa, se você criar auma string em vez de uma lista, não precisará mais disso joine poderá apenas print a.
Wheat Wizard
4
Inválido, ele precisa ser um programa ou função completa, enquanto você assume entrada está no x.
somente ASCII em
4

J , 12 bytes

]\,[:}.@|.]\

Experimente online!

Ainda 1 byte mais longo que o de Adám

K (oK) , 12 11 bytes

-1 byte graças a ngn

{x,1_|x}@,\

Experimente online!

Galen Ivanov
fonte
2
Eu superei o mestre‽
Adám 27/02
@ Adám Estou longe de ser um mestre em J :) Existem muitos codificadores em J aqui melhores do que eu.
Galen Ivanov
11
-1 byte para oK:{x,1_|x}@,\
ngn 28/02
@ngn Obrigado!
Galen Ivanov