Existem 97 caracteres ASCII que as pessoas encontram regularmente. Eles se enquadram em quatro categorias:
Letras (52 total)
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
Números ou dígitos (10 total)
0123456789
Símbolos e pontuação (32 total)
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
Espaço em branco (total de 3)
Espaço
\t
e nova linha\n
. (Trataremos as variantes de nova linha\r\n
como um caractere.)
Por concisão, chamaremos essas categorias de L, N, S e W, respectivamente.
Escolha uma das 24 permutações das letras que LNSW
você deseja e repita-a indefinidamente para formar um modelo de programação para você.
Por exemplo, você pode escolher a permutação NLWS
, para que seu modelo de programação seja:
NLWSNLWSNLWSNLWSNLWS...
Você precisa escrever um programa ou função com base neste modelo, onde:
Todo
L
é substituído por qualquer letra (ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
).Todo
N
é substituído por qualquer número (0123456789
).Todo
S
é substituído por qualquer símbolo (!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
).Todos
W
são substituídos por qualquer caractere de espaço em branco (\t\n
).
Basicamente, seu código deve seguir o padrão
<letter><number><symbol><whitespace><letter><number><symbol><whitespace>...
como o título da pergunta sugere, exceto que você pode escolher uma ordem diferente das quatro categorias de caracteres, se desejar.
Observe que:
As substituições para uma categoria podem ter caracteres diferentes. por exemplo, em
9a ^8B\t~7c\n]
conformidade com o modeloNLWSNLWSNLWS
(\t
e\n
seriam seus caracteres literais).Não há restrições de tamanho de código. por exemplo,
1A +2B -
e1A +2B
e1A
e1
todos em conformidade com o modeloNLWSNLWSNLWS...
.
O que o código em conformidade com o modelo deve fazer é pegar um caractere ASCII não estendido e gerar um número de 0 a 4 com base em qual categoria ele é membro na categorização acima. Ou seja, saída 1
se a entrada for uma letra, 2
se um número, 3
se um símbolo e 4
se houver espaço em branco. Saída 0
se a entrada não for uma dessas (um caractere de controle ).
Para entrada, você pode, alternativamente, inserir um número de 0 a 127 inclusive, que representa o código do caractere ASCII de entrada.
Os pares de entrada (como código de caracteres) e de saída que seu código deve ter são exatamente os seguintes:
in out
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 4
10 4
11 0 or 4
12 0 or 4
13 0 or 4
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 4
33 3
34 3
35 3
36 3
37 3
38 3
39 3
40 3
41 3
42 3
43 3
44 3
45 3
46 3
47 3
48 2
49 2
50 2
51 2
52 2
53 2
54 2
55 2
56 2
57 2
58 3
59 3
60 3
61 3
62 3
63 3
64 3
65 1
66 1
67 1
68 1
69 1
70 1
71 1
72 1
73 1
74 1
75 1
76 1
77 1
78 1
79 1
80 1
81 1
82 1
83 1
84 1
85 1
86 1
87 1
88 1
89 1
90 1
91 3
92 3
93 3
94 3
95 3
96 3
97 1
98 1
99 1
100 1
101 1
102 1
103 1
104 1
105 1
106 1
107 1
108 1
109 1
110 1
111 1
112 1
113 1
114 1
115 1
116 1
117 1
118 1
119 1
120 1
121 1
122 1
123 3
124 3
125 3
126 3
127 0
As entradas 11, 12 e 13 correspondem a caracteres que às vezes são considerados espaços em branco, portanto, suas saídas podem ser 0
ou 4
como você deseja.
O código mais curto em bytes vence.
fonte
Respostas:
Haskell 300 bytes
Este código não deve ter uma nova linha à direita. A função
m1
pega a entrada como aChar
e retorna a resposta comoChar
.Não pude resistir a um desafio que alguém alegou ser impossível para idiomas "convencionais".
Você pode contestar se Haskell conta, mas a maioria das palavras-chave e identificadores tem vários caracteres e não pode ser usada. No entanto, definições de função de nível superior, listas, literais de seqüência de caracteres, comparações estritas, correspondência de padrões e ramificação com guardas funcionam, desde que as letras cheguem antes dos dígitos e se os símbolos também vierem antes das letras, temos caracteres de escape como
\t
e\r
. Infelizmente, as permutações que funcionam para programação geral não permitem literais numéricos, então não consegui obter números de nenhuma maneira útil.Como funciona:
m1
.x1
é o personagem que está sendo analisado.f1
função divide a sequência com o padrão de lista correspondente e possui três ramificações: para quando os limites são símbolos maiores que o espaço, para quando os limites são escapados, controlam caracteres menores que o espaço e para manipular a comparação final com o próprio espaço. Os nomes das peças da lista são mnemônicos para o primeiro ramo: Letter, Number, sPace, sYmbol, Restante.b1
função lida com ramificação para dois caracteres de limites1 < b1
por vez.Experimente online
fonte
Retina , 113 bytes
Letra, Número, Espaço, Símbolo, Repita
Experimente online!
Teste em si mesmo!
Retina parece ser uma boa ferramenta para este trabalho: podemos usar todos os tipos de caracteres de forma flexível na configuração do palco, e temos algumas classes de caracteres predefinidas que podem ser úteis.
Eu acho que esse problema poderia ser resolvido com os estágios de substituição ou de transliteração; Eu escolhi as Transliterações porque são mais flexíveis e possuem as classes de caracteres mais úteis. Em relação ao padrão da fonte, fui forçado a colocar símbolos antes das letras para usar
\n
em novas linhas (na verdade, eu tinha uma solução mais curta usando o mais prático ¶ para novas linhas, mas caracteres não-ascii são proibidos).Explicação
Os primeiros estágios são transliterações. Usamos
+
e1
como opções para manter o padrão, mas eles não afetam o resultado do estágio. A sintaxe éT`from`to
mapear cada caracterefrom
para o caractere na mesma posição emto
. Seto
for menor quefrom
, seu caractere final será repetido quantas vezes forem necessárias. Sefrom
houver caracteres repetidos, apenas a primeira ocorrência de cada um será considerada. Algumas letras correspondem às classes de caracteres, por exemplo,d
é equivalente a0123456789
.Com isso, mapeamos alguns caracteres para outros da mesma classe, a fim de "criar espaço" para as seguintes transliterações. (
a
->b
,0
->1
,space
->tab
,@
->;
). A final:D0
é apenas um smiley: D0Começamos com dígitos,
d
é a classe de caracteres0-9
, aqui estamos transformando0
->a
,1-9
->2
,space
->2
: as transliterações para0
espace
estão erradas, mas esses caracteres foram eliminados pela transliteração anterior.Espaços em branco, transformar
a
->a
, (9
,tab
,\n
,space
) ->4
.9
já foi removido no estágio anterior.Letras, aqui usamos duas classes de caracteres diferentes (por falta de uma mais completa):
l
para letras minúsculas eL
letras maiúsculas. Todos eles são mapeados1
, junto com alguns outros personagens que foram tratados nos estágios anterioresSímbolos Como todas as outras classes foram transformadas em um dígito, aqui mapeamos todos os dígitos para si mesmos com
d
->d
e, em seguida, todos os caracteres imprimíveis para3
comp
->3
. Os dígitos também estão entre os caracteres imprimíveis, mas a primeira transliteração vence.Agora precisamos atribuir
0
para controlar caracteres, mas não encontrei uma maneira válida de abordar explicitamente essa classe. Em vez disso, converteremos cada dígito em unário: os caracteres de controle não são dígitos e, portanto, são considerados como a sequência vazia, que é igual a0
unário. Infelizmente, o comando de conversão unário na retina é$*
, que são dois símbolos próximos um do outro, portanto, converteremos "manualmente" usando substituições.Nosso dígito unário é
$n
, que é um padrão de substituição para novas linhas.\b
corresponde a um "limite", onde uma palavra alfanumérica começa ou termina: no nosso caso, isso sempre corresponderá antes de qualquer número. Estamos basicamente substituindo cada númeron
por uma nova linha maisn-1
.No final, contamos o número de novas linhas e obtemos o resultado desejado.
fonte
Cardinal
22402224 bytesModelo usado LSNW
O código tem uma nova linha à direita.
Como funciona:
Este código possui muitos caracteres que não são usados.
% libera um ponteiro em todas as direções. 3 deles atingiram o final de uma linha e morreram.
O último ponteiro recebe uma entrada no:
Esta entrada é comparada a cada valor de 0 a 127.
Impressões:
0 para 0-8
4 para 9-12
0 para 13-31
4 para 32
3 para 33-47
2 para 48-57
3 58-64 para
1 para 65-90
3 91-96 para
1 para 97-122
3 para 123-126
0 para 127
Operações usadas:
J = Pule a próxima operação se diferente de zero
^ = Altere a direção para cima
> = Altere a direção para a esquerda
- = Decremento
+ = Incremento
: = Aceite a entrada
% = Crie ponteiros no início do programa
x = Remova o ponteiro
0 = Defina ativo valor do ponteiro para 0
Experimente online
fonte
Perl 5 , 293 bytes
Código de 291 bytes + 2 para
-0p
.Fui avisado que os sinalizadores da linha de comando são gratuitos, mas os adicionei aqui para visibilidade, como o link TIO não inclui
-0
, para testes mais fáceis.Experimente online!
Este é um desafio particularmente difícil de resolver em quase qualquer idioma, então estou muito feliz por ter conseguido (finalmente, mexer bastante durante algum tempo) fazer isso funcionar no Perl. Esperamos que o espaço em branco adicional antes e depois do número não seja um problema.
A seleção da ordem da sequência foi particularmente complicada, mas felizmente
s///
ey///
pode aceitar qualquer outro caractere como delimitador, de modo que foi possível usar letra, espaço, número, símbolo, o que permites 0...0...0;
ey 0...0...0;
.A primeira coisa necessária para a abordagem foi substituir
_
por,!
para que\w
correspondesse apenas[0-9a-zA-Z]
, em seguida, substitua todo o espaço em branco (\s
) por\t
, todos os dígitos com\r
e todos os caracteres restantes da palavra (\w
) por,\n
para facilitar a correspondência posteriormente. Em seguida, usando oy///
operador, todos os símbolos restantes são convertidos em caracteres de palavra!
para_
e todos os outros caracteres (entre9
ea
) são deslocados para 9 lugares, transformando-os em letras ou números. Estes são então substituídos por\w
com3
e os outros substituições feitas anteriormente são substituídos por seus valores numerados.fonte
Espaço em branco , 1332 bytes
A ordem é
1234
/LNSW
(letra, dígito, símbolo, espaço em branco).Experimente on-line (insira como número inteiro representando o unicode de um caractere).
Explicação:
Espaço em branco é uma linguagem baseada em pilha onde todos os caracteres, exceto espaços, tabulações e novas linhas, são ignorados. Aqui está o mesmo programa sem o
YO!
( 333 bytes ):Letras
S
(espaço),T
(tabulação) eN
(nova linha) adicionadas apenas como destaque.[..._some_action]
adicionado apenas como explicação.Experimente online.
Programa em pseudo-código:
fonte