Objetivos: generar una cadena que contenga todos los enteros positivos estrictamente por debajo de 1000.
La respuesta obvia sería concatenar cada uno de ellos, y eso crearía una Cadena de 2890 caracteres (gracias al trabajo manual), para evitar este tipo de respuesta fácil, la longitud de la cadena debe ser inferior a 1500 caracteres. Aquí hay un código Java directo que genera una cadena 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;
}
}
¡El código más corto gana, punto de bonificación para la cadena más corta!
code-golf
string
kolmogorov-complexity
Fabinout
fuente
fuente
B(10, 3)
, pero debido a que no permite la envoltura cíclica, es necesario repetir los dos primeros caracteres.Respuestas:
Golfscript - 13 bytes, salida 1315
Lo anterior selecciona aquellos números del 0-990 cuyo primer dígito es el dígito más grande del número, es decir, el último dígito de la representación de cadena ordenada es lexicográficamente menor que la cadena en sí. La lógica es la siguiente:
Para un número de 3 dígitos abc , si a no es el dígito más grande del número, se omitirá el número, porque se cubrirá en uno de los dos casos más adelante:
b <c (por ejemplo, 123 )
Como c es el dígito más grande,no se omitiráel número de cabina . En este ejemplo, 312 no se omitirá, ni el siguiente valor 313 , que cuando se concatena ( 312 313 ) contiene 123 .
b ≥ c (por ejemplo, 132 )
Debido a que b es el dígito más grande, el número bca no se omitirá. En este ejemplo, 321 no se omitirá, ni el siguiente valor 322 , que cuando se concatena ( 321 322 ) contiene 132 . Si b = c (por ejemplo, 122 ), este caso también se aplica. El valor bca no se omitirá, como antes, y dado que a es necesariamente menor que b , bc <a + 1> tampoco se omitirá. En este ejemplo, 221 222 contiene 122 .
Debido a que el código anterior prueba el tercer dígito, en lugar de estrictamente el último, todos los valores de 0-99 se incluyen en el resultado. Sin embargo, se pueden omitir los valores del 1 al 99 , porque si cada secuencia de 3 dígitos está presente, entonces cada secuencia de 1 y 2 dígitos también debe estar presente.
Los valores de 991-999 también se pueden omitir, ya que se generan por ( 909 910 , 919 920 , ... 989 990 ).
Con 1315 bytes de salida, esto está cómodamente bajo la especificación del problema de menos de 1500.
Salida:
Variación # 1
14 bytes, salida 1233
Al seleccionar estrictamente el último dígito para la comparación, en lugar del tercero, se eliminan muchos de los valores innecesarios menores de 100 , acortando la cadena resultante.
Variación # 2
16 bytes, salida 1127
Al extraer todos los valores inferiores a 99 de antemano, la cadena resultante se puede acortar aún más.
Golfscript - 19 bytes, salida 1016
Lo anterior cuenta de 99 a 909 , agregando cualquier valor que aún no haya aparecido ( 909 normalmente sería el último valor agregado de esta manera). Mover 99 al frente es una optimización para evitar la necesidad de 910 en la parte posterior.
Salida:
Golfscript 26 bytes, salida 999
Tenga en cuenta que la cadena de 1016 caracteres producida por la solución anterior es casi óptima, excepto por tener dos dígitos adicionales para cada múltiplo de 111 (es decir, en
11111
lugar de111
, en22222
lugar de222
, etc.). La solución puede hacerse óptima eliminando estos dígitos adicionales (solo insertando un dígito en cada uno de estos valores, en lugar de tres), y girando909
hacia el frente, eliminando un9
(esto difiere de las versiones anteriores, que se movieron9100
hacia atrás en su lugar) )Desenrollado y comentado:
La lógica para elegir qué caracteres se agregan sigue tres casos:
El valor de la primera verificación es 1 , y de la segunda -1 .
El segmento comenzará a partir del índice 0 ; devolverá toda la cadena.
El valor de la primera verificación es 1 , y de la segunda algo ≥ 2 .
La rebanada comenzará a mirar desde el índice ≥ 3 ; devolverá una cadena vacía.
El valor de la primera verificación es 0 , y de la segunda -1 .
El segmento comenzará a partir del índice -1 ; solo devolverá el último carácter.
La suma de la lógica es que cualquier valor que aún no haya aparecido se agregará en su totalidad, a menos que sea un múltiplo de 111 , en cuyo caso solo se agregará un carácter. Todos los demás valores serán ignorados.
Tenga en cuenta que la cadena producida es diferente a la óptima producida por la respuesta de Peter Taylor .
Historia:
Salida:
fuente
GolfScript (
35 3126 caracteres)La salida es
(1020 caracteres) Esta es una variante en el enfoque de concatenación de palabras de Lyndon: en lugar de usar las palabras primitivas 1-char, usa múltiplos de 111 para códigos más cortos pero ocurrencias repetidas de esos números; y en lugar de usar elementos mínimos de los grupos de conjugación, usa elementos máximos, porque eso acorta los bucles.
a 40 caracteres (probablemente todavía se puede mejorar) genera una cadena óptima, que tiene una longitud de 999 caracteres:
Intentar hacer que esto haga cadenas inversas tiene problemas al omitir los múltiplos de 111.
Para ver que 999 es la longitud óptima (dado que mis breves comentarios anteriores no convencen a todos), comience desde la secuencia completa de Bruijn que (tomada como una cadena cíclica) contiene cada secuencia de caracteres de 3 dígitos del 0 al 9. Desde hay 1000 de ellos, debe tener al menos 1000 caracteres de longitud; que puede ser precisamente 1.000 caracteres de longitud está generalmente probadas por un pie euleriano en un gráfico cuyos nodos son secuencias de dos dígitos
xy
con 10 bordes, cada uno marcado con un dígitoz
, que tomanxy
ayz
.No necesitamos secuencias que comiencen
0
, por lo tanto, dada una secuencia de Bruijn, podemos rotar para poner000
al final. Entonces no necesitamos ninguna de las secuencias que se envuelven hasta el principio, pero sí necesitamos dos de las0
s para terminar la secuencia que comienza con el dígito anterior000
, por lo que podemos eliminar una de ellas para obtener una cadena de 999 caracteres. Todos los restantes0
se usan en un número que no comienza con0
.fuente
10,:^{:x^>{x.@:&<+^>{x&@}/}/}/0.
variando eso para las palabras verdaderas de Lyndon da10,:^{:x^>{x.@:&<+^>{.x>{x&@}*}/}/}%3>0.
(40 caracteres) para la cadena óptima.GolfScript, 17 caracteres
Enfoque simple para agregar cada número si aún no está presente en la cadena (nota: 999 no está marcado o agregado, pero ya está contenido en la salida).
La salida es de 1133 caracteres:
fuente
No tengo ningún código, pero pensé que alguien podría apreciar esta prueba intuitiva de que 999 caracteres es el límite inferior a la longitud de la salida:
Primero, cada número de 1 y 2 dígitos es parte de un número de 3 dígitos, así que ignore todo menos que 100. 100-999 inclusive son 900 números de 3 dígitos.
La forma más óptima de resolver el problema es si cada personaje se usa tanto como sea posible. Eso significa que los números se superponen tanto como sea posible, así:
Por lo tanto, el primer número agregará 3 caracteres, y cada número subsiguiente agregará 1 carácter. Eso da 3 + 899 = 902 caracteres como límite inferior.
Sin embargo, cuando hay un cero, no podemos usarlo para comenzar un nuevo número de 3 dígitos. Sin embargo, podemos reutilizarlo en medio de otro número de 3 dígitos, siempre que no sea seguido por otro cero:
Pero:
Por lo tanto, cada cero que aparece en la salida amplía la salida en 1 carácter, excepto los dos últimos caracteres que pueden ser cero ya que no se superponen con ningún número adicional:
Hay 81 números con estrictamente un cero en el medio (? 0?), 81 con estrictamente un cero al final (?? 0) y 9 con dos ceros (? 00).
Cada número ?? 0 puede compartir un cero con un? 0? número o un número? 00, pero no ambos. ? 0? y? 00 nunca puede compartir ceros, por lo que debe haber al menos 81 + 9 * 2 ceros en la salida.
Esto proporciona un límite inferior de 3 + 899 + 81 + 9 * 2 - 2 = 999 caracteres.
Disculpas si esto se considera fuera de tema, pero fue demasiado largo para caber en un comentario.
fuente
Perl
37 34 3332 (11361132 caracteres)para $ @ (1..999) {$ _. = $ @ if! / $ @ /} printpara $ i (1..999) {$ _. = $ i if! / $ i /} printfor (1..1e3) {$ s. = $ _ if $ s! ~ / $ _ /} print $ sSalidas:
Cadena más corta:
38 3734 (1020 caracteres):for ($ @ = 1e3; $ @ -;) {$ _. = $ @ if! / $ @ /} printfor ($ i = 1e3; $ i -;) {$ _. = $ i if! / $ i /} printSalidas:
¡Todavía no estoy contento con la duplicación, especialmente el 99999 al principio! Sin embargo, creo que muchas más comprobaciones crearían mucho más código ...
Editar: Sugerencia agregada de @Peter Taylor
Edición 2: ¡Algunas sugerencias geniales de @primo! Gracias
fuente
$_.=$@if!/$@/
, puede usar la repetición de cadena$_.=$@x!/$@/
. Elfor
puede ser reemplazado por awhile
como un modificador de declaración, usando un módulo:...while$@=--$@%1e3
APL (20, salida: 1020)
Explicación:
{∨/⍺⍷⍵:⍵⋄⍵,⍺}
: si⍺
es una subcadena de⍵
, return⍵
, else return⍵,⍺
/
: reducir más⍕¨
: la representación de cadena de cada uno de⍳999
: los enteros de1
a999
.Salida:
APL (41, salida: 999)
Explicación:
⌽⍕¨100+⍳898
:('999' '998' ... '101')
(en orden inverso, porque la reducción va de derecha a izquierda en APL, es decirF/a b c ≡ a F (b F c)
)/
: reducir⍵,⍺⍴⍨
: argumento derecho, seguido de los primerosN
caracteres del argumento izquierdo, dondeN
está:3×~∨/⍺⍷⍵
:3
si⍺
no es una subcadena de⍵
, de lo contrario0
(1=⍴∪⍺)
:1
si⍺
solo tiene un carácter único, de lo contrario0
∨
: máximo divisor común de los dos valores anteriores, por lo tanto:1
si aún⍺
no está dentro⍵
y solo tiene un carácter único,3
si⍺
no está ya dentro⍵
pero tiene más de un carácter único, de lo0
contrario.'0',⍨
: agrega un cero al final del resultadoSalida:
fuente
Ruby:
5046 caracteres (salida de 1020 caracteres)Ejecución de muestra:
Prueba de funcionamiento:
Ruby:
10297 caracteres (salida de 999 caracteres)Ejecución de muestra:
Prueba de funcionamiento:
fuente
(?0..?9*3).map{|i|$/[i]||($><<i;$/+=i)}
tal vez?JavaScript, 39
Salida de 1020 caracteres:
Verificación:
for(i=0;i<1000;i++)console.assert(k.indexOf(i)>=0)
fuente
Mathematica (
6264 caracteres, salida 1002)Como esto hace uso de una función nativa, aprecio aún más la belleza de las soluciones más cortas desde cero. La salida es de 1002 caracteres de largo.
fuente
DeBruijnSequence
asume envoltura cíclica. Anteponer "79", los dos últimos dígitos, resuelve el problema.Mathematica, 51 caracteres
Salida (1155 caracteres):
fuente
{i, j, k}
en quei
es de 0 a 9 yj
,k
son más pequeños quei
. Luego convierte la lista en una cadena.Python - 53
63, 1134 salidaEsto es bastante brutal, pero es válido. Sí, tiene un cero a la izquierda, pero ahorra dos caracteres al no tener
range(1,1000)
.Lo anterior arroja un
DeprecationWarning
sobre el uso de 1e3 en larange()
llamada, pero ahorra un personaje sobre el uso de 1000.También hay una versión de salida de longitud ligeramente más óptima, invirtiendo la cadena a costa de
6 65 personajes (gracias a res y filmor por los consejos) :Python - 58, salida 1021
fuente
for i in range(999):s+=`i`*(not`i`in s)
range(999,99,-1)
lugar derange(1000)[::-1]
.str(i)*(str(i)not in s)
es un poco más corta quei=str(i);s+=[i,''][i in s]
;)1e3
lugar de1000
K, 33
Básicamente lo mismo que la solución Howards - 1133 caracteres.
fuente
Java-
12698 caracteres (Java 6)Salida (1020 caracteres):
Puede alcanzar un buen (según Peter Taylor , pero luego dijo que 999 era óptimo) Longitud de la cadena al agregar algunos caracteres (+20 caracteres para
147118):Salida (1002 caracteres):
Editar : Gracias a Fabinout por señalar que Java 6 puede guardar 28 caracteres.
fuente
public static void main(String[]a)
? (eso cambiaría mi código de...public static void main(String[]c){...
a...static{...
)Windows PowerShell - 40, salida 1020
Salida:
fuente
Haskell, 75 bytes - salida 1002
Un enfoque de tamiz que devuelve una solución mínima.
Tenga en cuenta que esta solución es poco práctica.
fuente
Data.List
forisInfixOf
, sin embargo, aún puede guardar 2 bytes jugando un poco más: 1) Hardcoden = 1000
2) Useall
overand
y una versión sin puntos del predicado 3) use(!!0)
overhead
4) Use la comprensión de la lista sobre la combinación demap
&filter
5) usar(<$>)
sobremap
:[s|s<-show<$>[1..],all((`isInfixOf`s).show)[1..1000]]!!0
Powershell, 36 bytes, salida 1020
Salida:
Alternativa, 69 bytes, salida 1000
Salida:
Alternativa,
8273 bytes, salida 999 (mínimo)Este es un algoritmo simplificado de Generar el De Bruijn más corto adaptado para constantes: alfabeto =
9876543210
y longitud =3
Salida:
Script de prueba:
fuente
05AB1E , 9 bytes y 1109 caracteres
Salidas:
Pruébelo en línea o verifique que contiene todos los números por debajo de 1000 .
Explicación:
fuente
Pyke, 13 bytes (sin competencia), longitud de cadena 1133
Pyke es más nuevo que el desafío y, por lo tanto, no es competitivo.
Pruébalo aquí!
fuente
PHP,
4844 bytesGracias a @primo por recordármelo
ereg
.o
salida: 1020 caracteres. requiere PHP <7
PHP 7, 48 bytes:
ereg
ha sido eliminado en PHP 7Si el segundo argumento para
strstr
(ustrpos
otras funciones de búsqueda de cadenas) no es una cadena, se usará como un código ASCII, por lo que$i
necesita una conversión a cadena.fuente
ereg($i,$s)
para 4 (también incluiría<?
en el recuento de bytes).ereg
se eliminó, presumiblemente, porque el nombre de la función es demasiado corto y / o no contenía suficientes guiones bajos. Esosplit
también fue eliminado es especialmente brillante.ereg
se eliminó porque POSIX solo contiene un subconjunto de posibilidades de PCRE; y probablemente no quisieron mantener dos bibliotecas diferentes. Preguntaré si alguna vez vuelvo a encontrarme con Rasmus Lerdorf.split
ha sido eliminado, perojoin
permaneció (probablemente porque es "solo" un alias). Perdón por la pedantería; pero conozco personas que no pueden reconocer la ironía.Groovy, 49 caracteres / bytes
No estaba seguro de si hacer esto como una función que devuelve una variable de cadena o imprimir el resultado, por lo que esto solo lo imprime en stdout. El uso del comparador de expresiones regulares ahorró 2 bytes, el uso del operador ternario en lugar de "si" guardó otro byte. La cadena de salida tiene 1133 caracteres.
Salida:
fuente
Game Maker Language, 1014 - Cadena 1000
show_message(909910010110210310410510610710810911121131141151161171181191201221231241251261271281291301321331341351361371381391401421431441451461471481491501521531541551561571581591601621631641651661671681691701721731741751761771781791801821831841851861871881891901921931941951961971981992002022032042052062072082092223224225226227228229230233234235236237238239240243244245246247248249250253254255256257258259260263264265266267268269270273274275276277278279280283284285286287288289290293294295296297298299300303304305306307308309333433533633733833934034434534634734834935035435535635735835936036436536636736836937037437537637737837938038438538638738838939039439539639739839940040440540640740840944454464474484494504554564574584594604654664674684694704754764774784794804854864874884894904954964974984995005055065075085095556557558559560566567568569570576577578579580586587588589590596597598599600606607608609666766866967067767867968068768868969069769869970070770870977787797807887897907987998008088098889890899900)
También:
Ruby, 1003 - Cadena 1000
p'909910010110210310410510610710810911121131141151161171181191201221231241251261271281291301321331341351361371381391401421431441451461471481491501521531541551561571581591601621631641651661671681691701721731741751761771781791801821831841851861871881891901921931941951961971981992002022032042052062072082092223224225226227228229230233234235236237238239240243244245246247248249250253254255256257258259260263264265266267268269270273274275276277278279280283284285286287288289290293294295296297298299300303304305306307308309333433533633733833934034434534634734834935035435535635735835936036436536636736836937037437537637737837938038438538638738838939039439539639739839940040440540640740840944454464474484494504554564574584594604654664674684694704754764774784794804854864874884894904954964974984995005055065075085095556557558559560566567568569570576577578579580586587588589590596597598599600606607608609666766866967067767867968068768868969069769869970070770870977787797807887897907987998008088098889890899900'
fuente
ruby
código puede usar enp
lugar deputs
pasarle el parámetro numérico.