Objectifs: Produire une chaîne contenant chaque entier positif strictement inférieur à 1000.
La réponse évidente serait de les concaténer, ce qui créerait une chaîne de 2890 caractères (merci manatwork). Pour éviter ce genre de réponse facile, la longueur de la chaîne doit être inférieure à 1500 caractères. Voici un code Java simple qui génère une chaîne de 1 200 caractères.
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;
}
}
Code le plus court gagnant, point bonus pour la plus courte chaîne!
code-golf
string
kolmogorov-complexity
Fabinout
la source
la source
B(10, 3)
, mais comme vous n'autorisez pas le retour à la ligne cyclique, il est nécessaire de répéter les deux premiers caractères.Réponses:
Golfscript - 13 octets, 1315 sorties
Ce qui précède sélectionne les nombres de 0 à 990 dont le premier chiffre est le plus grand chiffre du nombre, c.-à- d. Que le dernier chiffre de la représentation de chaîne triée est inférieur lexicographiquement à la chaîne elle-même. La logique est la suivante:
Pour un numéro à 3 chiffres abc , si a n'est pas le chiffre le plus grand du nombre, le nombre peut être ignoré, car il sera couvert par l'un des deux cas suivants:
b <c (ex. 123 )
Comme c est le chiffre le plus élevé, le nombre de cabines ne sera pas ignoré. Dans cet exemple, 312 ne sera pas ignoré, pas plus que la valeur suivante 313 qui, une fois concaténée ( 312 313 ), contient 123 .
b ≥ c (par exemple 132 )
Puisque b est le chiffre le plus grand, le nombre bca ne sera pas ignoré. Dans cet exemple, 321 ne sera pas ignoré, pas plus que la valeur suivante 322 qui, une fois concaténée ( 321 322 ), contient 132 . Si b = c (par exemple 122 ), ce cas est également valable. La valeur bca ne sera pas ignorée, comme auparavant, et comme a est nécessairement inférieur à b , bc <a + 1> nesera pas ignoré non plus. Dans cet exemple, 221 222 contient 122 .
Parce que le code ci-dessus teste le troisième chiffre, plutôt que strictement le dernier, toutes les valeurs comprises entre 0 et 99 sont incluses dans le résultat. Toutefois, les valeurs de 1 à 99 peuvent être omises, car si chaque séquence de 3 chiffres est présente, toutes les séquences de 1 et 2 chiffres doivent également l'être.
Les valeurs de 991 à 999 peuvent également être ignorées, car elles sont générées par ( 909 910 , 919 920 , ... 989 990 ).
Avec une puissance de sortie de 1315 octets, cela correspond à la spécification du problème de moins de 1500.
Sortie:
Variation # 1
14 octets, 1233 sorties
En sélectionnant strictement le dernier chiffre à comparer, plutôt que le troisième, de nombreuses valeurs inutiles inférieures à 100 sont éliminées, ce qui raccourcit la chaîne résultante.
Variation n ° 2
16 octets, 1127 sorties
En enlevant au préalable toutes les valeurs inférieures à 99 , la chaîne résultante peut être raccourcie encore plus.
Golfscript - 19 octets, 1016 sorties
Ce qui précède compte de 99 à 909 , en ajoutant toute valeur qui n’est pas déjà apparue ( 909 serait normalement la dernière valeur ajoutée de cette manière). Déplacer 99 vers l’avant est une optimisation pour éviter d’avoir besoin du 910 à l’arrière.
Sortie:
Golfscript 26 octets, sortie 999
Notez que la chaîne de 1016 caractères générée par la solution précédente est presque optimale, sauf que vous devez avoir deux chiffres supplémentaires pour chaque multiple de 111 (c'est-
11111
à- dire au lieu de111
,22222
au lieu de222
, etc.). La solution peut être optimisée en supprimant ces chiffres supplémentaires (en insérant seulement un chiffre à chacune de ces valeurs, au lieu de trois), et en effectuant909
une rotation vers l'avant pour éliminer un9
(ce qui diffère des versions précédentes, qui se déplaçait9100
à l'arrière )Déroulé et commenté:
La logique de choix des caractères à ajouter suit trois cas:
La valeur de la première vérification est 1 et de la seconde -1 .
La tranche commencera à partir de l'index 0 ; il retournera la chaîne entière.
La valeur de la première vérification est 1 et de la seconde quelque chose ≥ 2 .
La tranche commencera à regarder à partir de l'indice ≥ 3 ; il retournera une chaîne vide.
La valeur de la première vérification est 0 et de la seconde -1 .
La tranche commencera à partir de l'index -1 ; il ne renverra que le dernier caractère.
La somme de la logique est que toute valeur qui n'est pas encore apparue sera ajoutée en entier, à moins qu'il ne s'agisse d'un multiple de 111 , auquel cas un seul caractère sera ajouté. Toutes les autres valeurs seront ignorées.
Notez que la chaîne produite est différente de la chaîne optimale produite par la réponse de Peter Taylor .
Histoire:
Sortie:
la source
GolfScript (
35 3126 caractères)La sortie est
(1020 caractères) Il s'agit d'une variante de la méthode de concaténation de mots de Lyndon: plutôt que d'utiliser les mots primitifs à 1 caractère, elle utilise des multiples de 111 pour un code plus court mais des occurrences répétées de ces nombres; et plutôt que d'utiliser des éléments minimaux des groupes de conjugaison, il utilise des éléments maximaux, car cela raccourcit les boucles.
à 40 caractères (peut encore probablement être amélioré) génère une chaîne optimale, d'une longueur de 999 caractères:
Essayer de faire cela en inversant les chaînes se heurte à des problèmes en omettant les multiples de 111.
Pour voir que 999 est la longueur optimale (puisque mes brefs commentaires ci-dessus ne convainquent pas tout le monde), commençons par la séquence complète de Bruijn qui (prise comme une chaîne cyclique) contient toutes les séquences de caractères à 3 chiffres de 0 à 9. il y en a 1000, il doit y avoir au moins 1000 caractères; Il est généralement prouvé par une marche eulérienne sur un graphe dont les nœuds sont des séquences
xy
à deux chiffres avec 10 arêtes, chacune étiquetée avec un chiffrez
, qui portexy
àyz
.Nous n'avons pas besoin de séquences commençant
0
, donc avec une séquence de Bruijn, nous pouvons effectuer une rotation pour mettre000
à la fin. Ensuite, nous n'avons besoin d'aucune des séquences qui se terminent au début, mais nous avons besoin de deux des0
s pour terminer la séquence en commençant par le chiffre précédent000
. Nous pouvons donc en supprimer une pour obtenir une chaîne de 999 caractères. Chaque reste0
est utilisé dans un nombre qui ne commence pas par0
.la source
10,:^{:x^>{x.@:&<+^>{x&@}/}/}/0.
Varier que pour les vrais mots Lyndon donne10,:^{:x^>{x.@:&<+^>{.x>{x&@}*}/}/}%3>0.
(40 caractères) la chaîne optimale.GolfScript, 17 caractères
Approche simple pour ajouter chaque nombre s'il n'est pas déjà présent dans la chaîne (note: 999 n'est ni coché ni ajouté, mais déjà contenu dans la sortie).
La sortie est 1133 caractères:
la source
Je n'ai pas de code, mais j'ai pensé que quelqu'un pourrait apprécier cette preuve intuitive que 999 caractères est la limite inférieure de la longueur de la sortie:
Tout d'abord, chaque numéro à 1 ou 2 chiffres fait partie d'un nombre à 3 chiffres, donc ignorez tout ce qui est inférieur à 100. 100 à 999 inclus est 900 numéros à 3 chiffres.
Le moyen le plus optimal de résoudre le problème consiste à utiliser chaque caractère autant que possible. Cela signifie que les chiffres se chevauchent autant que possible, comme ceci:
Le premier numéro ajoutera donc 3 caractères, et chaque numéro suivant ajoutera 1 caractère. Cela donne 3 + 899 = 902 caractères en tant que limite inférieure.
Cependant, lorsqu'il y a un zéro, nous ne pouvons pas l'utiliser pour créer un nouveau nombre à 3 chiffres. Nous pouvons le réutiliser au milieu d'un autre numéro à 3 chiffres, tant qu'il n'est pas suivi d'un autre zéro:
Mais:
Par conséquent, chaque zéro qui apparaît dans la sortie étend la sortie de 1 caractère - à l'exception des deux derniers caractères qui peuvent être zéro car ils ne chevauchent aucun autre nombre:
Il y a 81 nombres avec strictement un zéro au milieu (? 0?), 81 avec strictement un zéro à la fin (?? 0) et 9 avec deux zéros (? 00).
Chaque numéro ?? 0 peut partager un zéro avec un? 0? nombre ou un nombre? 00, mais pas les deux. ? 0? et? 00 ne peut jamais partager de zéros, il doit donc y avoir au moins 81 + 9 * 2 zéros dans la sortie.
Cela donne une limite inférieure de 3 + 899 + 81 + 9 * 2 - 2 = 999 caractères.
Toutes mes excuses si cela est considéré comme hors sujet, mais c'était trop long pour tenir dans un commentaire.
la source
Perl,
37 34 3332 (11361132 caractères)pour $ @ (1..999) {$ _. = $ @ if! / $ @ /} printpour $ i (1..999) {$ _. = $ i if! / $ i /} printpour (1..1e3) {$ s. = $ _ si $ s! ~ / $ _ /} print $ sLes sorties:
Chaîne plus courte:
38 3734 (1020 caractères):for ($ @ = 1e3; $ @ -;) {$ _. = $ @ if! / $ @ /} printpour ($ i = 1e3; $ i -;) {$ _. = $ i if! / $ i /} printLes sorties:
Toujours pas content de la duplication surtout le 99999 au début! Je pense que beaucoup plus de contrôles créeraient beaucoup plus de code si ...
Edit: Ajout de la suggestion de @Peter Taylor
Edit 2: Quelques bonnes suggestions de @primo! Merci
la source
$_.=$@if!/$@/
, vous pouvez utiliser la répétition de chaîne$_.=$@x!/$@/
. Lefor
peut être remplacé par unwhile
modificateur d'instruction, à l'aide d'un modulo:...while$@=--$@%1e3
APL (20, sortie: 1020)
Explication:
{∨/⍺⍷⍵:⍵⋄⍵,⍺}
: si⍺
est une sous-chaîne de⍵
, return⍵
, return return⍵,⍺
/
: réduire plus⍕¨
: la représentation sous forme de chaîne de chacun des⍳999
: les entiers de1
à999
.Sortie:
APL (41, sortie: 999)
Explication:
⌽⍕¨100+⍳898
:('999' '998' ... '101')
(dans l'ordre inverse, car la réduction va de droite à gauche dans APL, c'est-à-direF/a b c ≡ a F (b F c)
)/
: réduire⍵,⍺⍴⍨
: argument de droite, suivi des premiersN
caractères de l'argument de gauche, oùN
est:3×~∨/⍺⍷⍵
:3
si⍺
n'est pas une sous-chaîne de⍵
, sinon0
(1=⍴∪⍺)
:1
si⍺
seulement un caractère unique, sinon0
∨
: plus grand commun diviseur des deux valeurs précédentes, donc:1
si⍺
n'est pas déjà entré⍵
et n'a qu'un seul caractère,3
s'il⍺
n'est pas déjà⍵
mais a plus d'un caractère unique,0
sinon.'0',⍨
: ajoute un zéro à la fin du résultatSortie:
la source
Ruby:
5046 caractères (sortie de 1020 caractères)Échantillon échantillon:
Essai:
Ruby:
10297 caractères (sortie de 999 caractères)Échantillon échantillon:
Essai:
la source
(?0..?9*3).map{|i|$/[i]||($><<i;$/+=i)}
peut-être?JavaScript, 39
Sortie de 1020 caractères:
Vérification:
for(i=0;i<1000;i++)console.assert(k.indexOf(i)>=0)
la source
Mathematica (
6264 caractères, 1002 sorties)Parce que cela utilise une fonction native, j'apprécie d'autant plus la beauté des solutions plus courtes à partir de zéro. La sortie est longue de 1002 caractères.
la source
DeBruijnSequence
suppose un wrapping cyclique. Le préfixe "79", les deux derniers chiffres, résout le problème.Mathematica, 51 caractères
Sortie (1155 caractères):
la source
{i, j, k}
oùi
une valeur de 0 à 9 etj
,k
sont plus petites quei
. Ensuite, il convertit la liste en une chaîne.Python - 53
63, 1134 sortieC'est assez brutal, mais c'est valable. Oui, il a un zéro, mais il enregistre deux caractères en l’absence de
range(1,1000)
.Ce qui précède jette un
DeprecationWarning
sur l'utilisation de 1e3 dans l'range()
appel, mais enregistre un caractère sur 1000.Il existe également une version légèrement plus optimale de la longueur, en inversant la chaîne au prix de
65 personnages (merci à res et filmor pour les astuces) :Python - 58, 1021 sorties
la source
for i in range(999):s+=`i`*(not`i`in s)
range(999,99,-1)
place derange(1000)[::-1]
.str(i)*(str(i)not in s)
est un peu plus court quei=str(i);s+=[i,''][i in s]
;)1e3
au lieu de1000
K, 33
Fondamentalement identique à la solution Howards - 1133 caractères.
la source
Java -
12698 caractères (Java 6)Sortie (1020 caractères):
Peut atteindre une bonne longueur (selon Peter Taylor , mais plus tard il a dit que 999 était optimal) Longueur de la chaîne en ajoutant quelques caractères (+20 caractères pour
147118):Sortie (1002 caractères):
Edit : Merci à Fabinout pour avoir signalé que Java 6 peut enregistrer 28 caractères.
la source
public static void main(String[]a)
? (qui changerait mon code de...public static void main(String[]c){...
à...static{...
)Windows PowerShell - 40, sortie 1020
Sortie:
la source
Haskell, 75 octets - 1002 sorties
Une approche de tamis qui renvoie une solution minimale.
Notez que cette solution est peu pratique.
la source
Data.List
pourisInfixOf
, mais vous pouvez toujours enregistrer 2 octets par ce golf un peu plus: 1) hardcoden = 1000
2) Utilisationall
plusand
et une version Pointfree de l'utilisation prédicat 3)(!!0)
surhead
4) Utilisez la liste-compréhension sur la combinaison demap
&filter
5) utiliser(<$>)
surmap
:[s|s<-show<$>[1..],all((`isInfixOf`s).show)[1..1000]]!!0
Powershell, 36 octets, 1020 sorties
Sortie:
Alternative, 69 octets, 1000 sorties
Sortie:
Alternative,
8273 octets, 999 sorties (minimum)Ceci est un algorithme simplifié de Generate le plus court de De Bruijn adapté aux constantes: alphabet =
9876543210
et length =3
Sortie:
Script de test:
la source
05AB1E , 9 octets et 1109 caractères
Les sorties:
Essayez-le en ligne ou vérifiez qu'il contient tous les chiffres inférieurs à 1000 .
Explication:
la source
Pyke, 13 octets (sans compétition), longueur de chaîne 1133
Pyke est plus récent que le défi et est donc non compétitif.
Essayez-le ici!
la source
PHP,
4844 octetsMerci à @primo de me l'avoir rappelé
ereg
.ou
sortie: 1020 caractères. nécessite PHP <7
PHP 7, 48 octets:
ereg
a été supprimé en PHP 7Si le second argument de
strstr
(oustrpos
et d'autres fonctions de recherche de chaîne) n'est pas une chaîne, il sera utilisé comme code ASCII.$i
Un transtypage en chaîne est donc nécessaire.la source
ereg($i,$s)
pour 4 (je voudrais également inclure<?
dans le nombre d'octets).ereg
a probablement été supprimé, car le nom de la fonction est trop court et / ou ne contient pas assez de traits de soulignement. Celasplit
a également été supprimé est particulièrement brillant.ereg
a été supprimé car POSIX ne contient qu’un sous-ensemble des possibilités de PCRE; et ils ne voulaient probablement pas maintenir deux bibliothèques différentes. Je demanderai si je rencontre encore Rasmus Lerdorf.split
a été supprimé, maisjoin
est resté (probablement parce que c’est "seulement" un alias). Désolé pour le pédantisme; mais je connais des gens qui ne peuvent pas reconnaître l'ironie.Groovy, 49 caractères / octets
Je ne savais pas si cela deviendrait une fonction renvoyant une variable de chaîne ou imprimant le résultat. Elle est donc simplement imprimée sur stdout. En utilisant le matcher regex enregistré 2 octets, en utilisant l'opérateur ternaire au lieu de "si" a enregistré un autre octet. La chaîne de sortie contient 1133 caractères.
Sortie:
la source
Jeu Game Maker Language, 1014 - String 1000
show_message(909910010110210310410510610710810911121131141151161171181191201221231241251261271281291301321331341351361371381391401421431441451461471481491501521531541551561571581591601621631641651661671681691701721731741751761771781791801821831841851861871881891901921931941951961971981992002022032042052062072082092223224225226227228229230233234235236237238239240243244245246247248249250253254255256257258259260263264265266267268269270273274275276277278279280283284285286287288289290293294295296297298299300303304305306307308309333433533633733833934034434534634734834935035435535635735835936036436536636736836937037437537637737837938038438538638738838939039439539639739839940040440540640740840944454464474484494504554564574584594604654664674684694704754764774784794804854864874884894904954964974984995005055065075085095556557558559560566567568569570576577578579580586587588589590596597598599600606607608609666766866967067767867968068768868969069769869970070770870977787797807887897907987998008088098889890899900)
Également:
Ruby, 1003 - Corde 1000
p'909910010110210310410510610710810911121131141151161171181191201221231241251261271281291301321331341351361371381391401421431441451461471481491501521531541551561571581591601621631641651661671681691701721731741751761771781791801821831841851861871881891901921931941951961971981992002022032042052062072082092223224225226227228229230233234235236237238239240243244245246247248249250253254255256257258259260263264265266267268269270273274275276277278279280283284285286287288289290293294295296297298299300303304305306307308309333433533633733833934034434534634734834935035435535635735835936036436536636736836937037437537637737837938038438538638738838939039439539639739839940040440540640740840944454464474484494504554564574584594604654664674684694704754764774784794804854864874884894904954964974984995005055065075085095556557558559560566567568569570576577578579580586587588589590596597598599600606607608609666766866967067767867968068768868969069769869970070770870977787797807887897907987998008088098889890899900'
la source
ruby
code peut utiliserp
au lieu de luiputs
transmettre le paramètre numérique.