Dada uma string como entrada, produza o estado dos EUA cuja capital é se for uma capital estadual, a capital do estado se for um estado ou Arstotzka
se não for nenhum.
Exemplos:
Austin -> Texas
Alaska -> Juneau
The Nineteenth Byte -> Arstotzka
Todas as capitais e seus respectivos estados:
Baton Rouge, Louisiana
Indianapolis, Indiana
Columbus, Ohio
Montgomery, Alabama
Helena, Montana
Denver, Colorado
Boise, Idaho
Austin, Texas
Boston, Massachusetts
Albany, New York
Tallahassee, Florida
Santa Fe, New Mexico
Nashville, Tennessee
Trenton, New Jersey
Jefferson, Missouri
Richmond, Virginia
Pierre, South Dakota
Harrisburg, Pennsylvania
Augusta, Maine
Providence, Rhode Island
Dover, Delaware
Concord, New Hampshire
Montpelier, Vermont
Hartford, Connecticut
Topeka, Kansas
Saint Paul, Minnesota
Juneau, Alaska
Lincoln, Nebraska
Raleigh, North Carolina
Madison, Wisconsin
Olympia, Washington
Phoenix, Arizona
Lansing, Michigan
Honolulu, Hawaii
Jackson, Mississippi
Springfield, Illinois
Columbia, South Carolina
Annapolis, Maryland
Cheyenne, Wyoming
Salt Lake City, Utah
Atlanta, Georgia
Bismarck, North Dakota
Frankfort, Kentucky
Salem, Oregon
Little Rock, Arkansas
Des Moines, Iowa
Sacramento, California
Oklahoma City, Oklahoma
Charleston, West Virginia
Carson City, Nevada
Regras
- Nenhum built-in ou bibliotecas / módulos que fornecem um mapeamento de estados para capitais ou capitais para estados ou listas de capitais e / ou estados (por exemplo, o
CityData
built-in do Mathematica )
- Aplicam-se brechas padrão
- Isso é código-golfe , então a resposta mais curta em bytes vence!
Entre os melhores
O snippet de pilha na parte inferior desta postagem gera o cabeçalho das respostas a) como uma lista da solução mais curta por idioma eb) como um cabeçalho geral.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
## Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
## Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><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="language-list"> <h2>Shortest Solution 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> <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> <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><script>var QUESTION_ID = 64254; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 45941; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Respostas:
Pyth,
597596590O hexdump acima pode ser revertido com
xxd -r -c 17
. Experimente online no Pyth Compiler .Idéia
Codificamos as informações necessárias da seguinte maneira:
Todos os nomes foram convertidos para minúsculas, os espaços foram substituídos por q's e os nomes são separados por linhas de alimentação.
Todas as maiúsculas são listadas primeiro (em uma ordem que conseguiu minimizar a contagem de bytes). Os estados correspondentes são listados na ordem inversa. Por fim, Arstotzka é anexado.
Dessa forma, o capital / estado no índice i corresponde ao estado / capital no índice - (x + 2) . Além disso, uma entrada inválida terá o índice 100 ( Arstotzka ) ou -1 (não encontrado) e - (100 + 2) ≡ -1 ≡ - (- 1 + 2) mod 101 . Esse layout evita que Arstotzka seja um caso especial, sem acrescentar ou acrescentar nada à lista.
Para compactar as informações, encontramos o índice de cada caractere
"\nabc...xyz"
e convertemos o resultado da base 27 para a base 256.A decodificação é direta: voltamos da base 256 para a base 27, recuperamos os elementos correspondentes
"\nabc…xyz"
, substituímos q por espaços e colocamos em maiúscula a primeira letra de cada palavra resultante.Código
fonte
Python3, 997 bytes
Não posso me incomodar em fazer a conversão de base ou o pacote binário que a versão vencedora sem dúvida fará, mas quero postar isso para mostrar um truque muito legal.
XOR 'somar um número por 1 é equivalente a adicionar 1 se o número for par ou subtrair 1 se o número for ímpar. Você pode criar mapas bidirecionais muito fáceis e eficientes usando esse truque.
fonte
print()
e tudo o mais ainda deve funcionarraw_input
). @orlpCJam,
625609603599 bytesO hexdump acima pode ser revertido com
xxd -r -c 17
. Experimente online no intérprete CJam .Idéia
Codificamos as informações necessárias da seguinte maneira:
Todos os nomes foram convertidos para minúsculas, os espaços foram substituídos por q's e os nomes são separados por barras de reticulação.
Todas as maiúsculas são listadas primeiro (em uma ordem que conseguiu minimizar a contagem de bytes). Os estados correspondentes são listados na ordem inversa. Por fim, Arstotzka é anexado.
Dessa forma, o capital / estado no índice i corresponde ao estado / capital no índice - (x + 2) . Além disso, uma entrada inválida terá o índice 100 ( Arstotzka ) ou -1 (não encontrado) e - (100 + 2) ≡ -1 ≡ - (- 1 + 2) mod 101 . Esse layout evita que Arstotzka seja um caso especial, sem acrescentar ou acrescentar nada à lista.
Para compactar as informações, subtraímos 97 (ponto de código de
`
) de cada caractere na string e convertemos o resultado da base 27 para a base 256.A decodificação é simples: voltamos da base 256 à base 27, adicionamos os dígitos resultantes da base 27 ao caractere backtick, substituímos q por espaços e colocamos em maiúscula a primeira letra de cada palavra resultante.
Código
fonte
JavaScript (ES6),
821806 bytesUsa a decodificação Base64 para compactar seqüências de caracteres. Demonstração ao vivo
Aqui está um hexdump; use
xxd -r filename
para reverter.fonte
r=
necessário?PHP,
12721239 bytesCertifique-se de ter ativado short_open_tag no php.ini:
Este código usa argv [1] como entrada.
fonte
<?$c=['Baton Rouge'=>Louisiana,$I=Indiana=>$I.polis, ... ];echo$c[$z=$argv[1]]?:(array_flip($c)[$z]?:Arstotzka);
. Você só precisa preencher a matriz. Ignorar todos os avisosJava,
1062964 bytes-17 bytes graças a @KevinCruijssen.
Experimente online!
Bem direto; se uma correspondência for encontrada, adicione ou subtraia do índice atual da matriz, dependendo se é par ou ímpar. Caso contrário, imprima "Arstotzka".
A maioria dos bytes salvos ocorreu devido à remoção dos 99
:
s e à divisão da cadeia de caracteres com base no regex(?<=[a-z])(?=[A-Z])
, que usa um lookbehind positivo e um lookahead para verificar a diferença de maiúsculas e minúsculas.fonte
R ,
1023985 bytesExperimente online!
Diferente da outra submissão R.
O código coloca as maiúsculas e os estados no mesmo vetor. Os estados estão em ordem inversa para que, dado o índice do estado ou da capital, o índice da entrada correspondente seja
length(data)-index+1
, ondelength(data)=100
, 50 (estados) + 50 (capitais)Além disso, os dados de entrada são compactados como uma única sequência e depois divididos. A corda pode ser comprimida para jogar ainda mais.
Editar: adicionada alguma substituição não otimizada de pares de caracteres.
fonte
Javascript,
10571042 bytesResposta 1: 1042
A resposta atualizada 1 perdeu um zero: S, também foi corrigida a incorrecção geral A resposta atualizada 1 + 2 reorganizou um pouco a estrutura.
Recomenda-se que a resposta 1 seja executada em um console Javascript (seu navegador, por exemplo), uma função sem nome que retorna ao console. Você também pode testá-lo aqui .
Resposta 2 1049
A resposta 2 funcionará com o botão de trecho de código
fonte
Ruby, 989
Divida os dados em uma única matriz. Encontre o índice da entrada na matriz (
index
retorna um valor falsonil
se a entrada não estiver lá)Se for falso, retorne "Arstotzka", caso contrário, XOR o índice com 1 para encontrar o outro membro do par
No programa de teste:
fonte
~a.index(s)
e fazendo os estados e capitais relacionar dessa forma (por exemplo,["New York", "New Jersey", "California",..., "Sacramento", "Trenton", "Albany"]
)PHP, 674 bytes
Hex:
Explicação
fonte
Prolog, 1221 bytes
A maior parte da contagem de bytes vem da lista de estados e capitais.
Todos os nomes de estados e capitais precisam ser citados átomos, pois começam com letras maiúsculas, nos custando 202 bytes apenas em s.
Como funciona
Obtém índice I do elemento X na lista L .
Índice Xor com 1 para obter o índice do valor de retorno.
Obtém o elemento E no índice J da lista L .
Se alguma regra falhar, imprima Arstotzka
Exemplo
fonte
Python 2.7,
127112321054 bytesExemplo de E / S:
Editar: melhorado
fonte
zip()
, nada além disso! (Também acho que tentando usar seqüência de interpolação / concatenação sobre isso só vai fazer o caminho de código mais enquanto marginalmente encurtando o dicionário, mas eu não sei como tentar)Perl 5, 999 bytes
Meu primeiro post no codegolf.
Ungolfed:
fonte
Perl 5, 1029 bytes
fonte
Haskell ,
1077106910681063 bytesExperimente online!
Depois de perder muito tempo tentando jogar golfe em uma implementação da codificação Huffman, percebi que a abordagem direta é provavelmente mais curta. Ah bem.
EDIT: Obrigado a @Laikoni por descolar 8 bytes!
EDIT: Obrigado novamente Laikoni por esse byte adicional. Boa ideia usar '~'
EDIT: Obrigado a Laikoni por tirar esses 5 bytes!
fonte
fmap tail
:(l,_:r)<-span(/=',')
.span(>',')
também deve funcionar.span(>',')
não funciona se houver um espaço no nome da capital (por exemplo, Baton Rouge) desde então' '<','
~
vez de,
, que é maior que todos os outros caracteres usados.last$l:[r|s==l]
é mais curto quefilter(/=s)[l,r]!!0
es==l||s==r
bateelem s[l,r]
em um byte.T-SQL, 1402 bytes (tamanho da contagem do arquivo .sql)
Para esse tipo de conjunto de tarefas, a lógica supera a lógica processual, tornando fácil e rápido resolvê-la em um banco de dados relacional.
Abaixo do código não destruído. Observe que podemos apenas executar a parte criar / preencher uma vez em um lote separado
E com esses dados persistidos, use apenas esta consulta
A declaração da variável não é obrigatória, é claro que você pode simplesmente inserir a entrada diretamente na consulta e poupar 10 bytes, mas eu prefiro minhas consultas parametrizadas.
fonte
sqlldr
formato em vez de inserção direta -sqlldr
não precisa de aspas em todos os lugares, por exemploZsh ,
993 928924 bytes-4 bytes graças à resposta Bash da @ spuck, substituindo
th Dakota
eth Carolina
Experimente online! Experimente online!Experimente online!Compactação manual substituindo os números 0..9 na matriz.
Como o Zsh usa matrizes indexadas a 1, precisamos adicionar um elemento fictício no início.
$a[(i)$1]
obtém o índice do elemento da matriz correspondente. A adição do(e)
sinalizador desativa a correspondência de padrões e usa a correspondência de sequência simples. Se não fizermos isso,Ut*
corresponderemosUtah
e imprimiremosCarson City
. Se o elemento não for encontrado, isso retornará um índice além do final da matriz.Em seguida, xoramos com 1 e obtemos o elemento emparelhado correspondente. Se o nosso elemento fictício no índice 1 corresponder, será esse
$a[0]
, que substituirá a sequência vazia. De qualquer forma, se estiver vazio,${ :-Arstotzka}
substituirá Arstotzka.fonte
Bater , 927
9781,0031,051976bytesMais uma edição, reduzindo bytes ocupados por espaços e novas linhas em $ T.
Também reordenou a substituição de 0..9, corrigindo um problema ao manipular "Carol1a", pois a substituição de 1 -> "in" já teria sido realizada antes desse ponto.
Editando minha resposta após o comentário de @ GammaFuntion abaixo; Eu não estava cumprindo as regras originais para lidar com todas as entradas; uma string que correspondesse parcialmente a um estado ou capital daria saída errada.
Sua resposta ao Zsh me inspirou a usar também a indexação do XOR em vez do módulo 100 e fazer alguma compressão manual usando os números 0..9. Eu escrevi um script para fazer alguns cálculos rápidos e sujos na lista de entrada para decidir quais dez seqüências dariam a melhor redução de bytes. Em seguida, usei esse script iterativamente para reduzir as seqüências de caracteres. Confira aqui: Experimente online!
Experimente online!
Experimente online!Experimente online!Experimente online!Experimente online!fonte
Rock
como entrada, a saída é emLittle Arkansas
vez deArstotzka
.for t in on in an is th.Carol1a or en as th.Dakota er;{ S=${S//$[j++]/$t};}
. Além disso, uso bomth.
, estou adicionando à minha resposta zsh.i
(ouj
) de antemão.R, 1294 bytes
É sensível a maiúsculas e minúsculas de acordo com a entrada mostrada como exemplo.
Código não jogado (ligeiramente diferente na posição da verificação):
fonte
Java, 1312
fonte
Javascript, 1042
fonte
AWK , 1009 bytes
Experimente online!
Se houver uma maneira de diminuir isso, eu ficaria feliz em ouvir sobre isso. :)
fonte
J ,
843829 bytesExperimente online!
fonte