Escreva o código mais curto no idioma de sua escolha para executar a decodificação do comprimento da execução da string especificada.
A string será fornecida como entrada no stdin no formato
CNCNCNCNCNCNCNCN
onde cada um C
pode ter qualquer caractere ASCII imprimível e cada N
um é um dígito 1
para 9
(inclusive).
Entrada de amostra:
:144,1'1
Saída correspondente:
:4444,'
Linguagem de programação de Shakespeare , 406 bytes
Versão não destruída:
Estou usando o compilador Python SPL do drsam94 , que possui alguns bugs (é por isso que, por exemplo, eu uso em
Open your mind
vez daOpen thy mind
versão golfed).Para executar este programa, use:
Como funciona
SPL é uma linguagem de programação esotérica projetada para fazer com que os programas se pareçam com as peças de Shakespeare. Isso é feito usando caracteres como variáveis, e o processamento é realizado fazendo com que os caracteres digam coisas um ao outro.
Este é o título da peça; é ignorado pelo compilador.
Aqui estamos declarando as variáveis usadas no restante do programa. Tudo entre
,
e.
é ignorado pelo compilador. Nesse caso, declaramos que eraRomeo
usado para reter o caractere que está sendo decodificado eJuliet
usado para reter a duração da execução do caractere.Aqui declaramos o primeiro e único ato no programa. Atos e cenas são como rótulos; eles podem ser acessados a qualquer momento usando
let us return to scene II
ou alguma variante disso. Nós usamos apenas um ato, porque é suficiente para nossas necessidades. Novamente, qualquer coisa entre:
e.
é ignorada pelo compilador.Aqui declaramos a primeira cena. As cenas são numeradas em algarismos romanos: o primeiro é
Scene I
, o segundoScene II
e assim por diante.Esta é uma direção de palco; nele, dizemos aos
Romeo
eJuliet
variáveis para vir para o "palco". Somente duas variáveis podem estar no "palco" de uma só vez; o estágio é usado para que o compilador possa descobrir qual variável está endereçando e quando eles falam. Como temos apenas duas variáveis, Romeu e Julieta permanecerão no palco pelo período do programa.Outra declaração de cena. A cena II será saltada para decodificar outra duração.
Essa forma de declaração significa que Juliet começará a falar. Tudo até a próxima
Romeo:
direção do palco ou declaração de cena / ato será uma frase falada por Julieta e, assim, "eu" se referirá a Julieta, "você" / "tu" a Romeu, etc.Este comando armazena o valor ordinal do caractere único de STDIN em
Romeo
.No SPL, os substantivos são traduzidos para 1 ou -1, dependendo de serem positivos ou negativos. Nesse caso,
my mother
traduz para 1. Adjetivos (positivos ou negativos) multiplicam seu substantivo por 2.Esta é uma questão; nele, Julieta pergunta se
my mother
(AKA 1) é "mais alegre" que Romeu. Os comparativos são traduzidos paraless than
(se forem negativos, comoworse
) ougreater than
(se forem positivos, comojollier
). Portanto, esta questão se resume aIs 1 greater than you?
.A razão pela qual fazemos esta pergunta é detectar o final da entrada. Como o valor de
EOF
varia de acordo com a plataforma, mas geralmente é menor que 1, usamos isso para detectá-lo.Se a pergunta anterior foi avaliada
true
, pulamos para a cena IV - que é simplesmente o fim do programa. Em resumo, se detectarmos um EOF, encerraremos o programa.Agora é a linha de Romeu: "eu" e "você" se referem a Romeu e Julieta, respectivamente.
Novamente, essa instrução coloca o valor ordinal de um único caractere de STDIN em Juliet, que nesse caso é o comprimento de execução do caractere armazenado
Romeo
.Este é muito longo para analisar em detalhes, mas confie em mim no que se refere
Juliet -= 48
. Fazemos isso porque Juliet mantém o valor ASCII de um numeral eord('0') == 48
; ao subtrair 48, convertemos do valor ASCII de um número para o próprio número.Outra declaração de cena. Este é para o loop no qual repetidamente imprimimos o valor de caractere
Romeo
,Juliet
times.Essa afirmação faz com que Romeu imprima seu valor como personagem; isto é, qualquer valor de caractere que foi armazenado anteriormente no Romeo agora é exibido.
Um porco é um substantivo negativo, então se
a hog
traduz em -1; portanto, esta declaração é avaliada comoJuliet -= 1
.Romeu pergunta aqui se Julieta é "tão podre quanto" ou igual a 0.
Se o valor de Juliet for 0, retornamos à cena II para decodificar a duração de outra personagem.
Senão, voltamos à cena III para exibir novamente o personagem de Romeu.
Esta declaração final da cena é apenas um marcador para o final do programa. A
[Exeunt]
direção do palco é necessária para que o compilador gere a cena final.fonte
GolfScript, 10 caracteres
fonte
perl, 27 caracteres
fonte
print<>=~s/(.)(.)/$1x$2/ger
. Também tenho certeza de que você quis dizer$1x$2
, e não o contrário./r
está documentado no perlop e foi adicionado na v5.14.0-p
bandeira, você pode soltarprint
e<>
, portanto, a resposta se tornará simplesmente:s/(.)(.)/$1x$2/ge
-> 17chars +1 para-p
-> 18 .R 67
fonte
rep
coagir otimes
argumento de caracteres para números inteiros automaticamente. Brilhante.Python 3, 52
O Python 3 permite mesclar as abordagens das minhas duas soluções python2.
fonte
raw_input
corresponde ao Python 3input
. Portanto, a primeira linha deve:s=input()
s=input() while s:a,b,*s=s;print(a*int(b),end='')
APL (22)
Explicação:
T←⍞
: armazena entrada emT
T⊂⍨~⎕D∊⍨T
: dividaT
nos caracteres que não são dígitos↑
: Transformá-lo em um2
-by-N/2
matriz{⍺/⍨⍎⍵}/
: em cada linha da matriz (/
), replique (/
) o primeiro caractere (⍺
) pelo eval (⍎
) do segundo caractere (⍵
),/
: concatenar a saída de cada linhafonte
Ruby, 30 bytes
Código de 27 bytes + 3 bytes para executá-lo com o
-p
sinalizador:fonte
Montagem 8086,
10698 caracteresSe os números estivessem antes dos caracteres no fluxo de entrada, duas linhas (18 caracteres) poderiam ser raspadas.
fonte
dq 21cdc38821cd08b4 d888ed30c188482c e8ebfce210cd14b4
a 53 caracteres? Eu não vejo onde ele lida com caracteres não maiúsculos ou eof ...SED GNU, 122 + 2 (-r)
Precisa ser executado com o
-r
sinalizadorPode ser reduzido para 110 + 2, substituindo
\v
pelo não imprimível0x0B
e\a
pelo0x07
fonte
\2.{9}
é uma ótima ideia) esplêndido!C, 65 caracteres
Obtém a entrada como um parâmetro.
fonte
error: first parameter of 'main' (argument count) must be of type 'int'
. Existe uma opção de linha de comando?Perl,
1918 caracteresAs regras para contar opções na linha de comando estão aqui .
fonte
Quarto, 45 caracteres
Testado com pforth no OS X.
fonte
Python,
6362 caracteresfonte
iter
lá ... acho que vou usá-lo sozinho!Windows PowerShell, 55 caracteres
Tenho a sensação de que isso pode ser melhorado, especificamente com os elencos de char para string e int, mas não tenho tempo para continuar trabalhando nisso agora.
fonte
C, 68 caracteres
A resposta de @ ugoren em C é um pouco mais curta, mas esta resposta está em conformidade com o requisito de que "a string será fornecida como entrada no stdin ".
fonte
main(c,n){ ... }
que serão passados 1 por padrão quando o programa for executado.int
argumento, mas os compiladores que utilizo reclamam,error: second parameter of 'main' (argument array) must be of type 'char **'
então não consigo me safarmain(c,n)
; Eu devo usarmain(int c,char **n)
. Pode ser uma coisa de plataforma ou gcc.n;main(c)
mas não omain(n,c)
suficiente! :)Haskell,
5856 caracteresMinha primeira tentativa real de jogar golfe, provavelmente há alguma melhoria a ser feita aqui.
fonte
read[y]
salva dois caracteresreplicate x y
por[1..x]>>[y]
. Assim, sua segunda linha pode ser substituída porf(x:y:s)=(['1'..y]>>[x])++f s
, o que a reduz a 53 bytes.Japonês
-P
, 8 bytesEntrada como uma matriz de caracteres, saída como uma string.
Tente
fonte
ò crÏ°îX
se você o achar assustador demais!Malbolge Unshackled (variante de rotação de 20 trit), 4,494e6 bytes
O tamanho desta resposta excede o tamanho máximo do programa postável (eh); portanto, o código está localizado no meu repositório GitHub .
Como executar isso?
Isso pode ser uma parte complicada, porque o intérprete ingênuo de Haskell levará anos e anos para executá-lo. O TIO possui um intérprete decente do Malbogle Unshackled, mas, infelizmente, não poderei usá-lo (limitações).
O melhor que eu pude encontrar é a variante fixa de largura de rotação de 20 trit, que funciona muito bem, descompactando 360 bytes por hora .
Para tornar o intérprete um pouco mais rápido, removi todas as verificações do intérprete Malbolge Unshackled de Matthias Lutter.
Minha versão modificada pode executar cerca de 6,3% mais rápido.
Está funcionando!
fonte
05AB1E ,
65 bytes-1 byte graças a @Grimy .
Saída como uma lista de caracteres.
Experimente online.
Resposta antiga de 6 bytes sem decodificação em execução:
Experimente online.
Explicação:
fonte
2ι`ÅΓ
é de 5 bytes. Seria triste se o RLE interno não vencesse um desafio do RLE.Python,
787266 caracteresfonte
GolfScript (10 caracteres)
fonte
J - 24
O objetivo desta submissão é usar o infix advérbio.
fonte
Befunge, 49 caracteres
fonte
K, 35
fonte
,/{(. y)#x}.'0N 2#
por 18 bytes .Python 2, 58
Isso é inspirado na solução python de Darren Stone - abuso de iterador!
Esta é a minha solução original (60 caracteres)
Uma abordagem diferente é de três caracteres a mais:
fonte
Java: 285 charas
fonte
Befunge-98, 22 caracteres
fonte
Espaço em branco, 135
(Substitua S, T, L por caracteres de espaço, tabulação e avanço de linha.)
Experimente online [aqui] .
Explicação:
fonte
Clojure (107)
Isso parece excepcionalmente longo por ser Clojure; se alguém puder fazer melhor, publique-o.
fonte