No início desta semana, aprendemos sobre como formatar idiomas esotéricos para comentar. Hoje, vamos fazer o inverso disso. Preciso que você escreva um programa ou função que analise algum código esotérico bem comentado e analise os comentários, retornando apenas o código. Usando alguns exemplos do desafio anterior, eis a aparência do código bem comentado:
a #Explanation of what 'a' does
bc #Bc
d #d
e #Explanation of e
fgh #foobar
ij #hello world
k #etc.
l #so on
mn #and
op #so forth
Aqui está o que você precisa fazer para extrair o código. Primeiro, remova o caractere de comentário ( #
), o espaço antes dele e tudo depois do caractere de comentário.
a
bc
d
e
fgh
ij
k
l
mn
op
Em seguida, recolha cada linha para cima em uma única linha. Por exemplo, como b
está na segunda coluna da linha dois, quando a recolhermos, ela estará na segunda coluna da linha um . Similarmente,c
será colocado na terceira coluna da linha um e d
na quarta. Repita isso para cada personagem e você obtém o seguinte:
abcdefghijklmnop
Nota importante: parece que a solução trivial é apenas remover os comentários, remover todos os espaços e juntar todas as linhas. Esta não é uma abordagem válida! Como o código original pode ter espaços, eles serão removidos com essa abordagem. Por exemplo, esta é uma entrada perfeitamente válida:
hello #Line one
#Line two
world! #Line three
E a saída correspondente deve ser:
hello world!
O desafio:
Escreva um programa ou função que receba o código comentado como entrada e emita ou retorne o código com todos os comentários analisados. Você deve produzir o código sem espaços à direita, embora uma nova linha à direita seja permitida. O caractere de comentário sempre será #
e sempre haverá um espaço extra antes do início dos comentários. #
irá não aparecem na seção de comentários da entrada. Para manter o desafio mais simples, eis algumas entradas que você não precisa lidar com:
Você pode assumir que o código não terá dois caracteres na mesma coluna. Por exemplo, esta é uma entrada que viola esta regra:
a #A character in column one bc #Characters in columns one and two
Você também pode supor que todos os caracteres de comentário apareçam na mesma coluna. Por exemplo, esta entrada:
short #this is a short line long #This is a long line
viola essa regra. Isso também significa que
#
não estará na seção de código.E, por último, você não precisa lidar com seções de código com espaços à esquerda ou à direita. Por exemplo,
Hello, # World! #
Você também pode assumir que a entrada contém apenas caracteres ASCII imprimíveis.
Exemplos:
Input:
hello #Line one
#Line two
world! #Line three
Output:
hello world!
Input:
E #This comment intentionally left blank
ac #
h s #
ecti #
on is #
one c #
haracte #
r longer #
than the #
last! #
Output:
Each section is one character longer than the last!
Input:
4 #This number is 7
8 #
15 #That last comment is wrong.
16 #
23 #
42 #
Output:
4815162342
Input:
Hello #Comment 1
world #Comment 2
, #Comment 3
how #Comment 4
are #Comment 5
you? #Comment 6
Output:
Hello world, how are you?
Input:
Prepare #
for... #
extra spaces! #
Output:
Prepare for... extra spaces!
Você pode digitar qualquer formato razoável que desejar, por exemplo, uma lista de strings, uma única string com novas linhas, uma lista 2D de caracteres, etc. A resposta mais curta em bytes vence!
hello world!
que você mostrou)? Além disso, você declara: "#
não aparecerá na seção de comentários da entrada. ", Mas pode ocorrer no próprio trecho de código?do {stuff} while (condition);
com a explicação em ordemdo while (condition); #Explainything
então{stuff} #Explainything
.Respostas:
Geléia ,
87 bytesExperimente online!
Como funciona
fonte
Python 2,
4843 bytesGraças a @xnor por jogar fora 5 bytes!
Test it on Ideone.
fonte
map(max,*x)
becausemax
takes any number of arguments andNone
is small.map
can be used like that... Thanks!`...`[2::5]
trick work?`...`
is equivalent torepr(...)
, so for the list of singleton strings['a', 'b', 'c']
, you get the string"['a', 'b', 'c']"
. Finally,[2::5]
chops off the first two characters ("['"
) and takes every fifth character of the remaining string.JavaScript (ES6),
977560 bytesThanks to @Neil for helping golf off 22 bytes
Input is an array of lines.
a
is array inputp
is previous itemc
is current itemm
is match stringo
is offsetfonte
m
regexp flag is unnecessary (did you have a$
at one point?) as is the space in(p, c)
. Finally, I thinkreplace
will work out shorter than[...p].map().join
.length
and userscript, maybe you didn't count the newline, but only because I accidentally included the semicolon;
which isn't required (JavaScript has ASI).replace
would help so much, that's really neat!Perl,
353432 bytesIncludes +1 for
-p
Give input on STDIN
eso.pl
Notice that there is a space after the final
;
. The code works as shown, but replace\0
by the literal character to get the claimed score.fonte
$a|=...
is rather well done, it took me a while to figure out what you were doing! One question though :*_=a
seems to be roughly equivalent to$_=$a
, why is that?*_=a
is a very obscure glob assignment which aliases the_
globals and thea
globals. So it's not so much a copy from$a
to$_
but from that point on (global)$a
and$_
are actually the same variable. All to save 1 byte...Python 2, 187 bytes
I'm gonna golf this more tomorrow I have school ;)
fonte
1 for
can be reduced to1for
. Also, if the sum of the list (at line 5) can't be negative, you can just check for<1
instead of==0
. Happy school day! :D +1.Ruby, 63 bytes
Basically a port of Dennis' Jelly answer. Takes input as an array of strings.
See it on eval.in: https://eval.in/640757
fonte
CJam, 12 bytes
Thanks to Sp3000 for saving 2 bytes.
An unnamed block that takes a list of strings (one for each line) and replaces it with a single string.
Try it online!
Explanation
fonte
J, 30 bytes
Takes a list of strings as input. Basically uses the same approach as Dennis in his Jelly answer.
Commented and explained
Intermediate steps:
Test case
fonte
Javascript (ES6), 63 bytes
Takes input as an array of strings.
fonte
Retina, 32 bytes
Byte count assumes ISO 8859-1 encoding.
Try it online!
fonte
Pyke,
1510 bytesTry it here!
Port of the Jelly answer
fonte
C#
157122 BytesGolfed 35 bytes thanks to @milk -- though I swear I tried that earlier.
Takes input as a 2-d array of characters.
157 bytes:
fonte
Trim()
work instead ofTrimEnd()
? Even better, I think you can save a lot of bytes by using s[0] as the output var and usingreturn new string(s[0],0,i)
wherei
is the index of the last code character. That idea may require twofor
loops instead of theforeach
, I'll think about it more and try to write actual code later today.Trim()
will trim from the start as well, which I believe wouldn't be valid. I also was originally doing the loading into s[0] and I had inti;
outside of the loop (to reuse it in the return) which I believe ultimately added bytesPyth, 11 bytes
A program that takes input of a list of strings on STDIN and prints a string.
Try it online
How it works
fonte
sed, 126 bytes
Requires a newline at the end of the input.
I'm sure I can golf this a little more, but I'm just happy it works for now.
fonte
Perl 6, 39 bytes
Translation of the Python solution by Dennis.
Takes input as a list of strings, and returns a string.
(try it online)
fonte
Jelly, 27 bytes
Test it at TryItOnline
Uses the strictest spec - the extra space before the comment character is removed at the cost of a byte.
Input is a list of strings.
fonte
Ruby, 77 bytes
fonte
TSQL,
216175 bytesGolfed:
Ungolfed:
Fiddle
fonte
Javascript,
5634 bytes, non-competingAs @n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ pointed out, I am not prepared for extra spaces
fonte
Dyalog APL, 22 bytes
Inspiration.
(
⎕UCS
character representation of¯2↓
all but the last two of⍳∘35↑
up until the position of the first 35 ("#"), in that which is outside the parenthesis, taken from⊢
that which is outside the parenthesis)
namely...⌈⌿
the columnar maximums∘
of⎕UCS
the Unicode valuesTryAPL online!
fonte