Wydrukuj wszystkie liczby od -100 do 100, które zawierają daną cyfrę


38

Jeśli podana jest cyfra od 0 do 9 (włącznie), twoja funkcja / podprogram powinien wypisać wszystkie liczby od -100 do 100 (włącznie), które zawierają daną cyfrę.

Na przykład:

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

Zasady:

  • Nie możesz używać łańcuchów (w żaden sposób, które są reprezentowane w wybranym języku) ani tablic znakowych. (Z wyjątkiem wydrukowania odpowiedzi na konsoli.)
  • Nie możesz używać tablic.

Punktacja:

Wynik = długość podprogramu / funkcji (białe znaki nie będą liczone)

Odpowiedź z najniższym wynikiem wygrywa.

Białe spacje NIE będą liczone. Proszę poprawnie sformatować kod!

Niektóre odpowiedzi używają wyrażeń regularnych, które mogą naruszać zasadę braku ciągów, jak zauważyli niektórzy członkowie. Te odpowiedzi nie będą akceptowane.

0Przed wysłaniem sprawdź swój kod .


2
Podane dane wyjściowe są błędne lub niejasne. Gdzie są -98 ... -91 i 91 ... 98?
Oberon,

27
Odpowiedź w polu Biała spacja uzyska wynik 0. Czy na pewno chcesz to zrobić?
ace_HongKongIndependence

3
Czy użycie wyrażenia regularnego jest dozwolone? Praca z wyrażeniem regularnym oznacza pracę z ciągami. Podobnie praca z listami / kolekcjami (i podobnymi strukturami) jest taka sama jak praca z tablicami. Odpowiedź z @wallywest tutaj używa wyrażenia regularnego. Tego nie lubię w pytaniach, gdy próbują zabronić używania łańcucha i / lub tablic. Ludzie znajdują alternatywne sposoby ich używania. A jeśli jakakolwiek odpowiedź rzeczywiście zostanie poprawnie wykonana, nie uzyska tylu głosów, ile powinna, tylko dlatego, że wygląda na skomplikowaną.
mikrobian

2
„Białe spacje NIE zostaną policzone. Proszę poprawnie sformatować kod!” nie jest świetnym sposobem na zrobienie tego, ponieważ białe znaki w różnych językach mają różne znaczenie. Częściej jest to po prostu „opublikowanie wersji niepolecanej / czytelnej”.
Bob

2
@ace Stworzyłem odpowiedź w białych znakach (potrzebowałem 4 godzin ciężkiej pracy z tym). myślę, że ma zero, prawda?
Victor Stafusa,

Odpowiedzi:


75

Białe znaki, 834 znaki (0 po odjęciu białych znaków)

Użyłem tego interpretera do przetestowania go.

Tworzenie zajęło mi około 4 godzin ciężkiej pracy i okropnego debugowania. Ale to już koniec!

   	    	 
   	    	 
	
	    	    	 
			   		    
	  			    	    		
  			   		
		    	     	
   
		    	    	 
			
	  	  	 		
   	    	 
			   	
	  	
	  	  	 		

   	   	  
   	    		
			 
    		  	  
	  	
	  	   	 	
 
   		
	  

		 	   			
  		
	  

   	   			
 
    	    	 
			
	  	  	   
   	 	 
	 	    	    	 
				  	
	  	  	  	

   	  	   
   	 	 
	 		   	    	 
				  	
	  	  	  	

 
 	  	 	 

   	  	  	
   	     	
			
	  	   		 
   	     
	
  
   	   		 
   	     	
   	
		    	    		
				
 	
   	  	 	 
   	    		
   	    		
			   	
	   		 
 
 	   	  

   	   	 	
   	    	 
			
	  	  		  
   	    	 
			   	
	  	
	  	  		  




   	  	 		
  			  	  
	
 	   	     
	
  
 
 	   	  

   	  		  
   	     
	
     		  	  
	
 	


EDYCJA : Tekst do wyboru wyposażony w sztuczki HTML. Jeśli skopiujesz go i wkleisz stąd w inne miejsce, sprawdź, czy otrzymałeś dokładnie [space][tab][linefeed][linefeed][linefeed]na końcu 100 lub 101 wierszy (w zależności od tego, czy Twój edytor się liczy, czy nie nowego wiersza, jeśli ostatni kończy się wysuwem wiersza).

W przypadku, gdy nie możesz użyć tego w ten sposób, biorąc pod uwagę spację jako S, podawanie linii jako Li tab jako Toraz łamanie linii po L's, oto:

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 wykorzystując „0, jeśli
odejmiesz

12
Haha, nauczyłem się lekcji. : P
duci9y,

2
@Cruncher Język jest dobrze zdefiniowany i całkowicie jednoznaczny . W przypadku konkretnego pytania: liczba jest serią spacji i tabulatorów, reprezentujących liczbę w formacie binarnym (spacja = 0, tab = 1, format binarny big-endian) i jest zakończona nową linią. Więc wiesz, że liczba kończy się po osiągnięciu nowej linii.
Tim S.

1
Nauczyłem się dziś Białej Przestrzeni. codegolf.stackexchange.com/a/23216/17886
duci9y

7
Tłumaczę: „Białe spacje NIE będą liczone”. co oznacza, że ​​ta odpowiedź jest nieprawidłowa. ;) +1
Tim Seguine

24

Bash + utils - 20

seq -100 100|grep 9

Lub 21 bajtów, jeśli jest w skrypcie

seq -100 100|grep $1

Aby uruchomić skrypt:

sh myscript 9

4
grepnie jest bashlub sh. To kolejne narzędzie!
devnull

muszę się zgodzić, to nie jest czysta skorupa / bash :)
Nik O'Lai

1
Widzi pytanie. Pamięta o odpowiedzi. Widzi dokładnie tę samą odpowiedź, która została już opublikowana. Cerować! +1
Facet z kapeluszem

6
Myślę, że to używa ciągów.
David Conrad

1
@DavidConrad Jeśli spojrzysz na to w ten sposób, wszystko używa ciągów znaków. Źródło programu to ciąg znaków. Terminal używa ciągów znaków. Itd.
Pułkownik Trzydzieści Dwa

9

JavaScript 133-1 = 132

Z pewnością teraz nie może być nic złego w tej wersji ...?

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
Nawet nieco krótszy: for(i=-100,r=prompt();101>i;i++)(i+'').match(r)&&console.log(i).
VisioN

2
Podoba mi się ta odpowiedź (+1), ale czy nie używa domyślnie ciągów znaków?
Nie, że Charles

2
używa to domyślnej konwersji ciągów
Claudiu

1
Właściwie chłopaki, nie to nie ... alert(RegExp(9).test(99))które oparte są tylko na liczbach, również zwraca trueze względu na luźno oparty system pisania JavaScript. Funkcje działają z liczbami tak, jakby były ciągami, ale nadal są liczbami ... Jeśli zmienisz kod, aby go odczytać r=RegExp(x=+prompt());for(i=-100;101>i;i++)r.test(i)&&console.log(i);console.log(typeof(x));console.log(typeof(i))i wykonać, pojawi się końcowy typ odpowiedzi xi ijako liczby ... Ergo, nie używam ciągów ...
WallyWest,

2
Drukowanie VoronoiPotato jest również ciągiem op. Ale oczywiście jesteśmy do tego zobowiązani.
Tim Seguine,


6

Rubin: 92 znaków

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

Wersja do odczytu:

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

Przykładowy przebieg:

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

Testowe uruchomienie:

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

Nie powiedzie się 0test.
duci9y

Ups Masz rację, @ ​​duci9y. Poprawione
manatwork

6

K - 45 znaków

Nie wygrywa żadnych nagród, ale gra w golfa K jest niedostatecznie reprezentowana. K nie robi się ładniejszy z odpowiednim odstępem, więc zostawię to tak, jak jest, ponieważ K bardzo wybrednie określa, które białe znaki są ważne, a które nie.

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

Wyjaśnił:

  • a:100-!201- Zrób listę od 0 do 200 włącznie, a następnie odejmij ją od 100. Teraz mamy liczby od -100 do 100 włącznie, ale wstecz od specyfikacji pytania. Zawsze możemy to naprawić później, więc na razie po prostu to przypisamy a.
  • _ _abs- Podnieś wartość bezwzględną tych liczb, ponieważ z jakiegokolwiek powodu K uważa, że _abspowinno to dać wyniki zmiennoprzecinkowe. Na szczęście ich podłoga zamienia je z powrotem w liczby całkowite.
  • 10_vs'- Rozwiń każdą 'liczbę całkowitą jako liczbę podstawową 10 ( _vsoznacza „wektor ze skalara”). Zauważ, że nie musieliśmy używać operatora Each 'w powyższych funkcjach, ponieważ działają one na atomach.
  • @[...;100;0,]- Zmień pozycję na naszej liście pod indeksem 100 (pusta lista, która jest wynikiem rozwinięcia 0 do podstawy 10) przez funkcję 0,, która wstawia zero na początek. Bez tej korekty funkcja ta zawiedzie na wejściu 0.
  • &x in'- Teraz zwróć indeksy ( &), gdzie xjest cyfrą w ( _in) każdym ( ') z rozwinięć, które tak starannie skonstruowaliśmy powyżej.
  • |a@- Na koniec użyj tych indeksów, aby zaindeksować ai odwrócić listę we właściwej kolejności.

Użycie jest oczywiste, ale powodzenia w tłumaczeniu K. (Na Github istnieje implementacja typu open source , którą można skompilować).

  {|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

Zastanawiam się, czy języki takie jak K mają jakieś produktywne zastosowania poza scenariuszami takimi jak to pytanie. Czy oni?
duci9y

2
@ duci9y W rzeczywistości K w szczególności znalazła się na niszowym rynku na Wall Street, obsługując szybkie i masowe transakcje, korzystając z rodzimego oprogramowania baz danych KDB. Bliski krewny J również znajduje zastosowanie, chociaż bardziej w kontekście korporacyjnym i akademickim.
algorytm

To wspaniale! Wierzyłem, że języki ezoteryczne są po prostu dla zabawy. Dobrze, że tak nie jest.
duci9y

Czy opis nie mówi „Nie możesz używać tablic”?
Omar

6

grzmotnąć 55 49 znaków:

(nie licząc białych znaków &&)

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

Wykonując to, mówiąc:

bash filename 9

wyprodukowałby:

-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

Możesz zamienić „&&” na „&&”, aby uzyskać dwa dodatkowe punkty. Liczę też o jeden mniej znaków, jeśli upuszczę końcowy znak nowej linii.
Digital Trauma

1
Zdrap to - właśnie zobaczyłem nową zasadę: „EDYCJA: Białe spacje NIE zostaną policzone. Proszę poprawnie sformatować kod!” . Więc myślę, że po prostu policzysz wszystkie znaki niebiałe?
Digital Trauma

Następnie możesz przekonwertować ;s na nowe linie i zapisać 2 punkty.
joeytwiddle

4

PHP 67 bajtów:

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

Tak, istnieje połączenie typu „strpos”, ale używam tylko numerów!

Oto wersja „bez golfa”:

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

Aby to zadziałało, możesz to przetestować tutaj: http://writecodeonline.com/php/

Pamiętaj tylko, aby dodać $_GET[n]='<number>';na początku kodu.

Lub, na lampie lub serwerze xampp, możesz utworzyć stronę, a następnie uzyskać do niej dostęp w przeglądarce, z parametrem ?n=<number>po nazwie pliku.


1
To wygląda jak niejawna konwersja ciągów, co narusza zasadę braku ciągów.
VoronoiPotato

Nie moja wina. Nie stworzyłem języka. Użyłem tego, co mam. Poza tym konwersja odbywa się wewnętrznie. W kodzie nic nie dotyczy ciągów znaków (z wyjątkiem danych wyjściowych).
Ismael Miguel

Sposób, w jaki czytam zasadę, polega na arytmetycznym radzeniu sobie z liczbami. Traktowanie ich jako ciągów znaków, zarówno przez ciebie, jak i przez język lub bibliotekę, jest nieosiągalne. Ale prawie wszyscy omijają zasadę w podobny sposób.
David Conrad

Cóż, każdy chce zrobić to w jak najmniejszy sposób. Najmniejsze jest traktowanie liczb jako ciągów znaków (wewnętrznie bez niejawnej konwersji na ciągi znaków w kodzie).
Ismael Miguel

4

Mathematica 28

Przepraszam, po prostu nie mogłem się oprzeć.

:)

Instrukcje są następujące: „Jeśli podana jest cyfra od 0 do 9 (włącznie), twoja funkcja / podprogram powinien wypisać wszystkie liczby od -100 do 100 (włącznie), które zawierają daną cyfrę.”


Poniżej drukowane są wszystkie takie liczby w kolejności.

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

Jako specjalny bonus drukuje te liczby w tym samym zakresie, które nie zawierają danej cyfry. :)


Ale to nie używa n jako filtra
Murta

@Marta, Tak, obaliłem zamiar układanki (dlatego powiedziałem „przepraszam”), podając technicznie odpowiednią odpowiedź.
DavidC,

4

Moja pierwsza próba tutaj, więc może robię coś źle, przepraszam;)
Nie byłem więc pewien, czy muszę dodać całą klasę, czy tylko logikę.

Java - 199 znaków

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);}

Oto bardziej czytelna forma:

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);

}

Myślę, że podstawowy pomysł nie był taki zły, ale potrzebował zbyt wielu wyjątków, aby w końcu wypracować wszystkie przypadki ...: /


Przepraszamy, nie działa z 0:(
duci9y

Och, jasne, ostatni dodatek wymyśliłem to. Zaktualizowałem kod, więc teraz jestem na poziomie 199. Dzięki za zwrócenie na to uwagi!
Jochen Reinschlüssel

Nie zdawałem sobie sprawy z tego: D Zbyt dużo kodowania w języku ojczystym w ostatnich dniach;)
Jochen Reinschlüssel

Usunąłeś każde miejsce w kompaktowej wersji ... czy to nie spowodowałoby błędu? Przykład: Twoje pierwsze 4 znaki: intx... nie powinno być int x:?
SirPython

4

C - 104 107 114 znaków - 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;}}

Nie golfowany:

#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;
    }
}

Miły. Czy możesz również opublikować wersję bez golfa z odpowiednią białą spacją?
duci9y

@ duci9y Dodano to.
Oberon

Czy to nie spowoduje, że wyniki będą w porządku? (Specyfikacja została zaktualizowana, aby stwierdzić, że zamówienie ma znaczenie.)
Gaffi

@Gaffi Cóż więc. Zmienię kod.
Oberon

4
Nie można zauważyć, że 0zawiera 0.
ugoren,

3

R 87 93

Oto poprawa:

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

(Potencjalnie) Bardziej czytelny, z notatkami:

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

Dlaczego nie ma białych znaków?
duci9y

@ duci9y Ponieważ nic nie jest konieczne. Sformatuję, aby był bardziej czytelny, i dodam to również, na wszelki wypadek.
Gaffi

Nie działa z 0.
duci9y

@ duci9y Nie zawiedzie. Zrobiłem jedną małą zmianę w stosunku do oryginalnego postu (+2 znaki), ponieważ oryginalny post DID zawiódł 0. Próbowałeś z tą najnowszą wersją? Używam wersji R 3.0.1.
Gaffi

@ duci9y Aby być jasnym, miałem na myśli, czy użyłeś tego w najnowszej wersji mojego kodu . Moja wersja R powinna być wystarczająco blisko najnowszej wersji, aby nie mieć znaczenia. Jednak w ogóle nie testowałem żadnych wersji 2. *.
Gaffi

3

Prolog: 75

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

Jak to nazwać? Zapisałem go w test.plpliku, uruchomiłem swipl, wprowadziłem, consult('test')a następnie wpisałem f(9). Ale to tylko wróciło false.
Martin Thoma,

3

Odpowiedź C w 98 znakach

To jedna z najseksowniejszych rzeczy, jakie kiedykolwiek kodowałem

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  );
}

Starsza wersja, z 104 znakami spacjami:

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));
    }
}

„Działa dla mnie” przy użyciu GCC i CLANG.


Niesamowite! Witamy w Code Golf.
duci9y

2

GNU coreutils (44)

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

gdzie trsłuży do konwertowania nowych linii na spacje i echozapewnia jedną końcową nową linię.

$ 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

To niewiele różni się od istniejącej odpowiedzi .
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 znaków

Wszystkie białe znaki można bezpiecznie usunąć, co oznacza 27 znaków. Liczby ujemne na wyjściu będą miały _znak ujemny: w ten sposób J zapisuje liczby ujemne.

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

Wyjaśnił:

  • V & (i: 100)- Bind ( &) zestaw liczb od -100 do 100 włącznie ( i:100) jako prawy argument głównego czasownika ( V). Pojedynczy argument całego czasownika zostaje przeniesiony na lewą stronę.
  • (U"0 # ])- Użyj wyniku czasownika Unad każdą liczbą z prawego argumentu ( "0), aby wybrać ( #) elementy z prawego argumentu ( ]).
  • (e. 10 #.^:_1 |)- Biorąc pod uwagę cyfrę do sprawdzenia jako lewy argument i liczbę do sprawdzenia jako prawy argument, rozwiń w bazie 10 ( 10 #.^:_1) wartość bezwzględną liczby ( |) i sprawdź, czy cyfra jest elementem tego rozszerzenia ( e.).

Stosowanie:

   ((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

Konwencja podkreślania negatywów w J zawsze mnie niepokoiła - nie byłoby tak źle, gdyby używał w wyniku symbolu minus (bez bałagania czasownikiem formatującym).
Desty

Podkreślenie jest jednoznacznym (i, powiedziałbym, eleganckim i APListycznym) sposobem J odróżniającym znaki ujemne od czasownika -Negate / Minus. K pozwala ci używać znaku ujemnego „naturalnie” w liczbach, a nawiasem mówiąc, K wyszedł z tajemniczego syntaktycznego pieprzenia klastra. Jeśli to naprawdę irking cię praca w wyborze ;8!:1, '4.0'8!:2albo '-'I.@:=&'_'}":, kosztuje 7, 11 i 16, odpowiednio, znaki, aby program wynikowy funkcji zamiast wyrażeniu, przez moich obliczeń.
algorytm

Wiem, co to jest, ale i tak jest trochę uciążliwe, jeśli chodzi o wejścia / wyjścia. Byłoby ładniej, gdyby wyświetlał znaki minus domyślnie podczas drukowania liczb, zamiast drukowania znaków podkreślenia, na wypadek, gdyby ktoś chciał sprawdzić wynikowy ciąg znaków.
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
            }

Bez ciągów znaków (z wyjątkiem wyświetlania spacji między liczbami), bez tablic znaków lub innych tablic, bez wyrażeń regularnych. Testowane z 0. Wyjście:

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


1
I dzisiaj odkryłem nowy język. :)
duci9y

2

JavaScript - 108

Nie jestem pewien, czy istniejąca odpowiedź w javascript zostanie wzięta pod uwagę, ponieważ używa wyrażenia regularnego, więc stworzyłem jedną bez niej:

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)

Można również skrócić do 101, jeśli zmienna x zostanie wstawiona bezpośrednio, np .:

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)

Zasadniczo sprawdza, czy wartości bezwzględne operacji div lub mod są równe cyfrze (co działa również dla 100).


Jeśli x=1nie uda się wydrukować -100lub 100.
DocMax

Należy naprawić teraz
Damir Kasipovic

1działa dobrze, ale teraz 0drukuje 1, 2, 3... Przepraszam za kłopoty tutaj.
DocMax

Cóż, jeśli wstawisz x = 0; działa dobrze, problem polegał na tym, że prompt()zwraca ciąg znaków, więc dodałem * 1 i mam nadzieję, że teraz powinno być dobrze. Dziękuję za sugestie
Damir Kasipovic

1
parseInt(j/10)można zastąpić, (0|j/10)który jest zarówno krótszy, jak i pozwala uniknąć ukrytych ciągów. (Nieuniknionej) konwersji ciągu na liczbę w prompt()*1nie można skracać jako +prompt(). (Lub jeszcze krócej, zmień funkcję, aby rozpocząć for(x=+prompt(i=-100);....
DocMax

2

GW Basic: 107 znaków bez białych znaków

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

Używanie pojedynczych cyfr w numerach linii pomaga, a spacja białych znaków oznacza, że ​​tak naprawdę nie ma potrzeby posiadania wielu instrukcji w wierszu więcej niż jeden raz, aby liczby osiągały 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)

Prowadzi do

[-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

Za pomocą bitowego lub:

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 z niezbędnymi odstępami)

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

Nie golfowany:

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

W przypadku korzystania z dwóch linii z definicji wyszukiwania wzorca, tzn a 0=[-100....i a d=[b|b<-....można pozbyć się if then elsei zaoszczędzić kilka bajtów.
nimi

1

Python - 172 znaki

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)

Aby przetestować w Pythonie:

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

1

VBA 121

(nie Sublicząc białych znaków ani definicji):

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

Czy to działa 0?
duci9y

@ duci9y Tak. W szczególności dlatego, że:IIf(d = 0, IIf(d = n Mod 10, " " & n, "")
Gaffi

1

perl, 117 z usuniętymi nieistotnymi znakami białych znaków

Myślę, że szukałeś czegoś takiego. Odczytuje ze standardowego wyjścia, generuje jeden wiersz na dopasowanie. Żadnych wyrażeń regularnych, tablic (lub zestawów, skrótów lub czegokolwiek innego, co jest tablicą pod okładkami) lub ciągów, niejawnych lub innych, z wyjątkiem ciągów przekazanych do drukowania:

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"

na przykład:

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 ")

dodano 5 znaków, ponieważ 0 nie było poprawnie obsługiwane. (Wszystkie wartości jednocyfrowe zostaną zwrócone).


1

To moja pierwsza gra w golfa kodowego. To wygląda całkiem interesująco. Nie mogę wygrać, ale próbowałem i chciałem pokazać, co mogę zrobić.

Python: 104 (89, jeśli mogę powtórzyć import) - jeśli wyniki muszą być wydrukowane dokładnie tak, jak pokazano w przykładzie

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 - jeśli dane wyjściowe można wykonać poza funkcją, a jedynym ograniczeniem dla danych wyjściowych jest to, że nie są drukowane żadne naruszające liczby

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 znaków

Przepraszam za kilka zmian, które miałem problemy z zrobieniem tego z mojego telefonu :)

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 znaki niebiałe

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

To samo co moje rozwiązanie Python, właśnie przekonwertowane na Dogelang .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.