Imprimer tous les nombres de -100 à 100 contenant un chiffre donné


38

Si un chiffre est compris entre 0 et 9 (inclus), votre fonction / sous-routine doit imprimer tous les nombres compris entre -100 et 100 (inclus) contenant le chiffre indiqué.

Par exemple:

Input: 9
Output: -99 -98 -97 -96 -95 -94 -93 -92 -91 -90 -89 -79 -69 -59 -49 -39 -29 -19 -9 9 19 29 39 49 59 69 79 89 90 91 92 93 94 95 96 97 98 99

Règles:

  • Vous ne pouvez pas utiliser de chaînes (de quelque manière qu'elles soient représentées dans la langue de votre choix) ni de tableaux de caractères. (Sauf pour imprimer la réponse sur la console.)
  • Vous ne pouvez pas utiliser de tableaux.

Notation:

Score = longueur du sous-programme / fonction (les espaces ne seront pas comptés)

La réponse avec le score le plus bas gagne.

Les espaces ne seront PAS comptés. Veuillez formater votre code correctement!

Certaines réponses utilisent des expressions régulières, qui peuvent enfreindre la règle du non-chaines, comme l'ont souligné certains membres. Ces réponses ne seront pas acceptées.

Veuillez tester votre code 0avant de poster.


2
La sortie donnée est soit incorrecte, soit incertaine. Où sont -98 ... -91 et 91 ... 98?
Oberon

27
Une réponse à un espace blanc donnera un score de 0. Êtes-vous sûr de vouloir faire cela?
pastebin.com slash 0mr8spkT

3
L'utilisation de regex est-elle autorisée? Travailler avec regex signifie travailler avec des chaînes. De même, travailler avec des listes / collections (et des structures similaires) revient à travailler avec des tableaux. La réponse de @wallywest utilise ici regex. C'est la chose que je n'aime pas des questions quand ils essaient d'interdire l'utilisation de chaînes et / ou de tableaux. Les gens trouvent d'autres moyens de les utiliser. Et si une réponse est réellement mise en œuvre correctement, elle n'obtient pas autant de votes qu'elle devrait l'être simplement parce que cela semble compliqué.
Microbian

2
"Les espaces ne seront PAS comptés. Veuillez formater votre code correctement!" Ce n’est pas un bon moyen de le faire, car les espaces dans différentes langues ont une signification différente. Le plus souvent, c’est juste "poster une version non-lue / lisible aussi".
Bob

2
@ace j'ai créé une réponse en blanc (il a fallu 4 heures de travail acharné avec cela). Je pense que ça marque zéro, non?
Victor Stafusa

Réponses:


75

Espace blanc, 834 caractères (0 si vous soustrayez des espaces)

Utilisé cet interprète pour le tester.

Cela m'a pris environ 4 heures de travail acharné et de débogage horrible à créer. Mais c'est fait!

   	    	 
   	    	 
	
	    	    	 
			   		    
	  			    	    		
  			   		
		    	     	
   
		    	    	 
			
	  	  	 		
   	    	 
			   	
	  	
	  	  	 		

   	   	  
   	    		
			 
    		  	  
	  	
	  	   	 	
 
   		
	  

		 	   			
  		
	  

   	   			
 
    	    	 
			
	  	  	   
   	 	 
	 	    	    	 
				  	
	  	  	  	

   	  	   
   	 	 
	 		   	    	 
				  	
	  	  	  	

 
 	  	 	 

   	  	  	
   	     	
			
	  	   		 
   	     
	
  
   	   		 
   	     	
   	
		    	    		
				
 	
   	  	 	 
   	    		
   	    		
			   	
	   		 
 
 	   	  

   	   	 	
   	    	 
			
	  	  		  
   	    	 
			   	
	  	
	  	  		  




   	  	 		
  			  	  
	
 	   	     
	
  
 
 	   	  

   	  		  
   	     
	
     		  	  
	
 	


EDIT : Texte sélectionnable fourni avec des astuces HTML. Si vous le copiez et le collez d’ici à un autre endroit, vérifiez si vous avez exactement [space][tab][linefeed][linefeed][linefeed]100 ou 101 lignes à la fin (selon que votre éditeur compte ou non une nouvelle ligne si la dernière se termine par un saut de ligne).

Dans le cas où vous ne pouvez pas l’utiliser de cette façon, en considérant l’espace en tant que S, le saut de ligne en tant que Let la tabulation en tant que T, et les lignes de séparation après le L, vous le trouverez ici:

SSSTSSSSTSL
SSSTSSSSTSL
TL
TSSSSTSSSSTSL
TTTSSSTTSSSSL
TSSTTTSSSSTSSSSTTL
SSTTTSSSTTL
TTSSSSTSSSSSTL
SSSL
TTSSSSTSSSSTSL
TTTL
TSSTSSTSTTL
SSSTSSSSTSL
TTTSSSTL
TSSTL
TSSTSSTSTTL
L
SSSTSSSTSSL
SSSTSSSSTTL
TTTSL
SSSSTTSSTSSL
TSSTL
TSSTSSSTSTL
SL
SSSTTL
TSSL
L
TTSTSSSTTTL
SSTTL
TSSL
L
SSSTSSSTTTL
SL
SSSSTSSSSTSL
TTTL
TSSTSSTSSSL
SSSTSTSL
TSTSSSSTSSSSTSL
TTTTSSTL
TSSTSSTSSTL
L
SSSTSSTSSSL
SSSTSTSL
TSTTSSSTSSSSTSL
TTTTSSTL
TSSTSSTSSTL
L
SL
STSSTSTSL
L
SSSTSSTSSTL
SSSTSSSSSTL
TTTL
TSSTSSSTTSL
SSSTSSSSSL
TL
SSL
SSSTSSSTTSL
SSSTSSSSSTL
SSSTL
TTSSSSTSSSSTTL
TTTTL
STL
SSSTSSTSTSL
SSSTSSSSTTL
SSSTSSSSTTL
TTTSSSTL
TSSSTTSL
SL
STSSSTSSL
L
SSSTSSSTSTL
SSSTSSSSTSL
TTTL
TSSTSSTTSSL
SSSTSSSSTSL
TTTSSSTL
TSSTL
TSSTSSTTSSL
L
L
L
L
SSSTSSTSTTL
SSTTTSSTSSL
TL
STSSSTSSSSSL
TL
SSL
SL
STSSSTSSL
L
SSSTSSTTSSL
SSSTSSSSSL
TL
SSSSSTTSSTSSL
TL
STL
L
L

32
+1 exploitant "0 si vous soustrayez des espaces"
Jwosty

12
Haha, j'ai appris une leçon. : P
duci9y

2
@Cruncher Le langage est bien défini et totalement sans ambiguïté . Pour votre question particulière: un nombre est une série d'espaces et de tabulations représentant le nombre en binaire (espace = 0, tab = 1, format binaire big-endian) et se termine par un retour à la ligne. Vous savez donc qu'un numéro se termine lorsque vous atteignez une nouvelle ligne.
Tim S.

1
J'ai appris les espaces blancs aujourd'hui. codegolf.stackexchange.com/a/23216/17886
duci9y

7
J'interprète "Les espaces ne seront PAS comptés". pour signifier cette réponse est invalide. ;) +1
Tim Seguine

24

Bash + utils - 20

seq -100 100|grep 9

Ou 21 octets si dans un script

seq -100 100|grep $1

Pour exécuter le script:

sh myscript 9

4
grepn'est pas bashou sh. C'est un autre utilitaire!
devnull

je suis d'accord, ce n'est pas pur shell / bash :)
Nik O'Lai

1
Voit la question. Donne la réponse à l'esprit. Voit exactement la même réponse déjà postée. Zut! +1
Le gars avec le chapeau

6
Je pense que cela utilise des chaînes.
David Conrad

1
@ DavidConrad Si vous le regardez de cette façon, tout utilise des chaînes. La source du programme est une chaîne. Le terminal utilise des chaînes. Etc.
Colonel Trente Deux

9

JavaScript 133 - 1 = 132

Il n’ya sûrement pas de problème avec cette version maintenant…?

for(k=prompt(),c=console,j=-100;100>=j;j++)if(i=j,0==j&j==k)c.log(0);else for(;i;)if(h=i%10,h=0>h?-h:h,i=i/10|0,h==k){c.log(j);break}

PROMPT: 2
CONSOLE.LOG:
-92
-82
-72
-62
-52
-42
-32
-29
-28
-27
-26
-25
-24
-23
-22
-21
-20
-12
-2
 2
 12
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 32
 42
 52
 62
 72
 82
 92

CONTROL, using zero
PROMPT: 0
CONSOLE.LOG:
    -100
    -90
    -80
    -70
    -60
    -50
    -40
    -30
    -20
    -10
      0
     10
     20
     30
     40
     50
     60
     70
     80
     90
    100

1
Même un peu plus court: for(i=-100,r=prompt();101>i;i++)(i+'').match(r)&&console.log(i).
VisioN

2
J'aime cette réponse (+1), mais n'utilise-t-elle pas implicitement des chaînes?
Pas que Charles

2
cela utilise une conversion de chaîne implicite
Claudiu

1
En réalité, ce n'est pas le cas ... alert(RegExp(9).test(99))qui repose uniquement sur des chiffres et qui est également renvoyé en trueraison du système de frappe mal conçu de JavaScript. Les fonctions fonctionnent avec les nombres comme si elles étaient des chaînes mais restaient des nombres ... Si vous modifiez le code pour le lire r=RegExp(x=+prompt());for(i=-100;101>i;i++)r.test(i)&&console.log(i);console.log(typeof(x));console.log(typeof(i))et l'exécuter, le type final de réponse s'affichera xet, isous forme de nombres ... Ergo, je n'utilise pas de chaînes. ...
WallyWest

2
L'impression @VoronoiPotato est également une opération à chaîne. Mais nous sommes évidemment obligés de le faire.
Tim Seguine


6

Ruby: 92 caractères

s=gets.to_i
$><<(-100..100).select{|n|a=n.abs;loop{break""if a%10==s;break if 0==a/=10}}*" "

Version lisible:

searchfor = gets.to_i
$><< (-100..100).select { |number|
  absnumber = number.abs
  loop {
    break "" if absnumber % 10 ==s
    break if 0 == absnumber /= 10
  }
} * " "

Échantillon échantillon:

bash-4.2$ ruby -e 's=gets.to_i;$><<(-100..100).select{|n|a=n.abs;loop{break""if a%10==s;break if 0==a/=10}}*" "' <<< 9
-99 -98 -97 -96 -95 -94 -93 -92 -91 -90 -89 -79 -69 -59 -49 -39 -29 -19 -9 9 19 29 39 49 59 69 79 89 90 91 92 93 94 95 96 97 98 99

Essai:

bash-4.2$ for i in {0..9}; do diff -w <(ruby -e 's=gets.to_i;$><<(-100..100).select{|n|a=n.abs;loop{break""if a%10==s;break if 0==a/=10}}*" "' <<< $i) <(seq -100 100|grep $i|tr \\n \ ) > /dev/null; echo "$i : $?"; done
0 : 0
1 : 0
2 : 0
3 : 0
4 : 0
5 : 0
6 : 0
7 : 0
8 : 0
9 : 0

Échoue le 0test.
duci9y

Oops. Tu as raison, @ duci9y. Corrigée.
Manatwork

6

K - 45 caractères

Ne remportant aucun prix, mais K golf est sous-représenté. K n'obtient pas plus joli avec un espacement correct, je vais donc laisser cela comme cela, car K devient très difficile en ce qui concerne les espaces qui sont importants et ceux qui ne le sont pas.

{|a@&x _in'@[10_vs'_ _abs a:100-!201;100;0,]}

A expliqué:

  • a:100-!201- Faites une liste de 0 à 200 inclus, puis soustrayez-la de 100. Nous avons maintenant les nombres de -100 à 100 inclus, mais à l'envers des spécifications de la question. Nous pouvons toujours résoudre ce problème plus tard, donc pour le moment, nous allons simplement attribuer cela à a.
  • _ _abs - Prenez la parole sur la valeur absolue de ces nombres, car pour une raison quelconque K pense que _abs devrait donner des résultats en virgule flottante. Heureusement, les revêtements de sol les transforme en nombres entiers.
  • 10_vs'- Développer chaque 'nombre entier ( ) en un nombre de base 10 ( _vssignifie "vecteur de scalaire"). Notez que nous n'avons pas eu à utiliser l'opérateur Each 'sur les fonctions ci-dessus car elles fonctionnent sur des atomes.
  • @[...;100;0,]- Modifiez l’item de notre liste à l’indice 100 (une liste vide, résultat de l’extension de 0 en base 10) par la fonction 0,, qui ajoute un zéro au premier plan. Sans cette correction, cette fonction échouera sur l'entrée 0.
  • &x in'- Maintenant, retourne les index ( &) où xest un chiffre entre ( _in) chaque (' des développements que nous avons si soigneusement construits ci-dessus.
  • |a@- Enfin, utilisez ces index pour indexer aet inverser la liste dans le bon ordre.

L'utilisation est évidente, mais bonne chance pour mettre la main sur un interprète K. ( Vous pouvez compiler une implémentation open source sur Github .)

  {|a@&x _in'@[10_vs'_ _abs a:100-!201;100;0,]} 0
-100 -90 -80 -70 -60 -50 -40 -30 -20 -10 0 10 20 30 40 50 60 70 80 90 100
  {|a@&x _in'@[10_vs'_ _abs a:100-!201;100;0,]} 5
-95 -85 -75 -65 -59 -58 -57 -56 -55 -54 -53 -52 -51 -50 -45 -35 -25 -15 -5 5 15 25 35 45 50 51 52 53 54 55 56 57 58 59 65 75 85 95

Je me demande si les langues comme K ont des utilisations productives en dehors de scénarios comme celui-ci. Est-ce qu'ils?
duci9y

2
@ duci9y En fait, K en particulier s'est trouvé un marché de niche à Wall Street traitant des transactions à grande vitesse et à volume élevé, en utilisant son logiciel de base de données natif KDB. Le proche parent J trouve également une utilisation, bien que davantage dans des contextes d'entreprise et académiques.
algorithmshark

C'est génial! J'étais convaincu que les langues ésotériques sont juste pour le plaisir. C'est bien de voir que ce n'est pas le cas.
duci9y

La description ne dit-elle pas "Vous ne pouvez pas utiliser de tableaux"?
Omar

6

frapper 55 49 caractères:

(sans compter les espaces blancs autour &&)

for i in {-100..100}
do
  [[ $i =~ $1 ]] && echo $i
done

L'exécutant en disant:

bash filename 9

produirait:

-99
-98
-97
-96
-95
-94
-93
-92
-91
-90
-89
-79
-69
-59
-49
-39
-29
-19
-9
9
19
29
39
49
59
69
79
89
90
91
92
93
94
95
96
97
98
99

Vous pouvez remplacer "&&" par "&&" pour deux points supplémentaires. De plus, je compte un caractère en moins si je supprime la nouvelle ligne.
Trauma numérique

1
Grattez cela - je viens de voir la nouvelle règle: "EDIT: les espaces ne seront PAS comptés. Veuillez formater votre code correctement!" . Donc, je suppose que vous venez de compter tous les caractères non-blancs?
Digital Trauma

Ensuite, vous pouvez convertir le ;s en nouvelles lignes et gagner 2 points.
joeytwiddle

4

PHP 67 octets:

for($i=-100;$i<101;++$i)if(strpos($i,$_GET[n])!==!1)echo$i,PHP_EOL;

Oui, il y a un appel «strpos», mais je n'utilise que des chiffres!

Voici une version "non-golfée":

for($i=-100;$i<101;++$i)
{
    if(strpos($i,$_GET[n])!==false)
    {
        echo $i,PHP_EOL;
    }
}

Pour que cela fonctionne, vous pouvez le tester ici: http://writecodeonline.com/php/

Rappelez-vous juste d'ajouter $_GET[n]='<number>';au début du code.

Ou, sur un serveur lamp ou xampp, vous pouvez créer une page puis y accéder sur le navigateur, avec le paramètre ?n=<number>après le nom du fichier.


1
Cela ressemble à une conversion de chaîne implicite, en violation de la règle sans chaîne.
VoronoiPotato

Ce n'est pas ma faute. Je n'ai pas fait la langue. J'ai utilisé ce que j'ai. De plus, la conversion est faite en interne. Il n'y a rien dans le code traitant des chaînes (sauf la sortie).
Ismael Miguel

À la façon dont j'ai lu la règle, vous devez traiter les chiffres de manière arithmétique. Les traiter comme des chaînes, que ce soit par vous, par la langue ou par la bibliothèque, est interdit. Mais presque tout le monde contourne la règle de la même manière.
David Conrad

Eh bien, tout le monde veut le faire le plus petit chemin possible. Et le plus petit traite les nombres comme des chaînes (en interne sans conversion implicite en chaîne dans le code).
Ismael Miguel

4

Mathematica 28

Désolé, je n'ai pas pu résister.

:)

Les instructions sont les suivantes: "Si un chiffre est compris entre 0 et 9 (inclus), votre fonction / sous-routine doit imprimer tous les nombres compris entre -100 et 100 (inclus) contenant le chiffre donné."


Ce qui suit imprime tous ces numéros dans l’ordre.

f@n_ :=Print/@Range[-100,100]

En prime, il imprime les nombres de la même plage qui ne contiennent pas le chiffre indiqué. :)


Mais cela ne pas utiliser n comme filtre
Murta

@Marta, oui, j'ai subverti l'intention du puzzle (c'est pourquoi j'ai dit "Désolé"), tout en fournissant techniquement une réponse appropriée.
DavidC

4

Ma première tentative ici, alors peut-être que je fais quelque chose de mal, veuillez l'excuser;)
Donc, je n'étais pas sûr de devoir ajouter toute la classe ou seulement la logique à l'intérieur.

Java - 199 caractères

intx=System.in.read()-48;for(inti=-100;i<101;i++){if((i<10&&i==-x)||(i>-10&&i==x)||(i<-9&&((i/100==x&&i<-99)||i%10==-x||i/10==-x))||(i>9&&((i/100==x&&i>99)||i%10==x||i/10==x)))System.out.println(i);}

Voici un formulaire plus lisible:

int x = System.in.read() - 48;
for(int i = -100; i < 101; i++) {

    if((i < 10 && i == -x) || (i > -10 && i == x)
        || (i < -9 && ((i / 100 == x && i < -99 ) || i % 10 == -x || i / 10 == -x))
        || (i > 9 && ((i / 100 == x && i > 99) || i % 10 == x || i / 10 == x)))

        System.out.println(i);

}

Je suppose que l’idée de base n’était pas si mauvaise, mais qu’elle nécessitait trop d’exceptions pour enfin convenir à tous les cas ...: /


Désolé, ne fonctionne pas avec 0:(
duci9y

Aw, bien sûr, le dernier ajout que j'ai fait a tout gâché. Code mis à jour, donc je suis à 199 maintenant. Merci d'avoir fait remarquer cela!
Jochen Reinschlüssel

Je ne savais pas que: D Trop de codage en langue maternelle ces derniers jours, je suppose;)
Jochen Reinschlüssel

Vous avez supprimé chaque espace de votre version compactée ... cela ne causerait-il pas une erreur? Exemple: Vos 4 premiers caractères: intx... ne devrait-il pas être int x:?
SirPython

4

C - 104 107 114 caractères - 0 = 104 107 114

a,b;main(i){i=getchar()-48;for(a=-100;a<101;a++){for(b=a;a&&abs(a%10)!=i;a/=10);if(a|!i&!b)printf("%i ",b);a=b;}}

Ungolfed:

#include <stdio.h>

int a, b;

int main(int i) {
    i = getchar() - '0';
    for( a = -100 ; a < 101 ; a++ ) {
        for( b = a ; a && abs(a % 10) != i ; a /= 10 );
        if( a | !i & !b )
            printf("%i ", b);
        a = b;
    }
}

Agréable. Pourriez-vous également publier une version non-lue avec les espaces appropriés, s'il vous plaît?
duci9y

@ duci9y l'a ajouté.
Oberon

Cela ne produira-t-il pas les résultats hors d'usage? (Spec a été mis à jour pour indiquer que l'ordre est important.)
Gaffi

@ Gaffi Bien alors. Je vais éditer le code.
Oberon

4
Ne réussit pas à remarquer que 0contient 0.
Ugoren

3

R 87 93

Voici une amélioration:

a=scan();r=-100:100;s=abs(r);r[(!a&!r%%10)|a&(a==s%%10|a==floor(s/10)|a==floor(s/100))]

(Potentiellement) Plus lisible, avec des notes:

a=scan() # take user input of selected digit
r=-100:100 # define our scanning range
s=abs(r) # copy the range as the absolute value for proper floor() calculation
#r[<criteria>] is functionally the same as subset(r,<criteria>)
r[ # when any of the criteria below are met, use that value from the range
    (!a & !r%%10) # case when input is 0, !a is evaluated as "a when a<>0 == true"
    | a & # all other digits below
    a==s%%10
    |
    a==floor(s/10)
    |
    a==floor(s/100)
    ] # R does not require a print command, so this as-is will display the corresponding values

Pourquoi pas d'espaces?
duci9y

@ duci9y Parce que rien n'est nécessaire. Je vais formater pour être plus lisible et ajouter cela aussi, juste pour faire bonne mesure.
Gaffi

Ne travaille pas avec 0.
duci9y

@ duci9y Cela ne manque pas. J'ai fait une petite modification de la publication d'origine (+2 caractères), car la publication d'origine a échoué 0. Avez-vous essayé avec cette version la plus récente? J'utilise R 3.0.1.
Gaffi

@ duci9y Pour être clair, je voulais dire avez-vous utilisé cela dans la version la plus récente de mon code . Ma version de R devrait être assez proche de la version la plus récente pour ne pas avoir d’importance. Cependant, je n'ai pas testé du tout sur les versions 2. *.
Gaffi

3

Prolog: 75

f(D) :-
  between(-100,100,N) ,
  number_chars(N,Ds) ,
  member(D,Ds) ,
  writeln(N) ,
  fail
  .

Comment ça s'appelle? Je l'ai sauvegardé dans un test.plfichier, commencé swipl, entré consult('test')puis entré f(9). Mais cela ne fait que revenir false.
Martin Thoma

3

C réponse en 98 caractères

C'est l'une des choses les plus sexy que j'ai jamais codé

main()
{
    int t=getchar()-48,i=100,j=-i;
    while ((i=t-i%10?i/10:!printf("%d\n",j)) || (i=++j<0?-j:j)<101  );
}

L'ancienne version, avec 104 caractères non blancs:

int main()
{
    int t=getchar()-48,i,j=-101;
    while(++j<101)
    {
        i=j<0?-j:j;
        while(i = t-i%10?i/10:!printf("%d\n",j));
    }
}

"Fonctionne pour moi" en utilisant GCC et CLANG.


Impressionnant! Bienvenue chez Code Golf.
duci9y

2

GNU coreutils (44)

read N
seq -100 100 | grep $N | tr '\n' ' '
echo

trest utilisé pour convertir les nouvelles lignes en espaces et echofournit une dernière ligne.

$ bash ./script
9
-99 -98 -97 -96 -95 -94 -93 -92 -91 -90 -89 -79 -69 -59 -49 -39 -29 -19 -9 9 19 29 39 49 59 69 79 89 90 91 92 93 94 95 96 97 98 99

Ce n'est pas très différent d'une réponse existante .
devnull

2

Javascript 116

   a = 0
        for(i=-100;101>i;i++){
        m=Math
        f=m.floor
        j = m.abs(i)
        if((j>10&&f(j/10)==a)||j-f(j/10)*10==a||j/100==a){

             console.log(i)

        }
        }

2

J - 27 chars

All whitespace is safely removable, meaning 27 characters. Negative numbers in output will have _ for a negative sign: this is just the way J writes its negative numbers.

((e. 10 #.^:_1 |)"0 # ]) & (i: 100)

Explained:

  • V & (i: 100) - Bind (&) the set of numbers from -100 to 100 inclusive (i:100) as the right argument of the main verb (V). The single argument of the entire verb gets piped into the left side.
  • (U"0 # ]) - Use the result of the verb U over each number from the right argument ("0) to select (#) items from the right argument (]).
  • (e. 10 #.^:_1 |) - Given the digit to test for as the left argument and the number to check as the right argument, expand in base 10 (10 #.^:_1) the absolute value of the number (|), and check if the digit is an element of that expansion (e.).

Usage:

   ((e. 10 #.^:_1 |)"0 # ]) & (i: 100) 0
_100 _90 _80 _70 _60 _50 _40 _30 _20 _10 0 10 20 30 40 50 60 70 80 90 100
   ((e. 10 #.^:_1 |)"0 # ]) & (i: 100) 5
_95 _85 _75 _65 _59 _58 _57 _56 _55 _54 _53 _52 _51 _50 _45 _35 _25 _15 _5 5 15 25 35 45 50 51 52 53 54 55 56 57 58 59 65 75 85 95

The underscore-for-negative convention in J always bothered me -- it wouldn't be so bad if it used a minus symbol in output (without messing with the format verb).
Desty

The underscore is J's unambiguous (and, I would argue, elegant and APLish) way of differentiating negative signs from the verb - Negate/Minus. K lets you use the negative sign "naturally" in numbers, and incidentally K came out an arcane syntactic clusterfuck. If it's really irking you, work in your choice of ;8!:1, '4.0'8!:2, or '-'I.@:=&'_'}":, costing 7, 11, and 16 chars respectively to make the resulting program a function instead of an expression, by my count.
algorithmshark

I know what it is, but it's a bit bothersome all the same when it comes to I/O. It'd be nicer if it produced minus signs by default when printing numbers, rather than printing underscores presumably in case someone wanted to eval the resulting string.
Desty

2

Groovy, 127

def x = args[0].toInteger()
for (k in -100..100)
    if (k == x)
        print " ${k}"
    else
        for (n = Math.abs(k); n > 0; n = (int) n / 10)
            if (n % 10 == x) {
                print " ${k}"
                break
            }

No strings (except to output the spaces between the numbers), no char arrays or other arrays, no regexes. Tested with 0. Output:

-100 -90 -80 -70 -60 -50 -40 -30 -20 -10 0 10 20 30 40 50 60 70 80 90 100


1
And I discovered a new language today. :)
duci9y

2

Javascript - 108

Not sure if existing javascript answer will be taken into consideration because it uses regex, so I created one without it:

for(x=+prompt(i=-100);i<101;i++)if((j=i<0?-i:i)&&j%10==x||((j/100==x||(0|j/10)==x)&&x)||j==x)console.log(i)

Can also be shortened to 101 if x variable is put directly, like:

for(x=5,i=-100;i<101;i++)if((j=i<0?-i:i)&&j%10==x||((j/100==x||(0|j/10)==x)&&x)||j==x)console.log(i)

It basically checks if absolute values of div or mod operations are equal to the digit (which also works for 100).


If x=1, this fails to print -100 or 100.
DocMax

Should be fixed now
Damir Kasipovic

1 works nicely, but now 0 prints 1, 2, 3... Sorry to be a troublemaker here.
DocMax

Well if you put x=0; it works ok, the problem was that prompt() returns string, so I added *1 and it hopefully should be ok now. THank you for your suggestions
Damir Kasipovic

1
parseInt(j/10) can be replaced with (0|j/10) which is both shorter and avoids the implicit strings. The (unavoidable) string-to-number conversion in prompt()*1 cannot be shortened as +prompt(). (Or shorter still, change the function to start for(x=+prompt(i=-100);....
DocMax

2

GW Basic: 107 characters excluding whitespace

1 input n
2 for i=-100 to 100
3 j=abs(i):a=j mod 10
4 if a=n then 8
5 b=j\10
6 if (b=n) and b then 8
7 if (b<10) or n<>1 then 9
8 print i
9 next

Using single digits for the line numbers helps and stripping the whitespace means there isn't really a need for having multiple statements on a line more than once to keep numbers reaching 10.


2

GROOVY, 71

f={z->
  _=10
  (-_*_.._*_).grep {
    a=it.abs()
    b=a%_==z
    a<_?b:b||(int)(a/_)%_==z
  }
}

println f(0)
println f(9)

Results in

[-100, -90, -80, -70, -60, -50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
[-99, -98, -97, -96, -95, -94, -93, -92, -91, -90, -89, -79, -69, -59, -49, -39, -29, -19, -9, 9, 19, 29, 39, 49, 59, 69, 79, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

2

Javascript 96

Using bitwise or:

b=Math.abs;
a=prompt();
for(i=-100;i<101;)
    if(!(b(i++/10)^a && b(i%10)^a)||b(i)/a==100)  console.log(i)

2

Haskell, 86 75 (78 with necessary whitespaces)

f 0=[-100,-90..100]
f d=[b|b<-[-100..100],abs(b`quot`10)==d||abs(b`rem`10)==d]

Ungolfed:

f dig =
  if dig == 0
    then [-100, 90 .. 100]
    else [num | num <- [-100 .. 100], abs (num `quot` 10) == d || abs (num `rem` 10) == d]

If you use a two line definition with pattern matching, i.e. a 0=[-100.... and a d=[b|b<-.... you can get rid of the if then else and save a few bytes.
nimi

1

Python - 172 chars

def f(x,y,z):
    if x%10==y or (x>9 and x/10==y) or (x==100 and y==1):
        print z
def g(x,y):
    f(abs(x),y,x)
    if x<100:
        g(x+1,y)
def h(y):
    g(-100,y)

To test within Python:

>>> h(4)
-94
-84
-74
...
-49
-48
...

1

VBA 121

(no whitespace or Sub definition counted):

Sub t(d)
For n = -100 To 100
m = Abs(n)
o = o & IIf(d = 0, IIf(d = n Mod 10, " " & n, ""), IIf(d = n Or d = m Mod 10 Or d = Int(m / 10) Or d = Int(m / 100), " " & n, ""))
Next
MsgBox o
End Sub

Does this work with 0?
duci9y

@duci9y Yes. Specifically because: IIf(d = 0, IIf(d = n Mod 10, " " & n, "")
Gaffi

1

perl, 117 with non-meaningful whitespace chars removed

I think you were looking for something more like this. Reads from stdin, outputs one line per match. No regexps, arrays (or sets or hashes or anything else that is an array under the covers) or strings, implicit or otherwise, except the strings passed to print:

chomp($x=<>); for($y=-100;$y<101;++$y) { $a=abs $y; print "$y " if $a % 10 == $x || $a > 9 && int( $a/10 ) == $x || $a==100 && $x==1}; print "\n"

eg:

ski@anito:~$ echo 0 | perl -e 'chomp($x=<>); for($y=-100;$y<101;++$y) { $a=abs $y; print "$y " if $a % 10 == $x || $a > 9 && int( $a/10 ) == $x || $a==100 && $x==1}; print "\n"'
-100 -90 -80 -70 -60 -50 -40 -30 -20 -10 0 10 20 30 40 50 60 70 80 90 100 

ski@anito:~$ echo 1 | perl -e 'chomp($x=<>); for($y=-100;$y<101;++$y) { $a=abs $y; print "$y " if $a % 10 == $x || $a > 9 && int( $a/10 ) == $x || $a==100 && $x==1}; print "\n"'
-100 -91 -81 -71 -61 -51 -41 -31 -21 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -1 1 10 11 12 13 14 15 16 17 18 19 21 31 41 51 61 71 81 91 100 

ski@anito:~$ echo 2 | perl -e 'chomp($x=<>); for($y=-100;$y<101;++$y) { $a=abs $y; print "$y " if $a % 10 == $x || $a > 9 && int( $a/10 ) == $x || $a==100 && $x==1}; print "\n"'
-92 -82 -72 -62 -52 -42 -32 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -12 -2 2 12 20 21 22 23 24 25 26 27 28 29 32 42 52 62 72 82 92 

1

F# 87 92 - 7

let f n = {-100..100}
|>Seq.filter(fun x->abs x%10=n||abs x/10=n&&n>0)
|>Seq.iter(printf"%d ")

added 5 chars because 0 wasn't handled correctly. (Single digit values would all be returned.)


1

This is my first time playing code golf. This looks pretty interesting. I can't win, but I tried and wanted to show what I could do.

Python: 104 (89 if I can mulligan the import) - if the results must be printed exactly as shown in the example

from math import *

def g(x):
    t = 10
    p = lambda i: x == i % t or i >= t and p(i / t)
    for i in range(-100, 101):
        if p(abs(i)):
            print i,
    print
# g(0)
# -100 -90 -80 -70 -60 -50 -40 -30 -20 -10 0 10 20 30 40 50 60 70 80 90 100

Python: 71 - if the output can be done outside the function and the only restriction for the output is that no violating numbers are printed

f = lambda x: [(-i, i) for i in range(101) for j in (10, 100) if i % j == x or i >= j and i / j == x]
# print f(0)
# [(0, 0), (0, 0), (-10, 10), (-20, 20), (-30, 30), (-40, 40), (-50, 50), (-60, 60), (-70, 70), (-80, 80), (-90, 90), (-100, 100), (-100, 100)]

1

JavaScript 125 char

Sorry for the several edits I've been having troubles doing this from my phone :)

function c(n,i){o=i||0;h=100;j=o-h;f=Math.abs(j);m=f/10|0;if((m==n&&m!=0)||n==f%10||f/h==n)console.log(j);if(o<h*2)c(n,o+1);}

1

Dogelang, 42 non-whitespace characters

f=n->for i in(-100..101)=>if n in str i=>print i

Same as my Python solution, just converted to dogelang.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.