Выведите все числа от -100 до 100, которые содержат данную цифру


38

При наличии цифры от 0 до 9 (включительно) ваша функция / подпрограмма должна печатать все числа от -100 до 100 (включительно), которые содержат данную цифру.

Например:

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

Правила:

  • Вы не можете использовать строки (какими бы они ни были представлены на выбранном вами языке) или массивы символов. (За исключением печати ответа на консоль.)
  • Вы не можете использовать массивы.

Подсчет очков:

Оценка = длина подпрограммы / функции (пробелы не учитываются)

Ответ с самым низким счетом выигрывает.

Пробелы НЕ будут засчитаны. Пожалуйста, отформатируйте ваш код правильно!

В некоторых ответах используются регулярные выражения, которые могут нарушать правило без строк, на что указывают некоторые члены. Эти ответы не будут приняты.

Пожалуйста, проверьте ваш код 0перед публикацией.


2
Данный вывод либо неверен, либо неясен. Где -98 ... -91 и 91 ... 98?
Оберон

27
Ответ в виде пробела даст оценку 0. Вы уверены, что хотите это сделать?
pastebin.com slash 0mr8spkT

3
Разрешено ли использование регулярных выражений? Работа с регулярным выражением означает работу со строками. Аналогично работа со списками / коллекциями (и аналогичными структурами) аналогична работе с массивами. Ответ от @wallywest здесь использует регулярное выражение. Это то, что мне не нравится в вопросах, когда они пытаются запретить использование строк и / или массивов. Люди находят альтернативные способы их использования. И если какой-либо ответ действительно реализуется правильно, он не получает столько голосов, сколько следовало бы только потому, что выглядит сложным.
микробиан

2
«Пробелы НЕ будут учтены. Пожалуйста, отформатируйте ваш код правильно!» не очень хороший способ сделать это, поскольку пробелы в разных языках имеют разное значение. Чаще всего это просто «опубликовать версию без чтения / чтения».
Боб

2
@ace Я создал ответ в пробелах (нужно 4 часа кропотливой работы с этим). я думаю, что это ноль очков, верно?
Виктор Стафуса

Ответы:


75

Пробел, 834 символа (0, если вычесть пробелы)

Использовал этот интерпретатор для проверки.

Это заняло у меня около 4 часов тяжелой работы и ужасной отладки. Но это сделано!

   	    	 
   	    	 
	
	    	    	 
			   		    
	  			    	    		
  			   		
		    	     	
   
		    	    	 
			
	  	  	 		
   	    	 
			   	
	  	
	  	  	 		

   	   	  
   	    		
			 
    		  	  
	  	
	  	   	 	
 
   		
	  

		 	   			
  		
	  

   	   			
 
    	    	 
			
	  	  	   
   	 	 
	 	    	    	 
				  	
	  	  	  	

   	  	   
   	 	 
	 		   	    	 
				  	
	  	  	  	

 
 	  	 	 

   	  	  	
   	     	
			
	  	   		 
   	     
	
  
   	   		 
   	     	
   	
		    	    		
				
 	
   	  	 	 
   	    		
   	    		
			   	
	   		 
 
 	   	  

   	   	 	
   	    	 
			
	  	  		  
   	    	 
			   	
	  	
	  	  		  




   	  	 		
  			  	  
	
 	   	     
	
  
 
 	   	  

   	  		  
   	     
	
     		  	  
	
 	


РЕДАКТИРОВАТЬ : Выбираемый текст предоставляется с трюками HTML. Если вы копируете и вставляете его отсюда в другое место, проверьте, точно ли вы получили [space][tab][linefeed][linefeed][linefeed]в конце 100 или 101 строку (в зависимости от того, считает ли ваш редактор новую строку или нет, если последняя заканчивается переводом строки).

В случае, если вы не можете использовать его таким образом, рассматривая пробел как S, перевод строки как Lи табуляцию как T, и разрыв строки после L, вот оно:

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, используя «0, если вычесть пробелы»
Jwosty

12
Ха-ха, я выучил урок. : P
duci9y

2
@Cruncher Язык хорошо определен и совершенно однозначен . Для вашего конкретного вопроса: число представляет собой серию пробелов и табуляций, представляющих число в двоичном формате (пробел = 0, табуляция = 1, двоичный формат с прямым порядком байтов) и завершается новой строкой. Итак, вы знаете, что число заканчивается, когда вы достигаете новой строки.
Тим С.

1
Я узнал Whitespace сегодня. codegolf.stackexchange.com/a/23216/17886
duci9y

7
Я интерпретирую «Пробелы НЕ будут учитываться». означать, что этот ответ является недействительным. ;) +1
Тим Сегин

24

Баш + утиль - 20

seq -100 100|grep 9

Или 21 байт, если в скрипте

seq -100 100|grep $1

Чтобы запустить скрипт:

sh myscript 9

4
grepне bashили sh. Это еще одна утилита!
devnull

я должен согласиться, это не чистая оболочка / удар :)
Nik O'Lai

1
Видит вопрос. Запоминает ответ. Точно такой же ответ уже выложил. Штопать! +1
Парень с Шляпой

6
Я думаю, что это использует строки.
Дэвид Конрад,

1
@DavidConrad Если вы посмотрите на это так, все использует строки. Исходным кодом программы является строка. Терминал использует строки. И т.д.
полковник Тридцать два

9

JavaScript 133 - 1 = 132

Конечно, теперь не может быть ничего плохого в этой версии ...?

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
Еще чуть короче for(i=-100,r=prompt();101>i;i++)(i+'').match(r)&&console.log(i).
VisioN

2
Мне нравится этот ответ (+1), но не использует ли он неявно строки?
Не то чтобы Чарльз

2
здесь используется неявное преобразование строк
Claudiu

1
На самом деле парни, нет, это не ... alert(RegExp(9).test(99))который основан только на числах, также возвращается trueиз-за свободно основанной системы ввода текста в JavaScript. Функции работают с числами, как будто они являются строками, но все еще числами ... Если вы измените код для чтения r=RegExp(x=+prompt());for(i=-100;101>i;i++)r.test(i)&&console.log(i);console.log(typeof(x));console.log(typeof(i))и выполнения, будет показан окончательный ответ typeof xи в iвиде чисел ... Ergo, я не использую строки ...
WallyWest

2
@VoronoiPotato печать также является строкой op. Но мы, очевидно, обязаны сделать это.
Тим Сегин

8

GolfScript [24 байта]

`:x;201,{100-}%{`x?-1>},

Описание:

`:x;             - save input value to variable 'x' and remove from the stack
201,{100-}%      - create range from -100 to 100
{`x?-1>},        - filter the range by "index-of" condition

ДЕМО: http://golfscript.apphb.com/?c=MwoKYDp4OzIwMSx7MTAwLX0le2B4Py0xPn0sYA%3D%3D


это использует строки, хотя
Клаудиу

Он также использует массивы: 201, создает массив, содержащий от 0 до 200.
Рис

6

Рубин: 92 персонажа

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

Читаемая версия:

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

Образец прогона:

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

Тестовый забег:

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

Не проходит 0тест.
duci9y

К сожалению. Ты прав, @ duci9y. Исправлено.
Манатворк

6

К - 45 символов

Не выигрывая никаких наград, но К гольфу недостаточно представлен. K не становится красивее с надлежащим интервалом, поэтому я просто оставлю это как есть, потому что K очень разборчив в том, какой пробел важен, а какой нет.

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

Разъяснение:

  • a:100-!201- Составьте список от 0 до 200 включительно, затем вычтите его из 100. Теперь у нас есть числа от -100 до 100 включительно, но в обратном направлении от спецификаций вопроса. Мы всегда можем исправить это позже, поэтому сейчас мы просто назначим это a.
  • _ _abs - Возьмите слово абсолютных значений этих чисел, потому что по какой-то причине К считает, что _abs должно дать результаты с плавающей запятой. К счастью, настил их превращает их обратно в целые числа.
  • 10_vs'- Расширить каждое ( ') целое число как базовое число 10 ( _vsозначает «вектор из скаляра»). Обратите внимание, что нам не пришлось использовать оператор Each' в вышеприведенных функциях, потому что они работают с атомами.
  • @[...;100;0,] - Изменить элемент в нашем списке с индексом 100 (пустой список, который является результатом расширения 0 в основание 10) с помощью функции 0, , которая добавляет ноль вперед. Без этой коррекции эта функция не будет работать на входе 0.
  • &x in'- Теперь верните индексы ( &), где xесть цифра в ( _in) каждый (' ) из расширений, которые мы так тщательно построили выше.
  • |a@- Наконец, используйте эти индексы для индексации aи переверните список в правильном порядке.

Использование очевидно, хотя удачи вам в переводчике. (На 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

Интересно, имеют ли такие языки, как K, продуктивное использование вне сценариев, подобных этому вопросу. Они?
duci9y

2
@ duci9y На самом деле, K, в частности , оказалась на нишевом рынке на Уолл-стрит, обрабатывая высокоскоростные транзакции с большими объемами, используя собственное программное обеспечение для баз данных KDB. Близкий родственник J также находит применение, хотя больше в корпоративном и академическом контекстах.
алгоритмический

Замечательно! Я верил, что эзотерические языки просто для удовольствия. Приятно видеть, что это не так.
duci9y

Разве в описании не сказано «Вы не можете использовать массивы»?
Омар

6

удар 55 49 символов:

(не считая пробелов вокруг &&)

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

Выполняя это, говоря:

bash filename 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

Вы можете заменить «&&» на «&&» для двух дополнительных точек. Также я считаю на один символ меньше, если опускаю завершающий перевод строки.
Цифровая травма

1
Поцарапайте это - я только что увидел новое правило: «РЕДАКТИРОВАТЬ: Пробелы НЕ будут учитываться. Пожалуйста, отформатируйте ваш код правильно!» , Итак, я полагаю, вы просто посчитали все непробельные символы?
Цифровая травма

Затем вы можете конвертировать ;s в новые строки и сохранить 2 балла.
Joeytwiddle

4

PHP 67 байт:

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

Да, есть вызов strpos, но я использую только номера!

Вот версия «без гольфа»:

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

Чтобы это работало, вы можете проверить это здесь: http://writecodeonline.com/php/

Просто не забудьте добавить $_GET[n]='<number>'; в начало кода.

Или на сервере лампы или xampp вы можете создать страницу и затем открыть ее в браузере с параметром ?n=<number>после имени файла.


1
Это похоже на неявное преобразование строк, нарушающее правило без строк.
ВоронойПотато

Не моя вина. Я не сделал язык. Я использовал то, что у меня есть. Кроме того, конвертация производится внутри. В коде нет ничего, касающегося строк (кроме вывода).
Исмаэль Мигель

То, как я читаю правило, вы должны иметь дело с числами арифметически. Относиться к ним как к строкам, будь то вы, язык или библиотека, запрещено. Но почти все остальные обходят правило подобным образом.
Дэвид Конрад

Ну, все хотят сделать это наименьшим образом. И самое маленькое - это обрабатывать числа как строки (внутренне без неявного преобразования в строку в коде).
Исмаэль Мигель

4

Mathematica 28

Извините, я просто не смог устоять.

:)

Инструкции: «При условии, что цифра от 0 до 9 (включительно), ваша функция / подпрограмма должна печатать все числа от -100 до 100 (включительно), которые содержат данную цифру».


Далее печатаются все такие числа по порядку.

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

В качестве специального бонуса он печатает те числа в том же диапазоне, которые не содержат данную цифру. :)


Но это не использовать в качестве фильтра
Мурта

@Marta, да, я изменил цель головоломки (именно поэтому я сказал «Извините»), технически предоставив соответствующий ответ.
DavidC

4

Моя первая попытка здесь, так что, возможно, я делаю что-то не так, пожалуйста, извините;)
Итак, я не был уверен, нужно ли мне добавлять весь класс или только логику внутри.

Java - 199 символов

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

Вот более читаемая форма:

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

}

Я предполагаю, что основная идея была не так уж плоха, но требовалось слишком много исключений, чтобы, наконец, сработать для всех случаев ...: /


Извините, не работает с 0:(
duci9y

Оу, конечно, последнее добавление, которое я сделал, испортило это. Обновленный код, так что теперь я до 199. Спасибо что подметил это!
Йохен Рейншлюссел,

Я не осознавал этого: D Слишком много кодирования на родном языке в последние дни, я думаю;)
Йохен Рейншлюссель

Вы удалили все пробелы в вашей сжатой версии ... не приведет ли это к ошибке? Пример: ваши первые 4 символа: intx... не должно быть int x:?
SirPython

4

C - 104 107 114 символов - 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;
    }
}

Ницца. Не могли бы вы также опубликовать версию без правильного пробела?
duci9y

@ duci9y Добавил это.
Оберон

Разве это не выведет результаты из строя? (Spec был обновлен, чтобы заявить, что порядок имеет значение.)
Gaffi

@Gaffi Ну тогда. Я буду редактировать код.
Оберон

4
Не замечает, что 0содержит 0.
Угорен

3

R 87 93

Вот улучшение:

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

(Потенциально) Более читабельно, с примечаниями:

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

Почему нет пробелов?
duci9y

@ duci9y Потому что ничего не нужно. Я отформатирую, чтобы быть более читабельным, и добавлю это, просто для хорошей меры.
Gaffi

Не работает с 0.
duci9y

@ duci9y Это не подводит. Я сделал одно небольшое изменение по сравнению с исходным сообщением (+2 символа), так как исходное сообщение ДЕЙСТВИТЕЛЬНО провалилось 0. Вы пробовали с этой последней версией? Я использую R 3.0.1.
Гаффи

@ duci9y Чтобы было ясно, я имел в виду, использовали ли вы это в самой последней версии моего кода . Моя версия R должна быть достаточно близка к самой последней версии, чтобы не иметь значения. Тем не менее, я не тестировал на любых версиях 2. *.
Гаффи

3

Пролог: 75

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

Как вы это называете? Я сохранил его в test.plфайл, запустил swipl, ввел consult('test')и затем ввел f(9). Но это только вернулось false.
Мартин Тома

3

С ответом в 98 символов

Это одна из самых сексуальных вещей, которые я когда-либо кодировал

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

Старая версия, с 104 непробельными символами:

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

«Работает для меня», используя GCC и CLANG.


Потрясающе! Добро пожаловать в Code Golf.
duci9y

2

GNU coreutils (44)

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

где trиспользуется для преобразования новых строк в пробелы и echoпредоставляет один последний символ новой строки.

$ 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

Это не сильно отличается от существующего ответа .
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 символов

Все пробелы безопасно удаляются, что означает 27 символов. Отрицательные числа в выводе будут иметь _отрицательный знак: именно так J записывает свои отрицательные числа.

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

Разъяснение:

  • V & (i: 100)- Bind ( &) набор чисел от -100 до 100 включительно ( i:100) в качестве правого аргумента основного глагола (V ). Единственный аргумент всего глагола попадает в левую сторону.
  • (U"0 # ])- Используйте результат глагола Uнад каждым числом из правого аргумента ( "0), чтобы выбрать ( #) элементы из правого аргумента ( ]).
  • (e. 10 #.^:_1 |)- Учитывая цифру для проверки в качестве левого аргумента и число для проверки в качестве правого аргумента, разверните в базе 10 ( 10 #.^:_1) абсолютное значение числа ( |) и проверьте, является ли цифра элементом этого расширения ( e.).

Использование:

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

Соглашение об отрицательном подчеркивании в J всегда беспокоило меня - не было бы так плохо, если бы в выводе использовался символ минус (без путаницы с глаголом формата).
Дести

Подчеркивание - это недвусмысленный (и я бы сказал, элегантный и точный) способ J отличить отрицательные признаки от глагола «отрицательный -/ минус». K позволяет использовать отрицательный знак «естественно» в числах, и случайно K вышел из загадочного синтаксического кластерного отвращения. Если это действительно irking вас, работа в выборе ;8!:1, '4.0'8!:2или '-'I.@:=&'_'}":, стоимость 7, 11 и 16 символов соответственно , чтобы результирующая программе функции вместо выражения, по моим подсчетам.
алгоритмический

Я знаю, что это такое, но все равно немного надоедает, когда дело доходит до ввода / вывода. Было бы лучше, если бы при печати чисел он получал знаки минус по умолчанию, а не подчеркивания, предположительно, в случае, если кто-то хотел оценить полученную строку.
Дести

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
            }

Никаких строк (кроме вывода пробелов между числами), никаких массивов символов или других массивов, никаких регулярных выражений. Проверено с 0. Выход:

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


1
И я открыл новый язык сегодня. :)
duci9y

2

Javascript - 108

Не уверен, будет ли принят во внимание существующий ответ javascript, потому что он использует регулярное выражение, поэтому я создал его без него:

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)

Также может быть сокращено до 101, если переменная x указана напрямую, например:

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)

Он в основном проверяет, равны ли абсолютные значения операций div или mod цифре (что также работает для 100).


Если x=1это не для печати -100или 100.
DocMax

Должно быть исправлено сейчас
Дамир Касипович

1работает хорошо, но теперь 0печатает 1, 2, 3... Жаль быть нарушителем здесь.
DocMax

Хорошо, если вы поставите х = 0; все работает нормально, проблема в том, что prompt()возвращает строку, поэтому я добавил * 1, и, надеюсь, теперь все должно быть в порядке. Спасибо за ваши предложения
Дамир Касипович

1
parseInt(j/10)может быть заменено на (0|j/10)что и короче и избегает неявных строк. Преобразование строки в число (неизбежное) prompt()*1не может быть сокращено как +prompt(). (Или еще короче, измените функцию для запуска for(x=+prompt(i=-100);....
DocMax

2

GW Basic: 107 символов без пробелов

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

Использование однозначных чисел для номеров строк помогает, и удаление пробелов означает, что на самом деле нет необходимости иметь несколько операторов в строке более одного раза, чтобы числа достигали 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)

Результаты в

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

Используя побитовый или:

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 с необходимыми пробелами)

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]

Если вы используете определение в две строки с сопоставлением с образцом, то есть a 0=[-100....и a d=[b|b<-....вы можете избавиться от if then elseи сохранить несколько байт.
Ними

1

Питон - 172 символа

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)

Чтобы проверить в Python:

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

1

VBA 121

(пробелы или Subопределения не учитываются):

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

Это работает с 0?
duci9y

@ duci9y Да. В частности, потому что:IIf(d = 0, IIf(d = n Mod 10, " " & n, "")
Гаффи

1

perl, 117 с удаленными бессмысленными пробелами

Я думаю, что вы искали что-то более подобное. Читает из стандартного ввода, выводит одну строку за матч. Никаких регулярных выражений, массивов (или наборов или хэшей или чего-либо еще, что является массивом под обложками) или строк, неявных или иных, кроме строк, передаваемых для печати:

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"

например:

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

добавил 5 символов, потому что 0 не был обработан правильно. (Однозначные значения все будут возвращены.)


1

Я впервые играю в гольф в коде. Это выглядит довольно интересно. Я не могу победить, но я пытался и хотел показать, на что я способен.

Python: 104 (89, если я могу проверить импорт) - если результаты должны быть напечатаны точно так, как показано в примере

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 - если вывод может быть сделан вне функции, и единственным выходом является то, что не печатаются нарушающие числа

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

Извините за несколько правок, у меня были проблемы с этим с моего телефона :)

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 непробельных символа

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

То же, что и мое решение на Python, только что преобразовано в dogelang .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.