Dada uma lista de (key, value)
pares, determine se ela representa uma função, o que significa que cada tecla é mapeada para um valor consistente. Em outras palavras, sempre que duas entradas tiverem chaves iguais, elas também deverão ter valores iguais. Entradas repetidas estão OK.
Por exemplo:
# Not a function: 3 maps to both 1 and 6
[(3,1), (2,5), (3,6)]
# Function: It's OK that (3,5) is listed twice, and that both 6 and 4 both map to 4
[(3,5), (3,5), (6,4), (4,4)]
Entrada: uma sequência ordenada de (key, value)
pares usando os dígitos de 1 a 9. Você pode não precisar de uma ordem específica. Como alternativa, você pode tomar a lista de chaves e a lista de valores como entradas separadas.
Saída: um valor consistente para funções e um valor consistente diferente para não-funções.
Casos de teste: As 5 primeiras entradas são funções, as 5 últimas não.
[(3, 5), (3, 5), (6, 4), (4, 4)]
[(9, 4), (1, 4), (2, 4)]
[]
[(1, 1)]
[(1, 2), (2, 1)]
[(3, 1), (2, 5), (3, 6)]
[(1, 2), (2, 1), (5, 2), (1, 2), (2, 5)]
[(8, 8), (8, 8), (8, 9), (8, 9)]
[(1, 2), (1, 3), (1, 4)]
[(1, 2), (1, 3), (2, 3), (2, 4)]
Aqui estão elas como duas listas de entradas:
[[(3, 5), (3, 5), (6, 4), (4, 4)], [(9, 4), (1, 4), (2, 4)], [], [(1, 1)], [(1, 2), (2, 1)]]
[[(3, 1), (2, 5), (3, 6)], [(1, 2), (2, 1), (5, 2), (1, 2), (2, 5)], [(8, 8), (8, 8), (8, 9), (8, 9)], [(1, 2), (1, 3), (1, 4)], [(1, 2), (1, 3), (2, 3), (2, 4)]]
Entre os melhores:
var QUESTION_ID=118960,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/118960/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
(key,value)
pares sejam revertidos, como em(value,key)
? Posso raspar alguns bytes da minha resposta, se for o caso.Respostas:
Python 2 , 34 bytes
Experimente online!
Cria um dicionário e um conjunto a partir da entrada e compara seus comprimentos.
Os dicionários não podem ter chaves duplicadas; portanto, todos os valores ilegais (e repetidos) são removidos.
fonte
lambda x:not dict(x).items()^x
Haskell, 36 bytes
Experimente online!
Loop externo (->
(k,v)
) e interno (->(m,n)
) sobre os pares e sempre quek==m
, colete o valor de verdade dev==n
. Verifique se tudo é verdade.fonte
Braquilog ,
54 bytesExperimente online!
Programa completo. Até onde eu sei, a razão pela qual isso está superando a maioria das outras línguas de golfe é que ela
≠
está embutida no Brachylog, enquanto a maioria das outras línguas de golfe precisa sintetizá-la.Explicação
Como um programa completo, obtemos
true
se a afirmação é bem-sucedida oufalse
se falha.fonte
Pitão , 5 bytes
Estou muito feliz com este.
Experimente online!
fonte
Retina , 25 bytes
Experimente online!
O formato de entrada é
{k,v},{k,v},...
. Imprime0
para funções e1
para não funções. Eu poderia salvar dois bytes usando linefeeds em vez de vírgulas no formato de entrada, mas isso é uma bagunça.fonte
Braquilog , 13 bytes
Experimente online!
Explicação
fonte
Ċhᵐ=
eĊtᵐ≠
trabalhar?Ċ
é uma variável especial chamada Couple, que é sempre pré-restringida para ser uma lista de dois elementos.ᵐ
é um metapredicado que aplica o predicado imediatamente anterior (h - head
out - tail
aqui) a cada elemento da entrada (aquiĊ
).=
e≠
simpl verifique se sua entrada contém todos os elementos iguais / todos diferentes.MATL , 8 bytes
As entradas são: uma matriz com os
value
s, seguida por uma matriz com oskey
s.A saída é
1
para função, caso0
contrário.Experimente online! . Ou verifique todos os casos de teste .
Explicação
1Z?
Constrói uma matriz esparsa. Inicialmente todas as entradas contêm
0
; e1
é adicionado a cada entrada(i, j)
, ondej
ei
é o de entradakey
,value
pares.g
A matriz é convertida em lógica; isto é, entradas superior
1
(correspondente a duplicarkey
,value
pares) são ajustados para1
.s
A soma de cada coluna é calculada. Este é o número de
value
s diferentes para cada umkey
.2<A
Uma função terá todas essas somas inferiores a
2
.fonte
R, 33 bytes
Esta é a minha versão para R. Isso tira proveito da
ave
função. Eu permiti a entrada vazia, definindo padrões nos parâmetros de chave e valor.ave
está produzindo uma média dos valores para cada uma das chaves. Felizmente, isso retorna as médias na mesma ordem que os valores de entrada; portanto, uma comparação com a entrada indicará se existem valores diferentes. RetornaTRUE
se for uma função.Experimente online!
fonte
05AB1E ,
1197 bytesEconomizou 2 bytes graças a kalsowerus .
Experimente online!
Explicação
fonte
`\)^
com cabeça (¬
): TIO[]
:(,
no final. Adicione isso e, de alguma forma, ele funciona[]
.JavaScript (ES6),
4538 bytesGuardado 6 bytes graças a @Neil
Retorna
false
outrue
para funções e não funções, respectivamente.Isso funciona subtraindo constantemente o valor antigo de cada função (
m[k]
) e o novo (m[k]=v
que também armazena o novo valor). Cada vez, há três casos:m[k]
retornariaundefined
. Subtrair qualquer coisa dosundefined
resultados emNaN
, o que é falso.m[k]-v
resulta em0
, o que é falso.m[k]-v
resulta em um número inteiro diferente de zero, que é verdadeiro.Portanto, precisamos apenas garantir que isso
m[k]-(m[k]=v)
nunca seja verdade.fonte
a=>!a.some(([x,y])=>m[x]-(m[x]=y),m=[])
.m[k]
a indefinição ... Obrigado!Mathematica, 24 bytes
Explicação:
Union
exclui pares duplicados e#&@@@
obtém o primeiro elemento de cada par (comoFirst/@
mas com menos bytes). Se houver alguma repetição nesses primeiros elementos, os pares não fazem uma função, com a qual verificamosUnsameQ
.(Isso pode ter a maior densidade de
@
caracteres em qualquer programa que eu escrevi ...)fonte
@
densidade = 04/01R,
3633 bytesExperimente online!
função anônima; retorna
FALSE
para funções eTRUE
para não.Isso
está sendo derrotadoe finalmente está empatado com a resposta de MickyT! !fonte
Bash + coreutils, 17
A entrada é fornecida via STDIN.
key
evalue
são Tabseparados e cada par é delimitado por nova linha.sort
remove os pares de valores-chave duplicados.uniq -d
somente gera duplicatas e, portanto, gera a sequência vazia no caso de uma função e, caso contrário, uma sequência não vazia - quando houver chaves duplicadas que mapeiam para valores diferentes.Experimente online .
fonte
05AB1E , 9 bytes
Código:
Explicação:
Usa a codificação 05AB1E . Experimente online!
fonte
ʒ
imediatamente vejo :)}}
vez de}
.Gelatina , 6 bytes
Experimente online!
Explicação
Aqui está um método alternativo, também com 6 bytes:
Experimente online!
Em vez de testar com a remoção de chaves duplicadas, isso classifica (
Ṣ
) e verifica se a diferença entre os termos (I
) é verdadeira (Ạ
)fonte
R ,
9566 bytesEconomizou 29 bytes graças a Jarko Dubbeldam.
Função anônima. Saída
FALSE
se uma função eTRUE
se não (desculpe). Assume como argumentos uma lista de chaves e uma lista de valores, assim.Passa por todas as chaves e agarra o comprimento do conjunto de valores exclusivos para essa chave. Se
any
eles forem> 1, retorneTRUE
.Isso está sendo derrotado pela resposta de MickyT e também pela de Giuseppe . votou um deles.
fonte
function(k=0,v=0)any(sapply(k,function(x){length(unique(v[k==x]))-1}))
deve realizar a mesma coisa.J-uby ,
48332521 bytes-3 bytes graças à Jordânia!
Explicação
Primeira abordagem, 33 bytes
Este é mais longo que a solução Ruby equivalente, mas foi divertido de fazer.
Tentativa de explicação, transformando em Ruby:
Eu poderia salvar 2 bytes com uma versão mais recente substituindo
:uniq
por~:|
fonte
V , 30 bytes
Experimente online!
Saídas
1
para funções e nada para não-funções.fonte
Mathematica, 35 bytes
Função pura pegando uma lista de pares ordenados como entrada e retorno
True
ouFalse
. Explora o fato deUnion@#
excluir pares ordenados repetidos, mas<|Rule@@@#|>
(uma associação) exclui todos, exceto um par ordenado, com um primeiro elemento específico. Portanto, podemos apenas comparar osLength
s das duas saídas para verificar se a lista de entrada é uma função.fonte
Gelatina , 6 bytes
Experimente online!
Como funciona
fonte
CJam ,
1917 bytesEconomizou 2 bytes graças a Martin Ender
Saídas
0
para funções e1
para não funções.Experimente online!
Explicação
fonte
APL (Dyalog) ,
1612119 bytesExperimente online!
Explicação
Imprime
0
para falso e1
verdadeirofonte
Na verdade , 4 bytes
Experimente online!
Explicação:
fonte
brainfuck , 71 bytes
Experimente online!
A entrada é tomada como uma sequência simples: por exemplo, o primeiro caso de teste seria
35356444
. Para obter a representação mostrada na pergunta original, basta adicionar um total de seis vírgulas ao programa nos pontos corretos.A saída é
U
para funções eV
para não funções.Explicação
Para qualquer ponto de código ASCII n, f (n) é armazenado na célula 2n + 1. As células 2n e 2n + 2 são espaço de trabalho e 0, 2, 4, 6, ... 2n-2 são uma trilha de migalhas de pão para levar de volta à célula 0. Quando a entrada é comprovadamente não uma função, f ( 0) está definido como 1 (entre vários efeitos colaterais).
fonte
Perl 6 , 38 bytes
Tente
fonte
Pitão -
98 bytesTente
Funciona removendo quaisquer pares repetidos primeiro ({Q); depois, compara o comprimento da lista com o comprimento de um dicionário criado a partir da lista (se o mesmo valor x ocorrer mais de uma vez, o construtor do dicionário usará apenas o último, resultando em que o dicionário seja mais curto que a lista)
fonte
MATL , 12 bytes
A entrada é uma matriz de 2 colunas, onde a primeira coluna é a chave e a segunda é o valor.
Experimente online!
Explicação
fonte
PHP, 49 bytes
Não imprime nada para funções e
n
para não funções.fonte
CJam ,
14119 bytesExperimente online!
Recebe a entrada como uma matriz de pares de chave / valor na pilha, retorna
1
se a entrada é uma função e0
se não for.Essa solução é baseada no snippet
_&
, que desduplica uma matriz, levando consigo a interseção definida. Faço isso duas vezes, primeiro na entrada completa (para livrar-se de quaisquer pares de chaves / valores exatamente duplicados) e depois apenas nas chaves (para ver se ainda restam algumas chaves duplicadas após a primeira desduplicação).Aqui está o código completo com comentários:
fonte
e#
é a sintaxe de comentário de linha dedicada no CJam.Ruby,
393029 BytesObrigado a @ValueInk por salvar 9 bytes!
Porto da resposta do @ Rod's Python 2 .
fonte
Hash[x]
funciona tão bem tbh