Na peça absurda Rosencrantz e Guildenstern estão mortos , os dois personagens principais Rosencrantz e Guildenstern (ou estão?) Estão sempre misturando qual deles é quem - ou, às vezes, qual parte do corpo é quem - por causa de uma falta percebida de identidade individual. Não seria absurdo se eles trocassem seus nomes?
Sua tarefa é escrever uma função que tenha uma sequência de tamanho uniforme (e por design, um múltiplo de 4) com mais de 7 caracteres, divida-a e embaralhe-a.
A divisão deve ser a seguinte : a sequência terá o formato "abscd"
, com s atuando como um caractere separador. A primeira seção e o separador abs
serão a primeira metade da corda, enquanto a segunda metade serácd
O comprimento de a
será(string length / 4) - 1
O comprimento de b
será(string length / 4)
O comprimento de s
será1
O comprimento de c
será(string length / 4) + 1
O comprimento de d
será(string length / 4) - 1
Isso pode ser realmente confuso, então deixe-me mostrar alguns exemplos
("a" + "bb" + "s" + "ccc" + "d").length //8
1 2 1 3 1
|-------4--------| |----4-----| <--- (4 is half of 8)
("rosen" + "crantz" + "&" + "guilden" + "stern").length //24
5 6 1 7 5
("foo" + "barr" + "?" + "barry" + "foo").length
3 4 1 5 3
Finalmente:
Em seguida, você embaralha as peças, produzindo adscb
ex. "rosencrantz&guildenstern" --> "rosenstern&guildencrantz"
"foobarr?barryfoo" --> "foofoo?barrybarr"
Rulez:
- As brechas padrão são proibidas
- Respostas aceitáveis: uma função que recebe a entrada através de uma sequência de entrada e retorna uma sequência de saída
- Se a string de entrada não corresponder aos requisitos fornecidos acima, seu código DEVE errar (não importa que tipo
Exception
ouError
) - Esta é
code-golf
, portanto, o mais curto de resposta (válido) (em cada língua) ganha! - Pontos de bônus para uma fila :-) (Na verdade não, mas apenas pontos interessantes)
Respostas:
K (oK) ,
353433 bytesExperimente online!
Sem validação de entrada (para a recompensa de ngn),
252423 bytesExperimente online!
Aprendi rapidamente um pouco de K e, olhando a lista de verbos, pensei que uma abordagem alternativa ( sem usar cut) poderia funcionar aqui. E funcionou perfeitamente.
Como funciona
fonte
Perl 6 ,
6058 bytes-2 bytes graças a Jo King
Experimente online!
Lança "O comprimento da sublist da rotorização está fora do intervalo" em caso de erro.
Explicação
fonte
J ,
3635 bytesExperimente online!
-1 byte por
{.
+ comprimentos negativos e;.2
que corta aqueles como marcadores "finais".Resposta original, 36 bytes
Experimente online!
ngn mencionou "cut" em um comentário para uma resposta anterior do K , e me fez tentar J, que tem o mesmo "cut" (não tenho idéia de como o K funciona).
Como funciona
Observe que esta função lida automaticamente com entradas inválidas:
{.
lançadomain error
porque seu argumento de comprimento deve ser um número inteiro.5 A.
lançaindex error
.length error
lançados.fonte
Python 3 ,
10310210197888684 bytesExperimente online!
Não é realmente uma linha, mas
;
é menos um byte por linha do que quebra de linha e recuo.Lança
ZeroDivisionError
se o comprimento da sequência de entrada for menor que 8 ou não for um múltiplo inteiro de 4.Também funciona em Python 2.
-4 bytes graças a Jo King
-9 bytes graças a ovs
-2 bytes graças a Jonathan Frech
-2 bytes graças ao Bubbler
fonte
//=
o par mais externo se tornando redundante. Muitíssimo obrigado!-l+1
<->1-l
?Perl 6 , 78 bytes
Experimente online!
Bloco de código anônimo que pega uma string e retorna a string modificada, se válida, caso contrário, retorna uma divisão por erro zero. Eu sei que posso modificar uma matriz diretamente, para poder trocar as duas seções da string, mas não consigo entender direito.
fonte
K (ngn / k) ,
1201131039995 bytesEsperançosamente, você pode jogar mais, incluindo uma função extra para testar se o comprimento da string é divisível por quatro, gera um erro com referência a variável não declarada se a entrada for inválida
EDIT: condição perdida no comprimento maior que 7, incluída
EDIT: Combinado em uma função, removeu declarações de variáveis redundantes
Experimente online!
fonte
indices_string
)? ping-me no pomar, se eu deveria explicá-loRetina 0.8.2 , 58 ou 73 ou 83 ou 93 bytes
Experimente online! Explicação:
Captura
a
em$1
, e torná-lo o mais curto possível*?
.$#2
,$#3
E$#4
acabam-se como o comprimento dea
.Capturar
b
em$4
. As(?<-2>.)+
capturas até o comprimento dea
, enquanto o outro.
adiciona 1 ao comprimento, conforme necessário.Capturar
s
ec
no$6
. Seu comprimento combinado é três a mais que o comprimento dea
.Capturar
d
em$7
. Seu comprimento não é maior que o comprimento dea
.Fizemos o
a
mais curto possível, mas ainda queremos chegar ao final da entrada.Troca
b
ed
.O estágio acima não valida sua entrada. Como o Retina não possui erros de tempo de execução, existem várias opções para validação de entrada:
Não produz nada se o comprimento for menor que 8 ou não for múltiplo de 4. (+15 bytes)
Saída
Error
se o comprimento for menor que 8 ou não for múltiplo de 4. (+25 bytes)Trava se o comprimento for menor que 8 ou não for múltiplo de 4. (+35 bytes)
fonte
C (gcc) com
-Dx=memcpy
e-DL=(l-1)
,154158160 bytesRetorna NULL se o comprimento da string de entrada não for divisível por 4 ou menor que 8 caracteres.
Obrigado a Rogem e Jonathan Frech pelas sugestões.
EDIT: O pré-processador movido define para a linha de comando e fez com que a sequência seja alocada dinamicamente para estar em conformidade com o quebra-cabeça.
Experimente online!
fonte
t[80]
? Não parece haver um limite superior em relação ao comprimento da entrada.malloc()
lugar.NULL
para saída inválida, usa valores de retorno dememcpy()
, uma macro semelhante a uma função para ignorar os tipos e matrizes de tamanho variável C99 para ignorarmalloc()
.//
ou o-w
?-w
é apenas uma conveniência para suprimir avisos (portanto, é mais fácil encontrar erros). Normalmente, adiciono argumentos de linha de comando após a//
para que o TIO conte seus bytes para mim e deduzo 1 do total para contabilizar o caractere extra necessário para fazer isso.Gelatina , 28 bytes
(Se um programa completo é permitido, podemos remover o final
F
).Se o comprimento for menor que 8 ou não divisível por quatro, a
ValueError
é aumentada durante a divisão inteira deinf
(um flutuador) por4
- a divisão produzNaN
(também um flutuador) que então não pode ser lançado para umint
.Experimente online!
Como?
fonte
Gelatina , 25 bytes
Experimente online!
O
Ẏ
pode ser removido para transformar isso em um programa completo.fonte
Ruby , 64 bytes
Experimente online!
fonte
JavaScript (ES6),
9789 bytesGuardado 8 bytes graças a @ l4m2
Experimente online!
fonte
JavaScript (Node.js) , 80 bytes
Experimente online!
JavaScript (Node.js) , 84 bytes
Experimente online!
JavaScript (Node.js) , 87 bytes
Experimente online!
Mais curto que o RegExp
fonte
Java 8, 135 bytes
Lança
ArithmeticException
(divide por zero) se a sequência de entrada não corresponder aos requisitos. Experimente online aqui .Ungolfed:
fonte
l/=l>7&l%4<1?4:0;
vez del=l>7&l%4<1?l/4:l/0;
C (gcc) , 129 bytes
Retorna por modificação. Ajuntar com:
Arquivo fonte:
Experimente online!
Degolf
fonte