O COBOL é uma linguagem muito antiga, no momento da escrita, tem 58 anos. É tão antigo, de fato, que tem uma peculiaridade muito interessante: os seis primeiros caracteres de cada linha são comentários.
Por que isso, você pergunta? Bem, esses 6 caracteres foram criados para serem usados como números de linha, no dia em que os programas não eram completamente digitais e digitados em um computador.
Além disso, o sétimo caractere só pode fazer parte de um conjunto muito pequeno (geralmente é *
para comentar a linha ou um espaço para separar o número da linha do código)
Mas e se você estiver em um sistema mais digital e quiser apenas o programa bruto?
O sistema de comentários
Existem dois tipos de comentários no COBOL: comentários de linha e os comentários "número da linha" mencionados acima.
Não é necessário comentar números de linhas: basta retirar os sete primeiros (seis mais um espaço) de cada linha.
000000 apple
000001 banana
celery donuts
se tornaria:
apple
banana
donuts
Os comentários de linha tornam um pouco mais difícil. Um comentário de linha é iniciado com um asterisco *
colocado na posição de sétimo caractere na linha, da seguinte forma:
000323* this is a comment
Este não é um comentário de linha:
*00000 this isn't a comment
Para remover o comentário de uma linha, remova a linha inteira.
Um exemplo comentou "programa":
000000 blah blah
000001* apples
000002 oranges?
000003* yeah, oranges.
000*04 love me some oranges
A versão não comentada:
blah blah
oranges?
love me some oranges
Em outras palavras, para descomentar uma sequência, remova os seis primeiros caracteres de cada linha e retorne todos, exceto o primeiro caractere de cada linha que não começa com uma estrela.
O desafio
Crie um programa ou função que pega um programa comentado e retorna sua variante não comentada.
Esclarecimentos
- Asteriscos (
*
) nunca serão encontrados em nenhum lugar fora dos sete primeiros caracteres de uma linha (não estamos solicitando que você verifique a sintaxe) - Cada linha sempre terá pelo menos 7 caracteres.
- Você pode assumir que o sétimo caractere é sempre um asterisco ou um espaço.
- Entrada ou saída pode ser uma matriz ou lista.
- Somente caracteres ASCII imprimíveis (mais nova linha) devem ser manipulados.
- Você pode imprimir com uma nova linha à direita. Você também pode assumir que a entrada terá uma nova linha à direita, se assim desejar.
Pontuação
Como se trata de código-golfe , a resposta com o mínimo de bytes vence!
AVISO LEGAL: Na verdade, eu não conheço COBOL e não reivindico. Se alguma das reivindicações sobre COBOL que fiz nesta pergunta estiver incorreta, não me responsabilizo.
*
. Isso é uma coincidência?key:{key:{key:length,key:length}}
. Tira todos os dados de formatação e digitação.Respostas:
COBOL (GnuCOBOL), 191 + 17 = 208 bytes
Eu "aprendi" o COBOL para esta resposta, portanto provavelmente não está totalmente preparado para o golfe.
Este é um programa completo, tendo como base o que eu presumo ser uma entrada padrão e escrevendo como o que eu presumo ser uma saída padrão. Talvez um dia eu volte a isso e (1) determine se COBOL tem funções e, se houver, (2) veja se uma solução de função seria mais curta.
A contagem de bytes inclui sinalizadores de programa e compilador (
-free
e-frelax-syntax
).Experimente Online
Programa ungolfed
Limitações
Tecnicamente, a saída não está correta. Da minha pesquisa superficial, parece que a única maneira prática de armazenar uma string no COBOL é em um buffer de tamanho fixo. Eu escolhi um tamanho de buffer de 80 caracteres, pois esse é o limite de comprimento de linha para programas de formato fixo. Isso apresenta duas limitações:
Eu acho que isso é aceitável, pois, bem, é COBOL. Caso contrário, eu estaria disposto a procurar alternativas.
Agradecimentos
fonte
Python 2 ,
393837 bytes-1 byte graças ao LyricLy. -1 byte graças ao Mego.
Experimente online!
E / S como listas de cadeias.
fonte
!=
por<
, já que o ponto de código de um espaço é menor que o de um asterisco e o sétimo caractere sempre será um espaço ou um asterisco.You may assume the seventh character is always an asterisk or a space.
if'*'!=i[6]
Perl 5 ,
19+ 1 (-p) =2016 bytes-4 bytes com as sugestões de Pavel
Experimente online!
fonte
(\*.*$| )
com( |.*)
/ /;$_=/\* /?$,:$'
é uma outra alternativa^
.V ,
131110 bytesExperimente online!
Explicação
Hexdump:
fonte
7x
vez de6x<<
?*
*
primeiro e depois fazerÎ7x
? (assumindo que um * não pode estar nos caracteres 0-5)*
nos 6 primeiros caracteres.Paradoc (v0.2.8 +), 8 bytes (CP-1252)
Pega uma lista de linhas e resulta em uma lista de linhas não comentadas.
Explicação:
Oi, eu escrevi uma linguagem de programação de golfe. :)
Ainda estou desenvolvendo isso e adicionei / aprimorei um monte de built-ins depois de tentar escrever isso para que haja maneiras mais razoáveis de diferenciar entre um espaço e um asterisco do que "
7#
", mas acho que isso tornaria isso não-competitivo. É uma sorte que ainda funcionou (isso usa apenas os recursos da v0.2.8, que comprometi há três dias).fonte
Oitava, 23 bytes
Experimente online!
fonte
@(s)cellfun(@(r)r(8:end),s(cellfun(@(r)r(7)~=42,s)),'uniformoutput',false)
, ondes
está uma matriz de células, não uma matriz de cadeias. Usando regexp ou algo provavelmente seria mais curto, mas o método que eu escrevi é comparável à metodologia nesta resposta apenas para idade MATLABGeléia ,
119 bytesExperimente online!
Entradas e saídas como uma lista de linhas.
-2 bytes graças a @EriktheOutgolfer e @JonathanAllan
Como funciona
fonte
7$€
pode ser€7
ṫ€7Ḣ⁼¥Ðf⁶
PowerShell , 32 bytes
Experimente online!
A entrada do pipeline é fornecida como uma matriz de cadeias,
-replace
funciona em todas as cadeias e-ne ''
(não é igual à cadeia vazia) aplicada a uma matriz, atua para filtrar as linhas em branco.fonte
C,
635955484746 bytesObrigado a " um usuário anônimo " por se livrar de mais um byte.
Agradeço a Felix Palmen por me lembrar de " Você pode assumir que o sétimo caractere é sempre um asterisco ou um espaço. ", Que eliminou mais um byte.
Use como:
Experimente online!
fonte
Na verdade , 13 bytes
A entrada e a saída são feitas como uma lista de strings.
Explicação:
Experimente online!
fonte
Gaia , 9 bytes
Uma função que aceita uma lista de cadeias e retorna uma lista de cadeias.
Experimente online!
Explicação
fonte
⁈
e«
são ambos 1 caractere. Os idiomas de golfe que usam caracteres não-ascii (talvez exceto Neim) usam codificações personalizadas, que permitem que todos esses não-ASCIIs sejam contados como bytes únicos. Aqui está a página de código de Gaia .Pitão , 9 bytes
Observe que isso só funciona se pelo menos 1 linha não for um comentário e pelo menos 1 linha for um comentário. Todas as outras soluções funcionam em todos os casos.
-2 bytes graças a @pizzakingme !
Experimente aqui!
Explicação
Pitão , 11 bytes
Experimente aqui!
Explicação
Pitão , 11 bytes
Experimente aqui!
Explicação
Pitão , 12 bytes
Experimente aqui!
Explicação
Pitão , 12 bytes
Experimente aqui!
Explicação
fonte
m>d7.m@b6
deve funcionar em 9 bytes, abusando que*
é quando o espaço em ordem lexicográficaGNU Sed, 19 + 2 = 21 caracteres
Requer
-E
argumento parased
habilitar expressões regulares estendidas.fonte
s/^.{6}( |.*)//g
Java 8, 40 bytes
Expressões regulares: quase, mas não exatamente, a ferramenta errada para o trabalho. Lambda de
String
paraString
(atribuir aFunction<String, String>
). A entrada deve ter uma nova linha à direita.Experimente Online
Agradecimentos
fonte
Haskell ,
2725 bytesA versão de Laikoni é mais curta que a minha:
Experimente online!
Minha versão:
Experimente online!
fonte
f n=[x|' ':x<-drop 6<$>n]
.C (gcc) ,
534846 bytesExperimente online!
-5 bytes: Foi muito complicado reduzir esse " programa inteiro " para o mesmo tamanho da função de gurka . Agora ele está escrevendo fora dos limites (em ambas as direções) de uma matriz do tipo errado e conta com pequenos endian e inteiros de 4 bytes para encontrar o asterisco ... mas, ei, funciona;)
-2 bytes: Bem, se já escrevemos em algum local "aleatório"
.bss
, por que se preocupar em declarar uma matriz ! Então aqui vem o programa de manipulação de strings que não usa ochar
tipo nem uma matriz.fonte
*x&2
fez lembrar de mim, então eu deveria ser capaz de fazer a barba alguns bytes off minha resposta :-) "Você pode assumir o sétimo personagem é sempre um asterisco ou um espaço."R,
4745 bytesfonte
pe=T
argumento. No entanto, não tenho certeza se a entrada como uma lista de seqüências de caracteres é permitida.Input or output may be a matrix or list.
SNOBOL4 (CSNOBOL4) ,
72706650 bytesExperimente online!
A correspondência de padrões no SNOBOL é bem diferente da regex, mas a idéia aqui ainda é a mesma: se uma linha corresponder a "seis caracteres e depois um asterisco", remova-a, caso contrário, remova os sete primeiros caracteres da linha e imprima o resultado.
Agora, agora, ele tira melhor proveito do operador de atribuição condicional do SNOBOL.
O padrão
POS(6) (' ' REM . OUTPUT | '*')
é interpretado como:Começando na posição 6, combine um espaço ou um asterisco e, se você corresponder a um espaço, atribua o restante da linha a
OUTPUT
.fonte
Vim, 14 bytes
Ctrl-V
G5ld:%g/\*/d
EnterCarregando o arquivo de entrada como o buffer a ser editado, digite os comandos acima. Saída é o novo buffer.
fonte
Ruby ,
39383629232220 + 1 = 21 bytesExperimente online!
Usos
-p
sinalizador.Explicação:
O
-p
sinalizador adiciona um bloco implícito ao redor do código; portanto, o código que realmente é executado fica assim:gets
lê uma linha de texto e armazena seu resultado em$_
.$_[/.../]=''
remove a primeira ocorrência do regex...
em$_
./.{6}( |.*\n)/
corresponde a 6 de qualquer caractere no início de uma linha, seguido por um espaço ou pelo restante da linha. Como o espaço aparece primeiro, ele tentará remover apenas os 6 primeiros caracteres e um espaço antes de tentar remover a linha inteira.$_
é impresso e esse processo é repetido para cada linha.fonte
Pyke , 9 bytes
Experimente aqui!
Legível:
Experimente aqui!
fonte
Retina ,
2315 bytes5 bytes economizados graças ao nmjcman101
1 byte economizado graças a Neil
Experimente online!
fonte
JavaScript (ES6), 48 bytes
Experimente online!
fonte
z
, o que não é permitido aqui. No entanto, você pode transformá-lo em uma função de seta anônima, a fim de torná-lo válido.(
e ao)
redor do fn, adicionadas para garantir.()
função ao redor, mas, caso contrário, ela ficará bem.> <>,
5753 bytesexperimente online
Explicação
Editar: 53 bytes
Basicamente, o mesmo material de antes, mas reestruturado ligeiramente
Como nota lateral: estou decepcionado que ninguém tenha feito isso ainda.fonte
C #,
160 145 9089 bytesAgradecimentos a Pavel & auhmaan por reduzir o tamanho.
fonte
t=>{...}
func<string, string>
.Python 3, 71 bytes (sem regexp)
Funciona!
fonte
05AB1E , 11 bytes
Experimente online!
fonte
.$
não existia naquela época. : PJavaScript,
4434 bytes44 riscado ainda é regular 44.
6 bytes salvos graças ao tsh
Experimente online!
fonte
s=>s.replace(/^.{6}( |\*.*\s)?/mg,'')
s.match(/(?<=^.{6} ).*/mg)
ESNext (Fora do padrão, estágio3) Chrome62 +?
depois\n
).C ++ (GCC),
121112 bytesObrigado a @gurka por salvar 9 bytes!
Recebe a entrada como uma lista de linhas.
Experimente online!
fonte
#import
? Além disso, acho que não há problema em omitir as inclusões padrão.#import
não é C ++ padrão, mas pelo menos o GCC e o MSVC o suportam. Omitir alguns inclui trabalhos com C, mas não com C ++. O código não funciona sem as inclusões, portanto, elas devem ser contadas no total pelo número de contas.import
respostas em python ouusing
em c #. Além disso, não#include <bits/stdc++.h>
seria mais curto para sua resposta?system.foo()
queusing system;foo()
Java 8,
955453 bytes-42 bytes graças a @ OliverGrégoire , usando a em
Stream<String>
vez deString
como entrada e saída.Explicação:
Experimente aqui.
fonte
String[]
ouList<String>
como entrada para -12 bytes.Stream<String>
se isso puder ajudar. Exemplo:s->s.map(x->x.charAt(6)!=42?x.substring(7):"")
s->s.filter(x->x.charAt(6)!=42).map(x->x.substring(7))
para 54 bytes.<42
vez de!=42
"Você pode assumir que o sétimo caractere é sempre um asterisco ou um espaço".