Odd'em out: letras

11

Objetivo

Escreva um programa ou função (ou equivalente) que classifique e retorne a letra ímpar na matriz de tamanho aleatório.

Detalhes

Você receberá uma matriz (como uma string) como entrada de dimensões aleatórias como esta.

bbbbbbbbbb
bbbbbdbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb

Seu trabalho é encontrar a letra que não corresponde ao restante (neste caso, é dencontrada na linha 2, coluna 6) e retornar essa letra como saída. A matriz será composta por letras A-Z, a-znovas linhas ( \napenas nas extremidades das linhas) e terá dimensões que variam de 5x5 a 10x10 (25 a 100 letras).

Aplicam-se brechas padrão. Este é um desafio de código de golfe; entrada com código de menos bytes ganha.

Entrada

A entrada será transmitida através da entrada padrão como uma string, se for um programa ou como argumento, se for uma função (ou similar).

Resultado

A única personagem que é o "estranho" na matriz ou None , nil, NULou a corda "None"se não houver nenhum caráter "estranho".

Mais exemplos

AAAAAAA
AAAAAAA
AAAAAAA
AAAIAAA
AAAAAAA

Responda: I

vvqvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv

Responda: q

puuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu

Responda: p

Gerador

Aqui está um gerador de matriz aleatória escrito em Python que você pode usar para testar seu programa. Nota: Há uma pequena chance de que isso possa cometer um erro e não colocar uma letra estranha.

juniorRubyist
fonte
1
Aqui está uma tradução literal do seu código Python em JS.
Arnauld
1
@juniorRubyist "remover o bônus" não é o mesmo que "tornar o bônus obrigatório". Ao mover a parte que era opcional até agora para os requisitos do desafio, você invalidou grande parte das respostas existentes.
Martin Ender

Respostas:

6

J , 12 10 7 bytes

-.}./.~

Experimente online!

    /.~        Group identical items together
  }.           Remove one item from each group
-.             Remove the rest from the input

Versão de 10 bytes

-._1 1{\:~

assobios ...

       \:~        Sort down
  _1 1{           Take the last character (which is a newline) and the second one.
-.                Remove those from the input
FrownyFrog
fonte
2
@ FrownyFrog Esta é uma maneira inteligente de encontrar o caracter estranho
Galen Ivanov
não pode decidir o que eu gosto melhor: este lindo gancho ou sua piada dragão ...
Jonah
4

Braquilog , 8 4 bytes

oḅ∋≠

Experimente online!

Explicação

Eu não usei o Brachylog antes, então isso pode não ser o ideal.

oḅ∋≠  Input is a string.
o     Sort the input.
 ḅ    Split it into blocks of equal elements.
  ∋   There is a block
   ≠  whose elements are all different.
      That block is the output.
Zgarb
fonte
Esse uso de ∋≠after para obter os resultados do comprimento 1 é muito inteligente. Você definitivamente deve publicá-lo na pergunta sobre dicas do Brachylog .
Fatalize
Obrigado @Fatalize, eu adicionei a dica.
Zgarb
3

K (oK) , 7 6 bytes

Solução

*<#:'=

Experimente online!

Exemplo:

*<#:'="vvqvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"q"

Explicação:

Foi encontrada uma abordagem um pouco mais curta: avaliada da direita para a esquerda:

*<#:'= / the solution
     = / group matching items together
  #:'  / count (#:) each (')
 <     / sort ascending
*      / take the first one

Notas:

Enquanto espero que o aspecto bônus deste desafio seja descartado, esta solução retornará o caractere de nova linha \nse não houver um caractere estranho:

*<#:'="vvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"\n"
rua
fonte
3

Prolog (SWI) , 46 bytes

p(L):-select(X,L,Y),\+member(X,Y),writef([X]).

Experimente online!

Ou se a saída verdadeira padrão das consultas de prólogo não estiver correta :

Prolog (SWI) , 48 bytes

Z*L:-select(X,L,Y),\+member(X,Y),char_code(Z,X).

Experimente online!

Explicação

Find the first element X in the input  
that when removed, results in output  
that does not contain X

then depending on the version above either:  
print X as a character  
or  
return X as an atom
Emigna
fonte
3

C (gcc) , 93 92 90 66 62 bytes

Muito mais curto como uma função

t;f(char*p){for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

Experimente online!

código de teste

main()
{
    char s[99];
    for(;gets(s);)f(s);
}

versão antiga é um programa

C 86 bytes

char*p;s[9];main(t){for(;p=gets(s);)for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

Emite o caractere ímpar ou nada. corra assim;

C:\eng\golf>python matrix_gen.py | a.exe
X
C:\eng\golf>python matrix_gen.py | a.exe
G
C:\eng\golf>python matrix_gen.py | a.exe
x
C:\eng\golf>python matrix_gen.py | a.exe

C:\eng\golf>python matrix_gen.py | a.exe
J
cleblanc
fonte
Não sei se é justo colocar isso gets()no driver de teste, pois está limpando a entrada removendo os \ n caracteres para você. Isso está fazendo algum trabalho para que sua função não esteja funcionando na entrada original.
quer
@MichaelDorgan Funciona com a entrada canalizada do script python, bem como com a entrada no TIO. Outros simplesmente codificaram a entrada que não parecia com o espírito do desafio.
Cleblanc #
3

05AB1E ,  4  2 bytes

Economizou 2 bytes graças a Adnan

.m

Experimente online!

Explicação

.m   # push a list of the least frequent character(s) in input
Emigna
fonte
Você precisa remover as novas linhas, pois garantimos que a entrada terá pelo menos 5 linhas?
Shaggy
@ Shagy: Não, eu não. Isso era para lidar com 2x2matrizes. Eu perdi a parte 5x5e subi. Obrigado!
Emigna
Tem que voltar nilse não tiver um "estranho", não é?
Magic Octopus Urn
@MagicOctopusUrn Essa parte era opcional quando esta resposta foi publicada. Eu acho que a mudança invalida a maioria das respostas agora ...
Martin Ender
2

Retina , 13 bytes

s(O`.
(.)\1+

Experimente online!

Explicação

s(O`.

Classifique todos os caracteres.

(.)\1+

Remova todos os caracteres que aparecerem pelo menos duas vezes.

Martin Ender
fonte
2

Casca , 2 bytes

◄=

Experimente online!

Esta é uma função que recebe uma string como entrada e retorna um caractere. É necessário o mínimo da string de entrada ao comparar caracteres para igualdade (ou seja, retorna o caractere que é igual ao menor número de outros caracteres).

Leo
fonte
2

C, 94 bytes

Retorno por ponteiro. Se não houver, retorne \0.

Isso causará vazamentos de memória. Supondo que intsejam 4 bytes.

*t;f(c,p,i)char*c,*p;{t=calloc(64,8);for(*p=-1;*c;c++)t[*c]--;for(i=0;++i<128;)!~t[i]?*p=i:0;}

Experimente online!

Colera Su
fonte
@ Shaggy Na verdade, eu não sei como interpretar essa regra, pois vejo alguns (outros) usuários explicitamente saberem sobre essa regra, mas ainda postar respostas como essa.
user202729
2
@ user202729, apenas porque outros o fazem, não significa que esteja certo;) Se você encontrar essas soluções, é melhor indicá-las.
Salsicha
@ Shaggy Bem, apontei explicitamente a regra, mas o usuário disse que "a regra diz explicitamente que essa é válida". Eu não sei o que dizer. | Nesse caso, a função exige que a matriz tseja zerada antes de chamar cada vez que não é a primeira vez.
user202729
@ Shaggy Obrigado, corrigido.
Colera Su
2

Bash , 15 20 bytes

fold -1|sort|uniq -u

Experimente online!

Explicação: fold s a entrada do 1caractere por linha, sorts em grupos de letras correspondentes e, em seguida, imprime apenas as linhas que são unique.

Obrigado a @Nahuel Fouilleul por capturar e ajudar a solucionar um problema com essa abordagem.

Justin Mariner
fonte
não funciona se o personagem estranho é o segundo ou o penuitlimate
Nahuel FOUILLEUL
@NahuelFouilleul Boa captura ... Não tenho certeza de como consertar isso no momento, mas vou corrigir ou excluir mais tarde, a menos que você tenha uma sugestão de correção.
Justin Mariner
ele pode ser simplesmente corrigir com |sort|mas pode haver uma solução melhor
Nahuel FOUILLEUL
também encontrou uma solução com grep, mas é mais longo grep -oP '^(.)((?=(?!\1).){2}|.*\K(?!\1).)'
Nahuel FOUILLEUL
@NahuelFouilleul Estou indo com a sortcorreção, obrigado. Você sempre pode postar essa resposta grep como sua, se quiser.
Justin Mariner
1

Pitão , 4 bytes

ho/Q

Experimente aqui!

Mr. Xcoder
fonte
.m/Qé de 4 bytes bem
Dave
@ Dave Isso sai como uma lista, porém, eu escolhi isso porque era mais elegante ;-)
Mr. Xcoder
1

Perl 5, 17 + 3 (-00p) -25% = 15 bytes

/(.)\1/;s/
|$1//g

experimente online

Nahuel Fouilleul
fonte
1

Matlab, 25 bytes

a=input('');a(a~=mode(a))

A entrada "a" onde "a" não é o modo de "a". Produz um array vazio para nenhum oddball.

Jeremiah Peek
fonte
1

Haskell, 33 * 0,75 = 24,75 bytes

f s=[c|[c]<-(`filter`s).(==)<$>s]

Retorna uma lista vazia se não houver um caractere ímpar.

Experimente online!

Para cada caractere cna matriz (fornecido como uma string s), faça uma string de todos os caracteres siguais ce mantenha os caracteres de comprimento 1.

nimi
fonte
1

JavaScript (ES6), 37 bytes

Retorna nullse não houver uma letra ímpar.

s=>s.match(`[^
${s.match(/(.)\1/)}]`)

Casos de teste

Arnauld
fonte
1

Japt , 6 bytes

Recebe a entrada como uma sequência de linhas múltiplas e gera uma única sequência de caracteres ou uma sequência vazia, se não houver solução.

k@èX É

Tente


Explicação

Remova os caracteres que retornam verdade ( k) quando passados ​​por uma função ( @) que conta ( è) as ocorrências do elemento atual ( X) na entrada e subtrai 1 ( É).

Shaggy
fonte
1

Lisp comum, 47 bytes

(lambda(s)(find-if(lambda(x)(=(count x s)1))s))

Experimente online!

Retorna a letra ímpar ou NIL, se não existir.

Renzo
fonte
1

Gelatina , 4 bytes

ċ@ÐṂ

Experimente online!

Retornar \n(uma única nova linha) caso não haja caracteres estranhos. Obviamente \nnão é um caractere imprimível.

Coincidentemente, esse é exatamente o mesmo algoritmo que a resposta do Mr.Xcoder Python. (Eu vim com ele de forma independente)

Explicação:

  ÐṂ    Ṃinimum value by...
ċ@      ċount. (the `@` switch the left and right arguments of `ċ`)

Isso funciona porque em uma m×nmatriz:

  • Se existir um caractere ímpar: existem m-1novas linhas, 1 caractere ímpar e m×n-1caractere normal e 1 < m-1 < m×n-1porque5 ≤ m, n ≤ 10 .
  • Se não houver caracteres ímpares: existem m-1novas linhas e m×ncaracteres normais, e m-1 < m×n.
user202729
fonte
1

C # (.NET Core) , 54 bytes

i=>i.GroupBy(x=>x).FirstOrDefault(g=>g.Count()<2)?.Key

Experimente online!

Wakawakamush
fonte
Você está certo, minha resposta estava errada. Eu o apaguei. Mas você está perdendo os 18 bytes da usinginstrução na contagem de bytes.
raznagul 29/11
1

C (gcc) , 91 86 82 79 71 bytes

f(char*s){for(;*++s==10?s+=2:0,*s;)if(*s^s[-1])return*s^s[1]?*s:s[-1];}

Experimente online!

  • Obrigado ao Gastropner pelo xor e? truques (-3 bytes)
  • Retrabalhou a versão de comparação para corrigir bugs e usou a magia do Gastropner nos comentários.

Explicação:

Compare o caractere atual e o anterior, ignorando as novas linhas. Se diferente, compare com o próximo caractere. Isso nos diz se retornamos caracteres atuais ou anteriores. A função retorna o valor de caractere "ímpar" se existir ou 0 se a matriz não for ímpar. Nós nos safamos da "próxima" verificação de char, porque sempre há uma nova linha antes do\0 char. Se não houver um caractere ímpar, retornamos intrinsecamente o \ 0 do loop for.


Código xor mais antigo e mais sexy Explicação:

Faça uma máscara xor em execução dos próximos 3 valores de sequência. Se forem todos iguais, o valor será igual a qualquer um dos três. Se forem diferentes, os 2 idênticos se cancelarão deixando o único.

Deve fatorar / n antes do xor ou ficar confuso. Também é necessário verificar 2 caracteres quanto à desigualdade, caso s [0] seja o valor ímpar. Isso custa o extra || Verifica.

v;f(char*s){while(s[3]){s[2]==10?s+=3:0;v=*s^s[1]^s[2];if(v^‌​*s++||v^*s)break;}}
Michael Dorgan
fonte
79 com alguns ajustes. O retorno v;f(char*s){while(s[3]){s[2]==10?s+=3:0;v=*s^s[1]^s[2];if(v^*s++||v^*s)break;}}
direto
Para a porcaria que estou escrevendo, o TIO é o que eu uso. Obrigado!
22717 Michael Michaelgangan
Reorganizando algumas expressões permite que outro -2 para 77: v;f(char*s){while(s[2]==10?s+=3:0,v=*s^s[1]^s[2],s[3])if(v^*s++||v^*s)break;} No entanto o seu cavalo vencedor é o outro, se você mexer com ele um pouco, para 73:v;f(char*s){for(v=-1;*++s==10?s+=2,v--:0,*s;v=0)if(*s^s[-1])return s[v];}
gastropner
Sim, mas o xor parece tão sexy. :)
Michael Dorgan
Sugerir em s+=*++s-10?0:2vez de*++s==10?s+=2:0
roofcat 2/08/19
1

Oitava , 26 25 bytes

1 byte salvo graças a @Giuseppe

@(x)x(sum(x(:)==x(:)')<2)

Função anônima que recebe uma matriz de caracteres 2D como entrada e gera uma letra ímpar ou uma sequência vazia, se não existir.

Experimente online!

Luis Mendo
fonte
0

Alice , 16 * 75% = 12 bytes

/-.nDo&
\i..*N@/

Experimente online!

Saídas Jabberwocky se não houver caracteres duplicados.

Explicação

/...@
\.../

Essa é uma estrutura para programas lineares que operam inteiramente no Ordinal (modo de processamento de strings). O código real é executado em zigue-zague e se desdobra em:

i..DN&-o

i   Read all input.
..  Make two copies.
D   Deduplicate one copy, giving only the two letters and a linefeed.
N   Multiset difference. Removes one copy of each letter and one linefeed.
    Therefore it drops the unique letter.
&-  Fold substring removal over this new string. This essentially removes
    all copies of the repeated letter and all linefeeds from the input,
    leaving only the unique letter.
.   Duplicate.
n   Logical NOT. Turns empty strings into "Jabberwocky" and everything else
    into an empty string.
*   Concatenate to the previous result.
o   Print the unique letter or "Jabberwocky".

Em vez de &-, também poderíamos usar ey(transliteração para uma string vazia). Como alternativa, gastando mais um caractere na manipulação de pilha, também poderíamos deduplicar a entrada, o que nos permite remover os caracteres indesejados N, mas ainda é a mesma contagem de bytes:

i.D.QXN.n*o@

Alice , 13 bytes

/N.-D@
\i&.o/

Experimente online!

Esta é a solução sem o bônus, simplesmente está faltando o .n*.

Martin Ender
fonte
0

APL + WIN, 16 bytes

(1=+/a∘.=a)/a←,⎕

Solicita a entrada na tela e gera uma letra ímpar ou nada se não houver uma letra ímpar

Graham
fonte
a/⍨1=+/a∘.=a←,⎕para um byte
Uriel
@Uriel Obrigado, mas tenho medo de que o operador ⍨ não esteja disponível na minha versão antiga do APL + WIN 5 :(
Graham
0

PowerShell , 39 bytes

([char[]]"$args"|group|sort c*)[0].Name

Experimente online!

Recebe a entrada como uma string com novas linhas (conforme especificado no desafio) e a converte em uma charmatriz. Nós, então, Group-Objectos caracteres, para que os caracteres sejam agrupados por seus nomes e depois com sortbase no count. Isso garante que o caractere solitário seja o primeiro, então pegamos o [0]índice e produzimos seu .Name.

Se a nova linha for aceitável para "nada", isso será qualificado para o bônus.

AdmBorkBork
fonte
Eu esperava sort c*)[0]poder ser encurtado, mas o que eu criei foi o mesmo número de bytes ? c* -eq 1),.
root
pode ser reduzido, removendo as aspas duplas $args. Além disso, é mais preciso fazer ([char[]]$args|group|? c* -eq 1).Nameisso, pois retornará com precisão nullquando não houver caracteres ímpares (em vez de nova linha). No entanto, em termos de bytes isso ainda não lhe trará abaixo 37.
cogumel0
@ cogumel0 Não funciona sem aspas duplas.
root
@root você está correto. No entanto, para passar um dos requisitos (A única personagem que é o "estranho" na matriz ou None, nil, NULou a corda "None"se não houver nenhum caráter "estranho".) Deve ainda ser alterada. A nova linha não faz parte das respostas aceitáveis.
cogumel0
@ cogumel0 Ah, o desafio mudou desde que postei minha resposta. O "Nenhum / zero / qualquer coisa" costumava ser apenas um bônus, e não obrigatório. Vou manter minha resposta como está.
AdmBorkBork
0

Perl 6 ,  27  24 -25% = 18 bytes

*.comb.Bag.min(*.value).key

Teste-o

{%(.comb.Bag.invert){1}}

Teste-o

Isso retornará um valor indefinido quando receber uma entrada que não tenha um caractere ímpar.

Expandido:

{  # bare block lambda with implicit parameter 「$_」

  %(        # coerce into a Hash

    .comb   # split the input into graphemes (implicit method call on 「$_」)
    .Bag    # turn into a weighted Set
    .invert # invert that (swap keys for values) returns a sequence

  ){ 1 }    # get the character that only occurs once
}
Brad Gilbert b2gills
fonte
0

Brainfuck, 125 bytes

,[----------[>],]<[->+<]<<[[->->+<<]>[>[->-<<<+>>]>[,<<,>>]<<<[->+<]>[->+<]<]>[-<<+>>]>[-<+>]<<<<]>>>>[<]<++++++++++.

Experimente Online

Imprime a letra da matriz se não houver um número ímpar

Brincadeira
fonte
0

Java 8, 85 bytes

Este é um lambda de Stringpara String(por exemplo Function<String, String>). É essencialmente uma cópia da solução de Luca , mas reduzi um pouco a seqüência de caracteres.

s->new String(s.chars().sorted().toArray(),0,s.length()).replaceAll("(.)\\1+|\\n","")

Experimente Online

Jakob
fonte