Considere estas cinco criaturas marinhas de arte ASCII:
- Peixe normal:
><>
ou<><
- Peixe rápido:
>><>
ou<><<
- Peixe resistente:
><>>
ou<<><
- Peixe elástico:
><<<>
ou<>>><
- Caranguejo:
,<..>,
Escreva um programa que aceite uma sequência arbitrária de caracteres <>,.
. Se houver uma maneira de interpretar a sequência inteira como uma série de criaturas marinhas não sobrepostas, a sequência deverá ser reimpressa com espaços únicos inseridos entre as criaturas. Se essa interpretação for impossível, nada deve ser produzido (o programa termina silenciosamente).
Por exemplo, a cadeia <><><>
pode ser interpretada como dois peixes padrão consecutivos. A saída correspondente seria <>< ><>
.
Como outro exemplo, a cadeia ><>><>>
contém "instâncias" de ...
(colchetes adicionados apenas como indicadores)
- alguns peixes comuns:
[><>][><>]>
- um peixe veloz:
><[>><>]>
- um peixe robusto de duas maneiras:
[><>>]<>>
e><>[><>>]
no entanto, apenas o emparelhamento de um peixe padrão e um peixe robusto [><>][><>>]
abrange todo o comprimento da sequência, sem caracteres de compartilhamento de peixes (sem sobreposições). Assim, a saída correspondente a ><>><>>
é ><> ><>>
.
Se houver várias maneiras de interpretar a sequência, você pode imprimir qualquer uma delas. (E só imprimir uma . Delas) Por exemplo, <><<<><
pode ser interpretado como um peixe padrão e um peixe resistente: [<><][<<><]
ou como um peixe rápido e um peixe padrão: [<><<][<><]
. Então, <>< <<><
ou <><< <><
seria uma saída válida.
Os caranguejos são apenas para diversão. Como eles não começam ou terminam com <
ou >
, eles são muito mais fáceis de identificar (pelo menos visualmente). Por exemplo, a sequência
,<..>,><<<>,<..>,><>,<..>,<>>><,<..>,><>>,<..>,<<><,<..>,<><,<..>,>><>
obviamente produziria a saída
,<..>, ><<<> ,<..>, ><> ,<..>, <>>>< ,<..>, ><>> ,<..>, <<>< ,<..>, <>< ,<..>, >><>
Aqui estão alguns exemplos de cadeias (uma por linha) que não produzem saída:
<><>
,<..>,<..>,
>>><>
><<<<>
,
><><>
,<><>,
<<<><><<<>>><>><>><><><<>>><>><>>><>>><>><>><<><
A última string aqui pode ser analisada se você remover a principal <
:
<<>< ><<<> >><> ><> ><> <>< <>>>< >><> >><> >><> ><>> <<><
(Pode haver outras saídas possíveis.)
Detalhes
- A sequência de entrada conterá apenas os caracteres
<>,.
. - A sequência de entrada terá pelo menos um caractere.
- Pegue a entrada de qualquer maneira comum (linha de comando, stdin) e faça a saída para stdout.
- O código mais curto em bytes vence. ( Contador de bytes à mão. ) O desempatador é uma postagem anterior.
fonte
Respostas:
Pitão,
644850 bytesCaso de teste.
Versão que não demora para sempre ( ) aqui , em 52 bytes.
O(9n/3)
Essa é a abordagem da força bruta, gera todas as seqüências e verifica se há alguma soma na entrada. Diagramas de peixes compactados como caracteres, cujas representações binárias são
>
e<
. A coisa toda é agrupada em um bloco try-catch para que nenhuma saída ocorra quando nenhum resultado for encontrado.Esta é uma solução.
O(9n)
Alguns caracteres são removidos acima, porque caracteres de controle são usados. Eles são reproduzidos fielmente no link acima.
saída xxd:
fonte
><>><>>
leva 15 segundos na minha máquina.Máquina de Turing não determinística, 20 estados, 52 transições (talvez 882 bytes)
Como você converte isso em bytes? Eu escrevi os arquivos (absolutamente sem golfe) para executar esta máquina com o Simulator of a Turing Machine 1 de Alex Vinokur .
wc -c
gera o seguinte (excluindo o arquivo de descrição e os arquivos de entrada):De qualquer forma, eu estava me preparando para meus Níveis A de Ciência da Computação, então pensei que seria um bom exercício (não sei o que estava pensando). Então aqui está a definição:
(a função de transição)
Desculpe a imagem ruim, mas não me incomodei em redesenhar essa coisa em um computador. Se você realmente deseja decifrar as regras de transição, recomendo que você leia o arquivo de regras vinculado acima.
Eu usei
X
s em vez de espaços, porque os espaços são difíceis de visualizar aqui e o simulador não aceita espaços no alfabeto.O conceito é bastante simples - q1 a q4 são usados para capturar peixes virados para a direita, q11 a q14 são usados para capturar peixes virados para a esquerda, q15 a q19 para caranguejos e o blob de q5 a q10 é simplesmente para inserir um espaço e mover tudo seguintes caracteres um para a direita.
Se a sequência for interpretável, ela será aceita e a fita conterá a sequência com os espaços inseridos. Caso contrário, ele rejeita a string (acho que isso não conta como saída - esvaziar a fita seria muito fácil, mas exigiria muitas regras de transição e não acho que tornaria a função de transição mais bonita de se olhar).
1 Nota: É difícil compilar. Eu tive que editar o
src/tape.cpp
arquivo e substituirLONG_MAX
com1<<30
e depois ir para odemo
diretório, edite o Makefile para substituirEXE_BASENAME
comturing.exe
e executarmake
. Em seguida, vá para o diretório com os arquivos que escrevi e executei/path/to/turing/download/src/turing.exe meta
.fonte
peixe (sim, esse peixe), 437 bytes
Isso me parece uma daquelas tarefas de programação em que exatamente um idioma está certo.
A versão a seguir ainda é a resposta mais longa para o desafio,
mas, como isso foi feito principalmente pelo trocadilho (desculpe, espero), o golfe é deixado como um exercício para o leitor.
fonte
printf 'H4sIADSjKlUCA4VPQW6DMBC89xUj5AOocSSOlV1/BHGgjgMrBUPN0kRRHl/jmEg99WBLszM7M7s4BqMw2hQotNHxNy+QkDYJZU7rTJqED/p4NIdCLdFmVOfVW6bJY04DeQGhVteBLg4cVqfYLQxBkD3jQ6HzJwTHa/BRRmf4ibEtBpRfriefXCxKZ4cJghtB7eNqIW2lnqMu9D9N3T7sGtOssDInJCk+982/MlmOHQ+I6rqKRv5UpRxCntN7XSk7eSYfK0f+eR3EmI23qilH3iFCrjIqdyNO8nzJvJH7alMu7jsnlHZafWw5VluD9r/0/c2vQ95+AYBxAwS2AQAA'|base64 --decode|gzip -d>a;fish a
> <>, 602 bytes
Uma solução em Fish, provavelmente muito jogável, mas é o meu primeiro> <> programa. Ele recebe sua entrada da pilha de entradas e é executado no intérprete online <>.
Como funciona :
Um loop lê todas as entradas e as empilha, inverte-as e coloca -1 na parte inferior, o que marcará que a análise está concluída (todos os caracteres permanecem na pilha até que a cadeia seja considerada analisável).
A análise usa o fato de que todos os caracteres são diferentes no módulo 5 e todos os padrões são determinísticos, exceto <> << e> <>>. Caracteres analisados são colocados na parte inferior da pilha.
Quando um padrão é concluído, se -1 estiver no topo, todos os caracteres são impressos; caso contrário, um espaço é adicionado e o programa faz um loop.
Se <> << ou> <>> forem encontrados, o registro será incrementado (0 no início) e um 0 será colocado na pilha antes do último caractere (para que <> <ou> <> permaneça após a reversão) . Se um erro aparecer posteriormente durante a análise, o registro será diminuído, todos os caracteres após o 0 serão recolocados no topo (exceto espaços graças a um teste de% 8 = 0).
Se um erro for detectado enquanto o registro é 0 ou dentro do caranguejo, o programa termina imediatamente.
fonte
Python 3, 156
A estratégia é gerar listas de peixes e comparar sua concatenação com a sequência de entrada.
Isso leva impossivelmente tempo. Se você realmente deseja ver uma saída, substitua
for _ in s
porfor _ in [0]*3
, onde 3 é o limite superior para o número de peixes. Ele funciona,s
poiss
contém no máximo um peixe por caractere.Obrigado ao Sp3000 por correções de erros e um salvamento de caracteres na entrada.
Antigo 165:
fonte
a and b or c
dar um valor errado quandob
poderia ser Falsey. Volteiif/else
para 2 caracteres, mas pode haver uma maneira de fazer o trabalho ternário.*l,s=[],input()
Perl, 81 + 1 bytes
Experimente este código online.
Este código espera a entrada na
$_
variável; execute isso com o-n
switch do Perl ( contado como +1 byte ) para aplicá-lo a cada linha de entrada, por exemplo:Esse código usa o mecanismo regexp do Perl (e especificamente seu recurso de execução de código incorporado ) para executar uma pesquisa de retorno eficiente. Os peixes individuais encontrados são coletados na
@a
matriz, que é codificada e impressa se a correspondência for bem-sucedida.Este código também utiliza o Perl 5.10+
say
recurso, e assim deve ser executado com o-E
ou-M5.010
switch (ouuse 5.010;
) para permitir que tais características modernas. Por tradição, essas opções usadas apenas para habilitar uma versão específica do idioma não são incluídas na contagem de bytes.Como alternativa, aqui está uma versão de 87 bytes que não requer nenhuma opção especial de linha de comando. Ele lê uma linha de stdin e imprime o resultado (se houver) em stdout, sem nenhum avanço de linha final:
Ps. Se a impressão de um espaço extra no início da saída fosse permitida, eu poderia salvar trivialmente mais dois bytes com:
fonte
><(>|<<)>
Python 3,
196186 bytesRecursão simples.
g
ou retorna uma lista de peixes analisados ouNone
se a sequência de entrada não puder ser analisada.fonte
Python 2, 234 bytes
Tentei primeiro uma solução regex Python, mas parece não haver maneira de extrair os grupos após uma correspondência em vários padrões. A seguir, é apresentada uma pesquisa recursiva que parece se sair bem nos casos de teste.
Um exemplo de teste:
E a versão não destruída:
fonte
if
pode estar em uma única linha (como você fez em outro lugar). Além disso, em vez deif p<len(t)
eu acho que você pode fazerif t[p:]
para salvar alguns bytes.C # - 319 bytes
Esta solução é vergonhosamente simples, quase nada para o Golf. É um programa completo, recebe a entrada como uma linha do STDIN e envia o resultado para o STDOUT.
Ele simplesmente tenta corresponder cada peixe à primeira posição após um espaço (ou no início da corda) e combina cada tipo de peixe com ele. Se o peixe se encaixa, ele recursivamente chama o solucionador após inserir um espaço após o peixe, ou simplesmente retorna sua entrada (com a \ n por motivos de saída) se a string não correspondida for literalmente o peixe (ou seja, encontramos uma solução) .
Não fiz muita tentativa de fornecer à cadeia de peixes o tratamento usual de kolmogorov, porque não é tão longo e não consigo encontrar uma maneira barata de reverter uma cadeia de caracteres em c # (não acho que o LINQ pagará), então pode haver alguma oportunidade lá, mas duvido um pouco.
fonte
Haskell (Parsec) - 262
fonte
eu sou um pouco de um python noob, então ignore a estranheza: P
fonte
m
vez demsg
, ems
vez destart
...) e usar apenas 1 espaço por incremento. E, por favor, adicione o número de caracteres do seu programa (você pode contá-los aqui ).Ruby, 177 bytes
Não é o mais curto, mas o primeiro em rubi:
A tentativa aqui é estender recursivamente uma regexp e compará-la com a entrada.
Se uma correspondência mais longa for encontrada, r () será recursivo; caso contrário, ele verificará se a última correspondência consome toda a cadeia de entrada e somente a gera com espaços adicionados.
fonte
CJam,
111 9691 (ou 62 bytes)Uma abordagem gananciosa iterativa para descobrir o que todas as combinações de peixes são possíveis à medida que você itera. Realmente não jogou golfe agora.
O código contém alguns caracteres não imprimíveis, portanto, use o link abaixo para referência.
Atualização codificada a sequência
Acrescentará explicação uma vez feito o golfe
Experimente online aqui
62 bytes
Versão super lenta. Isso basicamente cria todas as combinações e verificações iguais à entrada.
Isso também contém caracteres não imprimíveis, portanto, confie no link abaixo.
Experimente online aqui
fonte
Haskell,
148146 bytesTestando:
$ echo "> <>> <>>" | runhaskell fishes.hs
Explicação
Com base na minha resposta anterior a uma pergunta semelhante. O algoritmo é executado em tempo exponencial.
Isso lê da direita para a esquerda.
Isso não imprimirá uma sequência que termina com um espaço, mesmo que essas cadeias também sejam geradas, porque sua contraparte sem espaço é gerada primeiro.
fonte
JavaScript (ES6), 164
Primeira varredura recursiva e profunda.
Como um programa com E / S via pop-up:
Como uma função testável:
Conjunto de teste (executado no console Firefox / FireBug)
Resultado
Ungolfed apenas a função k
fonte
Haskell,
148142isso usa a compreensão da lista para iterar sobre os peixes, escolher aqueles que correspondem ao início e continuar recursivamente.
fonte
Javascript (
122135 bytes)Não é o mais jogado aqui, pode ser despojado um pouco.
Este é baseado em regex, e um pouco difícil de descobrir o que está acontecendo.
Este é um one-liner.
Basicamente, verifico a sintaxe e, em seguida, divido a string com base nos caracteres e a uno.
Emite uma exceção quando você fornece uma entrada inválida.
Se não puder lançar exceções (
126139 bytes):Ambos são one-liners.
Ambos funcionam da mesma maneira.
Obrigado @ edc65 por detectar o case de borda que não estava funcionando bem.
Você pode testá-lo aqui (a saída será gravada no documento).
É baseado na versão que lança exceções quando você introduz um código inválido.
Mostrar snippet de código
(Atualmente, há um erro nos snippets de pilha,
Eu publiquei na metaJá foi perguntado ontem. Para que funcione, substituí$
por\x24
, que tem a mesma saída. Você pode ler sobre o bug aqui: http://meta.codegolf.stackexchange.com/questions/5043/stack-snippets-messing-with-js )fonte
><>><>>
. Eu acho que isso não pode resolvido tão facilmente com Regexp, você precisa de alguma antecipação ou BackTrak ou qualquer ...Scala, 299 bytes
Casos de teste
Resultado
fonte
Java, 288 bytes
Formatado:
fonte
Eu não estava gostando do tamanho, mas aqui está uma maneira fácil de entender isso no Dart.
fonte
Python 3,
166164 bytesSolução recursiva. Tarde para a festa, mas pensei em publicá-la de qualquer maneira, já que ela supera o Sp3000 por
2022 bytes sem precisar forçar a resposta com força bruta.fonte