Роздрукуйте всі числа від -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

Правила:

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

Оцінка:

Оцінка = довжина підпрограми / функції (пробіли не враховуються)

Відповідь з найменшим балом виграє.

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

Деякі відповіді використовують регулярні вирази, які можуть порушувати правило без рядків, на що вказують деякі члени. Ці відповіді не приймаються.

Будь ласка, протестуйте свій код 0перед публікацією.


2
Даний вихід або неправильний, або незрозумілий. Де -98 ... -91 та 91 ... 98?
Оберон

27
Відповідь Whitespace буде 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's, ось це:

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, бінарний формат big-endian) і закінчується новим рядком. Таким чином, ви знаєте, що число закінчується, коли ви переходите до нового рядка.
Тім С.

1
Я навчився Whitespace сьогодні. codegolf.stackexchange.com/a/23216/17886
duci9y

7
Я інтерпретую "Пробіли НЕ будуть зараховані". означає, що ця відповідь недійсна. ;) +1
Тім Сегейн

24

Bash + утиліти - 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
для цього використовується неявна конверсія рядків
Клавдіу

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 - це також рядковий опис. Але ми, очевидно, вимагаємо цього робити.
Тім Сегуїн

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

DEMO: http://golfscript.apphb.com/?c=MwoKYDp4OzIwMSx7MTAwLX0le2B4Py0xPn0sYA%3D%3D


для цього використовуються рядки
Клавдіу,

Він також використовує масиви: 201, створює масив, що містить від 0 до 200.
Рис,

6

Ruby: 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

K - 45 char

Не вигравав жодної нагороди, але K golfing недостатньо представлений. 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означає "вектор від скаляра"). Зауважте, що нам не довелося використовувати оператор Every 'на функціях вище, оскільки вони працюють на атомах.
  • @[...;100;0,]- Змініть елемент у нашому списку на індекс 100 (порожній список, який є результатом розширення 0 на базу 10) за допомогою функції 0,, яка попередньо дорівнює нулю на передню частину. Без цього виправлення ця функція не працює на вході 0.
  • &x in'- Тепер поверніть індекси ( &), де xє цифра у ( _in) кожного ( ') розширень, які ми так ретельно побудували вище.
  • |a@- Нарешті, використовуйте ці індекси для індексації aта переверніть список у потрібному порядку.

Використання очевидне, хоча удача отримати ваші руки на перекладача K. (У 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. Близький родич Дж також знаходить користь, хоча більше у корпоративному та академічному контекстах.
алгоритм

Це чудово! Я вважав, що езотеричні мови - це просто для розваги. Приємно бачити, що це не так.
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
Почертайте це - я щойно побачив нове правило: "EDIT: Whitespace НЕ буде зараховано. Будь ласка, форматуйте свій код належним чином!" . Тож я здогадуюсь, що ви просто порахуєте всіх символів, що не пробілюють?
Digital Trauma

Тоді ви можете перетворити ;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
Це виглядає як неявне перетворення рядків, що порушує правило no string.
VoronoiPotato

Не моя вина. Я не склав мови. Я використав те, що маю. Крім того, перетворення проводиться всередині країни. У коді немає нічого, що стосується рядків (крім виводу).
Ісмаїл Мігель

Те, як я читаю правило, маєш поводитися з числами арифметично. Трактувати їх як рядки, чи то ви, чи то мова чи бібліотека, - поза межами. Але майже всі інші перекривають правило аналогічним чином.
Девід Конрад

Що ж, всі хочуть зробити це найменшим чином. І найменший трактує числа як рядки (внутрішньо без неявного перетворення на рядок у коді).
Ісмаїл Мігель

4

Математика 28

Вибач, я просто не втримався.

:)

Інструкції: "Якщо цифра між 0 і 9 (включно), ваша функція / підпрограма повинна друкувати всі числа від -100 до 100 (включно), які містять задану цифру."


Далі виводяться всі такі цифри по порядку.

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

Як спеціальний бонус, він друкує ті числа в тому ж діапазоні, які не містять заданої цифри. :)


Але це не використовує n як фільтр
Мурта,

@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. Дякуємо, що вказали на це!
Jochen Reinschlüssel

Я не усвідомлював цього: D Дуже багато кодування рідною мовою за минулі дні;)
Jochen Reinschlüssel

Ви видаляли кожен пробіл у вашій ущільненій версії ... чи це не спричинило б помилку? Приклад: Ваші перші 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;}}

Безумовно:

#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 Тому, що ніхто не потрібен. Я відформатую, щоб бути читабельнішим, і додамо це також, лише на добру міру.
Гаффі

Не працює з 0.
duci9y

@ duci9y Це не виходить з ладу. Я зробив одну невелику зміну від початкової публікації (+2 символи), оскільки вихідний DID не вдався 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

C відповідь у 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 (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)- Прив’яжіть ( &) набір чисел від -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 завжди турбувало мене - це було б не так вже й погано, якби він використовував символ мінус у виводі (без псування з форматом дієслова).
Десті

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

Я знаю, що це таке, але все-таки трохи турбує те, що стосується вводу-виводу. Було б приємніше, якщо він створював мінусові знаки за замовчуванням під час друку чисел, а не друкуючи підкреслення, мабуть, у випадку, якщо хтось захотів зрівняти отриманий рядок.
Десті

2

Гроовий, 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
            }

Ніяких рядків (крім виведення пробілів між номерами), без масивів char або інших масивів, без регулярних виражень. Тестовано з 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

Добре, якщо ви поставите x = 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

ГРОЛОВИЙ, 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

Хаскелл, 86 75 (78 з необхідними пробілами)

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

Безумовно:

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 з неістотними знаками пробілу видалено

Я думаю, ви шукали щось подібне. Читає з stdin, виводить один рядок на матч. Жодних регулярних виразів, масивів (або наборів, хешей чи будь-чого іншого, що є масивом під обкладинками), або рядків, неявних чи інших способів, крім рядків, переданих для друку:

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

Догеланг, 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.