Retirado diretamente do ACM Winter Programming Contest 2013. Você é uma pessoa que gosta de interpretar as coisas literalmente. Portanto, para você, o fim do mundo é ed; as últimas letras de "O" e "Mundo" concatenaram.
Faça um programa que use uma frase e imprima a última letra de cada palavra nessa frase no menor espaço possível (menos bytes). As palavras são separadas por qualquer coisa, exceto letras do alfabeto (65 - 90, 97 - 122 na tabela ASCII.) Isso significa sublinhados, til, sepulturas, chaves, etc. são separadores. Pode haver mais de um separador entre cada palavra.
asdf jkl;__zxcv~< vbnm,.qwer| |uiop
-> flvmrp
pigs, eat dogs; eat Bob: eat pigs
-> ststbts
looc si siht ,gnitirw esreveR
-> citwR
99_bottles_of_beer_on_the_wall
->sfrnel
Respostas:
Perl 5, 18 bytes
Requer uma
-p
opção de linha de comando. A propriedade nomeadaL
corresponde apenas aos caracteres da letraA-Za-z
. Existem várias centenas dessas propriedades nomeadas, mas ao lidar com texto ASCII, muito poucas são interessantes. Além disso\pL
, a única outra nota real é a\pP
que corresponde à pontuação.Experimente online!
Perl 5, 17 bytes
Uma melhoria de um byte por Dom Hastings
Requer
-n
(e-l
para suportar várias entradas).Experimente online!
Uso da amostra
fonte
\w
também combina dígitos e sublinhados.|.
não era óbvia (para mim, pelo menos).-1
inprint/\pL*(\pL)/g
, parece produzir o mesmo para seus casos de teste!ed, 35 caracteres
Então, o mundo termina em ed. Como gosto de ser literal demais, decidi escrever para escrever a solução com ed - e, aparentemente, é realmente uma linguagem de programação . É surpreendentemente curto, mesmo considerando que muitas soluções mais curtas já existem neste segmento. Seria melhor se eu pudesse usar algo diferente
[a-zA-Z]
, mas considerando que ed não é uma linguagem de programação, é realmente bom o suficiente.Primeiro, eu gostaria de dizer que isso apenas analisa a última linha do arquivo. Seria possível analisar mais, basta digitar
,
no início das duas primeiras linhas (isso especificou o intervalo "tudo", em oposição ao intervalo padrão da última linha), mas isso aumentaria o tamanho do código para 37 caracteres.Agora, para explicações. A primeira linha faz exatamente o que a solução Perl faz (exceto sem suporte para caracteres Unicode). Não copiei a solução Perl, apenas inventei algo semelhante por coincidência.
A segunda linha imprime a última linha, para que você possa ver a saída. As forças da terceira linha são encerradas - eu tenho que fazer isso, caso contrário,
ed
seria impresso?
para lembrá-lo de que você não salvou o arquivo.Agora, como executá-lo. Bem, é muito simples. Basta executar
ed
com o arquivo que contém o caso de teste, enquanto canaliza meu programa, assim.-s
é silencioso. Isso impede aed
saída de um tamanho de arquivo feio no início. Afinal, eu o uso como um script, não como editor, portanto não preciso de metadados. Se eu não fizesse isso, ed mostraria o tamanho do arquivo que não poderia impedir de outra forma.fonte
Javascript, 49
Ele usa uma expressão regular para remover todos os caracteres anteriores a uma letra, bem como todos os caracteres que não são da letra. Então ficamos com a última letra de cada palavra.
Obrigado a tomsmeding por uma boa melhoria.
fonte
alert(prompt().replace(/.(?=[a-z])|[^a-z]/gi,''))
C, 78
Golfe:
Com espaço em branco:
Saída:
fonte
c
:main(c,s)char**s;{for
GNU Sed,
403837Teste
Executar sed:
Saída:
Explicação
A primeira substituição substitui todos os limites de palavras precedidos pelo grupo de correspondência desejado por uma nova linha. Isso facilita a remoção de todos os caracteres estranhos na segunda substituição.
Editar
fonte
sed
'ss
comando temi
bandeira para casos de correspondência insensível:s/[a-z]\b/&\n/gi
.\b
considera_
s para ser letras, por isso, se qualquer palavra no teste END com_
, última carta que sua palavra não está incluído na saídaGrep and Paste,
363428Se for necessária uma nova linha final, substitua
tr -d \\n
porpaste -sd ''
.Editar
tr
vez depaste
(-4), obrigado manatwork .fonte
paste -sd ''
, mastr -d \\n
é mais curto. No que diz respeitogrep
, tem-i
interruptor significado “ignorar caso”, o que pode torná-lo mais curto:grep -io '[a-z]\b'
.tr
também exclua a nova linha final. O modo que não diferencia maiúsculas de minúsculas é obviamente mais curto, obrigado.sed, 37 caracteres
Comprimento igual à resposta de Thor , mas, eu acho, mais simples.
A lógica é bastante trivial - substitua as seqüências de letras pela última letra e exclua todas as não letras.
fonte
Mathematica, 39
Teste:
fonte
LetterQ
deve ser chamadoLettersQ
:) Eu não pensei nisso para testar seqüências de caracteres inteiras.K, 49
.
fonte
Scala, 59 (ou 43)
Supondo que a string já esteja em
s
:Se você precisa ler a partir de um prompt e imprimir ao invés de usar a saída REPL, convertido
s
parareadLine
e embrulhe emprintln()
para 59.fonte
x86: 54 bytes
Assuma uma rotina de cdecl com a assinatura
void world_end(char *input, char *output)
:fonte
Xi, 32
O Xi é um idioma ainda em fase beta, mas parece funcionar bem com o código golf, então imaginei que também poderia mostrar outra solução curta e funcional (e anunciar um pouco o idioma :-)).
fonte
Mathematica
625752Teste
fonte
Python3, 59 caracteres
Lida corretamente com letras maiúsculas e sublinhados. O 2 é para passar
re.sub
are.IGNORECASE
bandeira sem ter que usarre.I
.fonte
Python, 76 caracteres
import re;print "".join(re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",raw_input()))
fonte
print
.import re;print(*re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",input()),sep='')
Python 3.x, 64 bytes
fonte
for
.Lua, 42
Exemplo de uso:
lua script.lua "asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
fonte
Mathematica
71474561De volta à prancheta, depois que o @belisarius encontrou um erro no código.
Teste
fonte
\\w
corresponde_
, portanto, não funciona (por exemplo)"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
Row@StringTake[ StringCases[#, LetterCharacter ..], -1] &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
me dáflvmrp
, mas#~StringCases~RegularExpression@"\\w\\b" <> "" &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
retornafvmrp
aqui. Estamos obtendo os mesmos resultados?Python 2,
88 80 75 6968Entrada:
435_ASDC__uio;|d re;fG o55677jkl..f
Saída:
CodeGolf
Esta solução pode ser reduzida para 67 caracteres se você permitir que a saída inclua caracteres de backspace (código ASCII 8) no início. A saída será visualmente idêntica.
Mesma entrada, (visualmente) mesma saída.
<BS>
deve ser o caractere de backspace.fonte
C #
Método, 105 bytes: (assume utilizações para System, System.Text.RegularExpressions e System.Linq)
Programa, 211 bytes:
fonte
VBA, 147
161fonte
Caracteres Ruby 2.0, 25 (+1)
Deve ser executado com o
-p
comutador:fonte
ruby
versão. 1.9.2 gera "# <Enumerador: 0x9f65e10> # <Enumerador: 0x9f65d98> # <Enumerador: 0x9f65d34> # <Enumerador: 0x9f65cd0>".ruby 2.0.0p0 (2013-02-24 revision 39474
). Ao executar o programa com a versão 1.8.7, ele gera um valor ASCII! Não sabia que havia tantas diferenças entre as versões.gsub(/(\w+)\W*/){$1[-1]}
.Retina , 16 bytes
Experimente online!
Explicação
fonte
Retina , 20 bytes
Experimente online
Este programa é compatível com a versão 0.8.2
fonte
Java 8, 43 bytes
Porto da resposta Retina de @ mbomb007 .
Explicação:
Experimente online.
Explicação adicional para a regex:
fonte
(?i)
para a bandeira.Smalltalk , Squeak / Pharo sabor
122 char com formatação tradicional para este método adicionado à String:
62 caracteres no Pharo 1.4, com regex e formatação estranha
fonte
J: 60 caracteres (ou 38 caracteres para uma versão menos correta)
Se quisermos que o programa seja interrompido sempre que houver palavras que terminem em dois-pontos ou sublinhado, podemos simplificá-lo para 38 caracteres.
Exemplo de execução:
fonte
(#~[:2&|64 90 96 122&I.@(u:inv)){:&>;:
ou 43 bytes para uma versão não-explícita:(#~[:2&|64 90 96 122&I.@(u:inv))@:({:@>)@;:
. Isso usa o verbo do índice de intervaloI.
, que interpreta64 90 96 122
como o conjunto de intervalos(__, 64] (64, 90], (90, 96], (96, 122], (122, _)
e retorna o índice do iterval ao qual seu argumento, o código ascii do caractere, pertence. Se esse índice é ímpar, não é alfabético.;:
interpretaabc_
como uma palavra, pois os nomes das variáveis podem conter sublinhados. +10 bytes para adicionar(#~~:&'_')
, provavelmente uma correção ineficiente'_'-.~
ou algo parecido.Está em PHP . 197 bytes :( eu sou iniciante
EDITADO Agora são 171 bytes
fonte
foreach((' ',preg_replace('/(\W|_)+/',' ',$_GET['line'])) as $d){$a=substr($d,-1,1);$o=ORD();if(($o>=97 && $o<=122) || ($o>=65 && $o<=90)){echo $a;}}
é 149, se funcionar.\W|_
exclui dígitos; então você deve adicionar\d
ao seu regex ou usar #/[^a-z]+/i
K 30
fonte
Japt v2, 16 bytes
Tente
fonte
f"%l(?!%l)" q
(não funciona na v2 porque o analisador não gosta do(?
)