Objetivos: Saída de uma String que contém todos os números inteiros positivos estritamente abaixo de 1000.
A resposta óbvia seria concatenar cada um deles, e isso criaria uma String de 2890 caracteres (graças ao manatwork). Para evitar esse tipo de resposta fácil, o comprimento da string deve ter menos de 1500 caracteres. Aqui está um código Java simples que gera uma String de 1200 caracteres.
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;
import static org.junit.Assert.assertTrue;
/**
* Created with IntelliJ IDEA.
* User: fab
* Date: 05/11/13
* Time: 09:53
* To change this template use File | Settings | File Templates.
*/
public class AStringToContainThemAll {
@Test
public void testsubStrings() throws Exception {
String a = generateNewString();
boolean cool = true;
for (int i = 0; i < 1000; i++) {
assertTrue(a.contains(Integer.toString(i)));
}
}
private String generateNewString() {
List<Integer> myTree = new ArrayList<Integer>();
String finalString = new String("100");
for (int i = 10; i < 1000; i++) {
myTree.add(i);
}
while (myTree.size() > 0) {
if (finalString.contains(Integer.toString(myTree.get(0)))) {
myTree.remove(0);
} else {
String substringLong = finalString.substring(finalString.length() - 2, finalString.length());
boolean found = false;
loop:
for (Integer integer : myTree) {
if (integer.toString().startsWith(substringLong) && !finalString.contains(integer.toString())) {
finalString = finalString.concat(integer.toString().substring(2, 3));
myTree.remove(integer);
found = true;
break loop;
}
}
if(! found){
finalString = finalString.concat(myTree.get(0).toString());
myTree.remove(0);
}
}
}
return finalString;
}
}
Menor ganho de código, ponto de bônus pela menor string!
code-golf
string
kolmogorov-complexity
Fabinout
fonte
fonte
B(10, 3)
, mas como não permite a quebra cíclica, é necessário repetir os dois primeiros caracteres.Respostas:
Golfscript - 13 bytes, saída 1315
O item acima seleciona os números de 0 a 990, cujo primeiro dígito é o maior dígito do número, ou seja, o último dígito da representação da sequência classificada é lexicograficamente menor que a própria sequência. A lógica é a seguinte:
Para um número de 3 dígitos abc , se a não for o maior dígito do número, o número poderá ser ignorado, pois será coberto por um dos dois casos mais tarde:
b <c (por exemplo, 123 )
Como c é o dígito maior, o número da cabine não será pulado. Neste exemplo 312 não será ignorado, nem o próximo valor 313 , que quando concatenado ( 312 313 ) contém 123 .
b ≥ c (por exemplo, 132 )
Como b é o dígito maior, o número bca não será pulado. Neste exemplo, 321 não será ignorado, nem o próximo valor 322 , que quando concatenado ( 321 322 ) contém 132 . Se b = c (por exemplo, 122 ), este caso também se aplica. O valor bca não será ignorado, como antes, e como a é necessariamente menor que b , bc <a + 1> também não será ignorado. Neste exemplo, 221 222 contém 122 .
Como o código acima testa o terceiro dígito, e não estritamente o último, todos os valores de 0 a 99 são incluídos no resultado. Os valores de 1 a 99 podem ser ignorados, no entanto, porque se cada sequência de 3 dígitos estiver presente, todas as seqüências de 1 e 2 dígitos também deverão estar presentes.
Os valores de 991-999 também podem ser ignorados, pois são gerados por ( 909 910 , 919 920 , ... 989 990 ).
Em 1315 bytes de saída, isso está confortavelmente sob a especificação do problema de menos de 1500.
Resultado:
Variação # 1
14 bytes, saída 1233
Ao selecionar estritamente o último dígito para comparação, em vez do terceiro, muitos dos valores desnecessários menores que 100 são eliminados, diminuindo a sequência resultante.
Variação # 2
16 bytes, saída 1127
Ao extrair todos os valores com menos de 99 de antemão, a sequência resultante pode ser reduzida ainda mais.
Golfscript - 19 bytes, saída 1016
O acima conta de 99 a 909 , adicionando qualquer valor que ainda não apareceu ( 909 seria normalmente o último valor adicionado dessa maneira). Moving 99 para a frente é uma otimização para evitar a necessidade de 910 na parte traseira.
Resultado:
Golfscript 26 bytes, saída 999
Observe que a sequência de 1016 caracteres produzida pela solução anterior é quase ideal, exceto por ter dois dígitos extras para cada múltiplo de 111 (ou seja, em
11111
vez de111
, em22222
vez de222
etc.). A solução pode ser otimizada removendo esses dígitos extras (inserindo apenas um dígito em cada um desses valores, em vez de três) e girando909
para a frente, eliminando um9
(que difere das versões anteriores, que foram movidas9100
para trás) )Desenrolou e comentou:
A lógica para escolher quais caracteres são acrescentados segue três casos:
O valor da primeira verificação é 1 e da segunda -1 .
A fatia começará a partir do índice 0 ; retornará toda a cadeia.
O valor do primeiro cheque é 1 e, do segundo, algo ≥ 2 .
A fatia começará a olhar a partir do índice ≥ 3 ; retornará uma string vazia.
O valor da primeira verificação é 0 e da segunda -1 .
A fatia começará a partir do índice -1 ; retornará apenas o último caractere.
A soma da lógica é que qualquer valor que ainda não apareceu será anexado por inteiro - a menos que seja um múltiplo de 111 ; nesse caso, apenas um caractere será acrescentado. Todos os outros valores serão ignorados.
Observe que a sequência produzida é diferente da sequência ideal produzida pela resposta de Peter Taylor .
História:
Resultado:
fonte
GolfScript (
35 3126 caracteres)Saída é
(1020 caracteres) Essa é uma variante da abordagem de concatenação de palavras de Lyndon: em vez de usar as palavras primitivas de 1 caractere, ele usa múltiplos de 111 para código mais curto, mas ocorrências repetidas desses números; e, em vez de usar elementos mínimos dos grupos de conjugação, ele usa elementos máximos, porque isso reduz os loops.
em 40 caracteres (provavelmente ainda pode ser aprimorado) gera uma string ideal, que tem 999 caracteres:
Tentar fazer isso reverter seqüências de caracteres tem problemas ao omitir os múltiplos de 111.
Para ver que 999 é o tamanho ideal (já que meus breves comentários acima não convencem todos), comece na sequência completa de De Bruijn que (tomada como uma sequência cíclica) contém todas as seqüências de 3 dígitos de caracteres de 0 a 9. Como existem 1000, deve ter pelo menos 1000 caracteres; que ele pode ter precisamente 1.000 caracteres é geralmente comprovado por uma caminhada euleriana em um gráfico cujos nós são sequências de dois dígitos
xy
com 10 arestas, cada uma rotulada com um dígitoz
, que levaxy
ayz
.Não precisamos de sequências começando
0
, portanto, dada uma sequência de Bruijn, podemos rotacionar para colocar000
no final. Então, não precisamos de nenhuma das seqüências que se resumem ao início, mas precisamos de dois0
para terminar a sequência começando com o dígito anterior000
, para que possamos excluir uma delas para obter uma sequência de 999 caracteres. Todo restante0
é usado em um número que não começa0
.fonte
10,:^{:x^>{x.@:&<+^>{x&@}/}/}/0.
variando que, para palavras verdadeiras de Lyndon, resulta10,:^{:x^>{x.@:&<+^>{.x>{x&@}*}/}/}%3>0.
(40 caracteres) a string ideal.GolfScript, 17 caracteres
Abordagem simples para adicionar cada número, se ainda não estiver presente na sequência (nota: 999 não está marcada ou adicionada, mas já está contida na saída).
A saída tem 1133 caracteres:
fonte
Não tenho nenhum código, mas achei que alguém poderia apreciar essa prova intuitiva de que 999 caracteres é o limite inferior ao comprimento da saída:
Primeiro, todos os números de 1 e 2 dígitos fazem parte de um número de 3 dígitos, portanto, ignore tudo menos que 100. 100-999 inclusive são 900 números de 3 dígitos.
A maneira mais ideal de resolver o problema é se cada personagem for usado o máximo possível. Isso significa que os números se sobrepõem o máximo possível, assim:
O primeiro número adicionará, portanto, 3 caracteres e cada número subsequente adicionará 1 caractere. Isso fornece 3 + 899 = 902 caracteres como um limite inferior.
No entanto, quando existe um zero, não podemos usá-lo para iniciar um novo número de 3 dígitos. Podemos reutilizá-lo no meio de outro número de 3 dígitos, desde que não seja seguido por outro zero:
Mas:
Portanto, cada zero que aparece na saída aumenta a saída em 1 caractere - exceto os dois últimos caracteres que podem ser zero, pois não se sobrepõem a nenhum número adicional:
Existem 81 números com estritamente um zero no meio (? 0?), 81 com estritamente um zero no final (?? 0) e 9 com dois zeros (? 00).
Cada número 0 pode compartilhar um zero com um 0? número ou um número? 00, mas não ambos. 0? e 00 nunca pode compartilhar zeros, portanto, deve haver pelo menos 81 + 9 * 2 zeros na saída.
Isso fornece um limite inferior de 3 + 899 + 81 + 9 * 2 - 2 = 999 caracteres.
Desculpas se isso for considerado fora de tópico, mas foi muito longo para caber em um comentário.
fonte
Perl,
37 34 3332 (11361132 caracteres)por $ @ (1..999) {$ _. = $ @ if! / $ @ /} printpor $ i (1..999) {$ _. = $ i se! / $ i /} printpara (1..1e3) {$ s. = $ _ se $ s! ~ / $ _ /} imprima $ sSaídas:
Corda mais curta:
38 3734 (1020 caracteres):para ($ @ = 1e3; $ @ -;) {$ _. = $ @ if! / $ @ /} printpara ($ i = 1e3; $ i -;) {$ _. = $ i se! / $ i /} printSaídas:
Ainda não está satisfeito com a duplicação, especialmente a 99999 no começo! Eu acho que muito mais verificações criariam muito mais código ...
Edit: Adicionado sugestão de @Peter Taylor
Editar 2: ótimas sugestões do @primo! Obrigado
fonte
$_.=$@if!/$@/
, você pode usar a repetição de cordas$_.=$@x!/$@/
. Ofor
pode ser substituído por umwhile
como um modificador de instrução, usando um módulo:...while$@=--$@%1e3
APL (20, saída: 1020)
Explicação:
{∨/⍺⍷⍵:⍵⋄⍵,⍺}
: if⍺
é uma substring de⍵
, return⍵
, else return⍵,⍺
/
: reduzir ao longo⍕¨
: a representação de cadeia de cada um dos⍳999
: os números inteiros de1
a999
.Resultado:
APL (41, saída: 999)
Explicação:
⌽⍕¨100+⍳898
:('999' '998' ... '101')
(na ordem inversa, porque a redução vai da direita para a esquerda no APL, ou sejaF/a b c ≡ a F (b F c)
)/
: reduzir⍵,⍺⍴⍨
: argumento da direita, seguido pelos primeirosN
caracteres do argumento da esquerda, ondeN
é:3×~∨/⍺⍷⍵
:3
se⍺
não for uma substring de⍵
, caso contrário0
(1=⍴∪⍺)
:1
se⍺
tiver apenas um caractere exclusivo, caso contrário0
∨
: maior divisor comum dos dois valores anteriores, portanto:1
se⍺
ainda não estiver dentro⍵
e tiver apenas um caractere único,3
se⍺
ainda não estiver dentro,⍵
mas tiver mais de um caractere exclusivo,0
caso contrário.'0',⍨
: adicione um zero ao final do resultadoResultado:
fonte
Ruby:
5046 caracteres (saída de 1020 caracteres)Exemplo de execução:
Execução de teste:
Ruby:
10297 caracteres (saída de 999 caracteres)Exemplo de execução:
Execução de teste:
fonte
(?0..?9*3).map{|i|$/[i]||($><<i;$/+=i)}
talvez?JavaScript, 39
Saída de 1020 caracteres:
Verificação:
for(i=0;i<1000;i++)console.assert(k.indexOf(i)>=0)
fonte
Mathematica (
6264 caracteres, saída 1002)Como isso faz uso de uma função nativa, aprecio ainda mais a beleza de soluções mais curtas do zero. A saída tem 1002 caracteres.
fonte
DeBruijnSequence
assume o agrupamento cíclico. O prefixo "79", os dois dígitos finais, resolve o problema.Mathematica, 51 caracteres
Saída (1155 caracteres):
fonte
{i, j, k}
ondei
é de 0 a 9 ej
,k
são menores do quei
. Em seguida, converte a lista em uma string.Python - 53
63., Saída 1134Esta é uma força bruta, mas é válida. Sim, ele tem um zero à esquerda, mas salva dois caracteres por não ter
range(1,1000)
.O exemplo acima gera um
DeprecationWarning
excesso de uso de 1e3 narange()
chamada, mas salva um caractere acima de 1000.Também há uma versão de saída de comprimento um pouco mais ideal, revertendo a corda ao custo de
65 caracteres (obrigado a res e filmor pelas dicas) :Python - saída 58, 1021
fonte
for i in range(999):s+=`i`*(not`i`in s)
range(999,99,-1)
vez derange(1000)[::-1]
.str(i)*(str(i)not in s)
é um pouco mais curto do quei=str(i);s+=[i,''][i in s]
;)1e3
em vez de1000
K, 33
Basicamente, o mesmo que a solução Howards - 1133 caracteres.
fonte
Java-
12698 caracteres (Java 6)Saída (1020 caracteres):
Pode alcançar um bom (de acordo com Peter Taylor , mas mais tarde ele disse que 999 era o ideal). Comprimento da corda adicionando alguns caracteres (+20 caracteres para
147118):Saída (1002 caracteres):
Edit : Obrigado ao Fabinout por apontar que o Java 6 pode salvar 28 caracteres.
fonte
public static void main(String[]a)
? (que iria mudar o meu código de...public static void main(String[]c){...
a...static{...
)Windows PowerShell - Saída 40, 1020
Resultado:
fonte
Haskell, 75 bytes - saída 1002
Uma abordagem de peneira que retorna uma solução mínima.
Observe que esta solução é impraticamente lenta.
fonte
Data.List
paraisInfixOf
, no entanto, você ainda pode economizar 2 bytes jogando-o um pouco mais: 1) Código rígidon = 1000
2) Useall
maisand
e uma versão sem sentido do predicado 3) use(!!0)
mais dehead
4) Use a compreensão da lista sobre a combinação demap
&filter
5) use(<$>)
overmap
:[s|s<-show<$>[1..],all((`isInfixOf`s).show)[1..1000]]!!0
Powershell, 36 bytes, saída 1020
Resultado:
Alternativa, 69 bytes, saída 1000
Resultado:
Alternativa,
8273 bytes, saída 999 (mínimo)Este é um algoritmo simplificado de Gerar o De Bruijn mais curto adaptado para constantes: alphabet =
9876543210
and length =3
Resultado:
Script de teste:
fonte
05AB1E , 9 bytes e 1109 caracteres
Saídas:
Experimente online ou verifique se contém todos os números abaixo de 1000 .
Explicação:
fonte
Pyke, 13 bytes (não-concorrente), comprimento da string 1133
Pyke é mais novo que o desafio e, portanto, não é competitivo.
Experimente aqui!
fonte
PHP,
4844 bytesObrigado a @primo por me lembrar
ereg
.ou
saída: 1020 caracteres. requer PHP <7
PHP 7, 48 bytes:
ereg
foi removido no PHP 7Se o segundo argumento para
strstr
(oustrpos
outras funções de pesquisa de string) não for uma string, ele será usado como um código ascii, portanto, será$i
necessário converter uma string em string.fonte
ereg($i,$s)
para 4 (eu também incluiria<?
na contagem de bytes).ereg
foi removido, presumivelmente, porque o nome da função é muito curto e / ou não contém sublinhados suficientes. Issosplit
também foi removido é especialmente brilhante.ereg
foi removido porque o POSIX contém apenas um subconjunto de possibilidades do PCRE; e eles provavelmente não queriam manter duas bibliotecas diferentes. Vou perguntar se devo encontrar Rasmus Lerdorf novamente.split
foi removido, masjoin
permaneceu (provavelmente porque é "apenas" um alias). Desculpe pela pediatria; mas conheço pessoas que não conseguem reconhecer a ironia.Groovy, 49 caracteres / bytes
Eu não tinha certeza se deveria fazer isso como uma função retornando uma variável de seqüência de caracteres ou imprimir o resultado, então isso apenas imprime no stdout. O uso do correspondente regex salvou 2 bytes, usando o operador ternário em vez de "se" salvou outro byte. A sequência de saída tem 1133 caracteres.
Resultado:
fonte
Linguagem do Game Maker, 1014 - String 1000
show_message(909910010110210310410510610710810911121131141151161171181191201221231241251261271281291301321331341351361371381391401421431441451461471481491501521531541551561571581591601621631641651661671681691701721731741751761771781791801821831841851861871881891901921931941951961971981992002022032042052062072082092223224225226227228229230233234235236237238239240243244245246247248249250253254255256257258259260263264265266267268269270273274275276277278279280283284285286287288289290293294295296297298299300303304305306307308309333433533633733833934034434534634734834935035435535635735835936036436536636736836937037437537637737837938038438538638738838939039439539639739839940040440540640740840944454464474484494504554564574584594604654664674684694704754764774784794804854864874884894904954964974984995005055065075085095556557558559560566567568569570576577578579580586587588589590596597598599600606607608609666766866967067767867968068768868969069769869970070770870977787797807887897907987998008088098889890899900)
Além disso:
Ruby, 1003 - String 1000
p'909910010110210310410510610710810911121131141151161171181191201221231241251261271281291301321331341351361371381391401421431441451461471481491501521531541551561571581591601621631641651661671681691701721731741751761771781791801821831841851861871881891901921931941951961971981992002022032042052062072082092223224225226227228229230233234235236237238239240243244245246247248249250253254255256257258259260263264265266267268269270273274275276277278279280283284285286287288289290293294295296297298299300303304305306307308309333433533633733833934034434534634734834935035435535635735835936036436536636736836937037437537637737837938038438538638738838939039439539639739839940040440540640740840944454464474484494504554564574584594604654664674684694704754764774784794804854864874884894904954964974984995005055065075085095556557558559560566567568569570576577578579580586587588589590596597598599600606607608609666766866967067767867968068768868969069769869970070770870977787797807887897907987998008088098889890899900'
fonte
ruby
código pode ser usado emp
vez deputs
passar o parâmetro numérico.