Enquanto escrevia meu ensaio para Shakespeare, percebi que precisava encurtar minhas referências de citações para comprimentos mais gerenciáveis. Eu já escrevia isso anteriormente:
(Act 1, Scene 2, Lines 345-346)
Mas agora me disseram para escrevê-las assim:
(I.ii.345-6)
Claramente, eu preciso de um código de golfe para jogar um pouco as minhas citações de Shakespeare.
A tarefa
Escreva um programa ou função que, dada uma entrada de sequência seguindo os Modelos 1 ou 2, imprima ou retorne uma sequência seguindo os Modelos 3 ou 4, respectivamente. Você só precisa suportar os Atos 1 a 5 e as Cenas 1 a 9.
Modelos
Modelo 1
(Act x, Scene y, Lines a-b)
Você pode assumir que x
nunca excede 5, y
nunca excede 9 a
e b
sempre são números inteiros positivos que não excedem o valor inteiro positivo positivo máximo do seu idioma e a
é sempre exclusivamente menor que b
.
Modelo 2
(Act x, Scene y, Line a)
Mesmas condições do modelo 1, excluindo informações sobre b
.
Modelo 3
(x.y.a-b)
Onde x
é um numeral romano maiúsculo, y
é um numeral romano em minúsculas a
e b
são números, e b
é reduzido para apenas os dígitos inferiores ao primeiro dígito diferente de igual significado a
.
Modelo 4
(x.y.a)
Mesmas condições do modelo 3, excluindo informações sobre b
.
Casos de teste
Let f(s)
Ser a função definida na tarefa. ""
indica um valor de sequência.
>>> f("(Act 1, Scene 2, Lines 345-346)")
"(I.ii.345-6)"
>>> f("(Act 3, Scene 4, Lines 34-349)")
"(III.iv.34-349)"
>>> f("(Act 5, Scene 9, Lines 123-234)")
"(V.ix.123-234)"
>>> f("(Act 3, Scene 4, Line 72)")
"(III.iv.72)"
>>> f("(Act 2, Scene 3, Lines 123-133)")
"(II.iii.123-33)"
>>> f("(Act 4, Scene 8, Lines 124-133)")
"(IV.viii.124-33)"
Para os fins deste desafio, as seguintes traduções de números arábicos para romanos devem ser suportadas:
1 i I
2 ii II
3 iii III
4 iv IV
5 v V
6 vi (you do not have to support past 5)
7 vii
8 viii
9 ix
(Act 1, Scene 2, Lines 345-3499)
Respostas:
A linguagem de programação de Shakespeare (não concorrente)
Gostei muito dessa pergunta e, como havia algum interesse em uma resposta no idioma Shakespeare, aqui está uma.
(Tem mais de 6000 bytes de comprimento.) Existem alguns truques, mas não tentei jogar muito, porque: (1) já contribuí com minha parte do golfe em outra resposta e (2) alterei todos os caracteres para "Página "e" Puck ", ou todas as frases de" grande, grande e grande gato ", parecem estragar a diversão. Em vez da parte que lida com números romanos, usei caracteres romanos etc. Reutilizei caracteres e instruções para economizar digitação. :-)
O programa deve ser mais direto, mas uma das rugas que vale a pena mencionar é que, quando escrevi isso, assumi que a leitura de um número inteiro funcionaria da seguinte forma
scanf
: (1) consumir apenas quantos caracteres da entrada corresponderem a um número inteiro e (2) no caso de falha, deixe a variável inalterada. (Usei essa segunda propriedade para distinguir entre os modelos 1 e 2 no Ato II, lendo "Linha" e tentando ler um número inteiro.) Infelizmente, acontece que há (o que considero) um erro na implementação original do o idioma em que a leitura de um número inteiro consome tudo até o final da linha e gera um erro se falhar; portanto, é necessário um patchlibspl.c
para tornar oint_input
comportamento mais parecidoscanf
.E com isso, funciona:
Pseudocódigo de nível um pouco mais alto do qual trabalhei, para ajudar alguém que tenta entender:
Relacionar o código acima com o código final é deixado como um exercício. :-) Observe que o ShakespearePL tem aritmética, stacks e gotos, mas não possui ponteiros (apenas rótulos), portanto, implementar "sub-rotinas" como a conversão para romano é um pouco ... interessante.
fonte
LaTeX,
513364259226215178159 BytesBons ensaios devem sempre ser escritos em LaTeX.
Isso usa o pacote xstring, pois não há exatamente um monte de manipulação de strings embutida. No lado positivo, o limite superior para a
\Roman
formatação embutida é maior do que o necessário em qualquer momento (mesmo para os sonetos)2^31-1
. Eu incluí\documentclass{ecv}
na contagem, mas nenhum código de teste:(Se você era louco o suficiente para realmente usar isso, teria que remover o nome dos macros pelo menos. Substituir macros de um caractere é uma prática ruim)
Ungolfed e comentou:
Observe que nesta versão os comentários são necessários, caso contrário, a nova linha é interpretada como espaço em branco e se expande para um espaço.
fonte
~
como nome da macro em vez de\s
. Mas na verdade você não precisa\s
(\stripcomma
na versão ungolfed): você pode simplesmente\def\t#1 #2, #3 #4, #5 #6
e o TeX cuidará de tirar as vírgulas. (Então, você poderia usar o~
truque em\t
vez, economizando 1 byte.)~
é um pouco desagradável, mas eu gosto daqui. Isso significava que eu tinha que mudar o documentclass (para um dos outros 3 letras.cls
arquivos que eu tinha instalado)\@roman
e\@Roman
não precisa de aparelho em torno do argumento.xstring
idéias principais foram suas :-) Foi divertido jogar golfe juntos!JavaScript (ES6),
210183178177171 bytesEconomizou 27 bytes desenrolando os parâmetros de descanso (graças a ETHproductions )
Economizou 5 bytes não correspondendo ao parêntese de abertura e ajustando a geração do número romano
Economizou 1 byte ajustando a expressão ternária final
Economizou 6 bytes combinando dois grupos correspondentes
Casos de teste:
fonte
Act
e cada um\D*
com.*
?Geléia ,
87 8685 bytesExperimente online! ou veja uma suíte de testes
Quão?
fonte
œr
,Ṗ,Ç
,Ṗ€V
,ṪÇ$
,W
como o último elo em um link ajudante, possivelmente outros também, Nice esforço! Esta não é a sua submissão usual de 80 e poucos anos Jelly, isso merece reconhecimento especial entre as pessoas Jelly.R ,
94126112166 bytesE agora está mais elaborado do que antes :(, voltando a tentar jogar mais. Regex por reduzir a referência da página
roubadadescaradamente emprestada de @FryAmTheEggman.Agora eu realmente preciso fazer algum trabalho para recuperar os bytes, mas funciona para o segundo caso agora.
Experimente online! - Observe que
el
não funciona no TIO e foi substituído porunlist
fonte
Retina ,
8988 bytesExperimente online!
Economizou 3 bytes graças a Neil.
Retira os caracteres desnecessários antes de substituir os dois primeiros números por blocos de
i
caracteres. Em seguida, combina pedaços dessesi
s para formar os algarismos romanos apropriados. Então capitalizamos o primeiro numeral romano. Finalmente, combinamos o maior número possível de números antes e depois do hífen, de modo que o número de dígitos no número seja o mesmo. Em seguida, removemos esse prefixo do segundo número.fonte
iiiii
porv
,iiii
poriv
eviv
porix
parece economizar alguns bytes.345-356
- eu estava esperando345-56
.\b
no final da última substituição para evitar repetir)
a substituição?\d
mas parece funcionar, já que não há outro limite de palavras. Obrigado!PHP> = 7.1, 195 bytes
Casos de teste
Expandido
fonte
preg_match_all("#\d+#",$argn,$m);[$a,$s,$b,$e]=$m[0];
salva dois bytes.if($e){for(;$b[$i]==$e[$i];$i++);echo"-",substr($e,$i);}echo")";
deve salvar 46.(you do not have to support past 5)
salva 15 bytes.".$r[$s].$b"
salva outros 5 bytes; e[[$a,$s,$b,$e]]=$m;
outro. Infelizmente, as atribuições de array ainda não funcionam por referência.if($e&&$e-$b){for($x=str_pad($b,strlen($e),0,0);$x[$i]==$e[$i];$i++);echo"-",substr($e,$i);}
economiza 10 bytes e pode funcionar.&&$e-$b
é desnecessário para os casos de teste; então ele salva 17 bytes, não 10. Btw. você ainda não precisa de romanos 6 a 9.;)for(;str_pad($b,strlen($e),0,0)[$i]==$e[$i];)$i++;
porfor(;$e&&~$c=$e[-++$k];)$c>$b[-$k]&&$i=-$k;
.Perl 5, 185 + 1 = 186 bytes
Penalidade de 1 byte para a
-n
bandeira necessária .Pode falhar em alguns casos de teste em que a cena tem mais de 10 ^ 11 linhas, mas as cenas do AFAIK no Shakespeare são muito longas;)
De forma legível:
fonte
Ruby , 204 + 1 = 205 bytes
Usa a
-p
bandeira.Experimente online!
fonte
Python 2.7 298 bytes
fonte
Perl, 99 bytes
Corra com
perl -pe
. 98 bytes (origem) + 1 byte (p
sinalizador) = 99.fonte
Python 2 ,
301259252221 bytesA -31 bytes gritante graças a Chas Brown.
Então, isso é ... extremamente longo ... Acho que posso jogar golfe, mas estou rachando meu cérebro há um tempo.
Experimente online!
Demolir
fonte
b,c,d,e,f=s.groups()
em vez dea,b,c,d,e,f=[s.group(n) for n in range(6)]
[0]+'i,ii,iii,iv,v,vi,vii,viii,ix'.split(',')
vez de[s,'i','ii','iii','iv','v','vi','vii','viii','ix']
.[0]+'i ii iii iv v vi vii viii ix'.split()
vez de[s,'i','ii','iii','iv','v','vi','vii','viii','ix']
.0
interior das aspas. Uma última menor puxão eu posso ver: você está usando:s,r=XXX,YYY;b,c,d,e,f=s.groups();
você pode economizar mais 4 bytes por vez equivalentemente dizendo:b,c,d,e,f=XXX.groups();r=YYY;
. Então você acaba com 81 bytes a menos do que o meu envio! :)q / kdb +,
200187 bytesSolução:
Exemplos:
Explicação: (ligeiramente não-destruído)
Notas:
Tecnicamente, pode ser 2 bytes mais curto (sem necessidade de
f:
), mas facilita a exibição de exemplos dessa maneira.Editar% s:
string
por$:
,count
com#:
,til
com(!)
efirst
com(*:)
, lança os índices de R em seqüências de caracteres, para que não tenhamos que converter ato / cena em intsfonte