Перечислите все палиндромные числа (в десятичном виде) от 0 до n

11

Если задано неотрицательное целое число n, перечислите все палиндромные числа (в десятичной форме) в диапазоне от 0 до n (включительно в диапазоне). Палиндромное число остается тем же самым, когда его цифры обращены.

Первые палиндромные числа (в базе 10) приведены здесь :

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202, 212, 222, 232, 242, 252, 262, 272, 282, 292, 303, 313, 323, 333, 343, 353, 363, 373, 383, 393, 404, 414, 424, 434, 444, 454, 464, 474, 484, 494, 505, 515, ...

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

котелок с выпуклым днищем
источник
3
От 1 до n (согласно заголовку) или от 0 до n (по тексту)? И что из границ включает "между"?
Питер Тейлор
@wok: Вы до сих пор не ответили, является ли это инклюзивным или эксклюзивным диапазоном? Является ли nчастью диапазона для включения?
mellamokb
@mellamokb Инклюзивный ассортимент.
Вок

Ответы:

7

Golfscript, 15 символов

~),{.`-1%~=},n*
Питер Тейлор
источник
Вы можете сохранить символ, сравнивая строки вместо чисел '~), {`.-1% =}, n *'.
Говард
@ Говард, если ты хочешь опубликовать это сам, я добавлю голос.
Питер Тейлор
Это было бы похоже на простое копирование ;-)
Говард
10

Perl 5.10, 29 (или 39) символов

say for grep$_==reverse,0..<>

Нужна sayфункция включена. 29 символов, если вы считаете, что это бесплатно, в противном случае 39 добавить use 5.010;. Аргумент на STDIN.

Perl, 35 символов

#!perl -l
print for grep $_==reverse,0..<>

используя старое соглашение perlgolf, #!perlкоторое не учитывается, но следуют все флаги, следующие за ним.

Perl, 36 символов

print$_,$/for grep $_==reverse,0..<>

Если ни один из других не подходит.

Hobbs
источник
Не могли бы вы объяснить, что делает $ / do?
Гурзо
1
@Gurzo $/- это разделитель входных записей, по умолчанию используется перевод строки. Это просто немного короче, чем буквально "\n".
Хоббс
Использование карты короче:map{say if$_==reverse}0..<>
Jho
2
@ злой. Отправить это :)
Хоббс
1
Если вы используете -Eвместо -e, вы получите sayбесплатно.
августа
9

Befunge 320 313 303 персонажа

(включая значительные новые строки и пробелы)

 &:#v_v#  #                  :-1<
v91:<         v          <
0     >0.@    >\25**\1-:#^_v
pv   p09+1g09<^_           >$+     v
:>:25*%\25*/:| ^:p18:+1g18\<
 :          > >90g 1-:90p  | >  ^
>|           $^     <      >-|  ^  #<
 @           > 0 81p^        >:.25*,^
            ^                      <

Интересно, смогу ли я сделать это меньше, перенаправив пути ...

Редактировать: переделать верхнюю часть, чтобы избежать лишней строки.

Blindy
источник
8

Perl 5.10 - 27 символов

map{say if$_==reverse}0..<>

Читает аргумент из стандартного ввода.

Jho
источник
7

Ruby 1.9, 39 символов

puts (?0..gets).select{|i|i==i.reverse}

Ввод (не должен заканчиваться символом новой строки) через stdin. Пример вызова:

echo -n 500 | ruby1.9 palinenum.rb

40 символов для версии, которая использует аргументы командной строки:

puts (?0..$*[0]).select{|i|i==i.reverse}
Ventero
источник
Рохит предложил сохранить 3 символа в каждом из них, используя pвместо puts.
Питер Тейлор
Используя ваш код, я получил следующий вывод, который кажется неправильным (я использую ruby ​​1.9.2p0 (2010-08-18) [i386-mingw32]) irb(main):023:0> p (?0..gets).select{|i|i==i.reverse} 1 ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "11", "22", "33", "44", "55", "66", "77", "88", " 99"] => ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "11", "22", "33", "44", "55", "66", "77", "88" , "99"] Код ниже работает для меня. p ('0'..gets[0..-2]).select{|i|i==i.reverse} Не могли бы вы объяснить свой код.
Рохит
@PeterTaylor @Rohit pи putsне эквивалентны, фактически используя pразрывы вывода, так как помещает записывает каждый элемент в новую строку, еслиp вызывается с массивом , тогда как просто вызывает .to_s.
Вентеро
6

J , 20 знаков

(#~(-:|.)@":"0)>:i.n
ephemient
источник
Я могу прочитать это! :)
Хорошо
Кстати, для удовлетворения требований выведите число по одному в строке ,"0.
defhlt
@defhlt тоже ,.работает
Bolce Bussiere
5

Python, 57 51 символ

for i in range(input()):
 if`i`==`i`[::-1]:print i

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

echo 500 | python palindromic.py
Бестолковые
источник
3
Короче:for i in range(input()):if`i`==`i`[::-1]:print i
Стивен Румбальски
Если использование интерактивного переводчика является законным, тогда вы можете избежать printи просто делать if`i`==`i`[::-1]:i(я говорю это, потому что от этого зависит решение Scala).
Бакуриу
Диапазон должен быть включительным. И я думаю, что вы можете изменить количество ваших байтов до 50 (разрывы строк в linux короче).
Malkaroee
5

Perl> 5.10: 25 символов

map$_==reverse&&say,0..<>
Toto
источник
4

APL ( 25 17)

↑t/⍨t≡∘⌽¨t←⍕¨0,⍳⎕
Мэринус
источник
3

Javascript 122 108 107 символов ...

Я уверен, что это может быть в гольфе больше - я новичок в этом!

n=prompt(o=[]);for(i=0;i<=n;i++)if(i+''==(i+'').split("").reverse().join(""))o.push(i);alert(o.join("\n"));

или же

n=prompt(o=[]);i=-1;while(i++<n)if(i+''==(i+'').split("").reverse().join(""))o.push(i);alert(o.join("\n"));
Томас Клейсон
источник
Ну, во-первых, varони не нужны, вы можете просто сделать вещи глобальными. Также prompt()не нуждается строго в параметрах.
невежественный
Тем не менее, вы можете использовать параметры , prompt()чтобы сохранить одну точку с запятой: n=prompt(o=[]);.
mellamokb
Также у вас все еще есть, var i=0что может быть varудалено в вашем for.
mellamokb
1
Хитрость в том, что i++<nсравнивается i<nперед добавлением 1 к i. Таким образом, он работает вплоть до i=n. Если вы хотите остановиться на i=n-1, вы бы использовали ++i<nвместо этого.
mellamokb
1
alert(o.join(" "))должен быть в alert(o.join("\n"))соответствии со спецификациями. Добавьте 1 к вашему количеству персонажей, когда исправите это.
Томас Эдинг
3

Perl - 43 символа

for$i(0..<>){if($i==reverse$i){print$i,$/}}

Это моя первая попытка игры в гольф кода, так что я уверен, что профессионал Perl может сыграть в гольф.

Гурзо
источник
3

Haskell 66 символов

main=do n<-readLn;mapM_ putStrLn[s|s<-map show[0..n],s==reverse s]
Томас Эдинг
источник
Неправильно написано
Исправлено (заполнитель символов)
Томас Эдинг
2

PHP 64 58

for($i=0;$i<=$argv[1];print$i==strrev($i)?$i.'\n':'',$i++)

Изменено $ _GET ['n'] на $ argv [1] для ввода в командной строке.

Томас Клейсон
источник
2

Скала 59

(0 to readInt)filter(x=>""+x==(""+x).reverse)mkString("\n")
Пользователь неизвестен
источник
Я не знаю ни одного Scala, но это действительно печатает на stdout? Я бы догадался, что это выражение, возвращающее строку.
Омар
В интерактивном scala REPL да. Вы можете проверить это здесь простоscala.com, но заменить его readIntна конкретный номер онлайн.
пользователь неизвестен
2

PHP, 59 55 53 символов

for($i=0;$i++<$argv[1];)if($i==strrev($i))echo"$i\n";

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

php palindromic.php 500

Редактировать: спасибо Томас

Alfwed
источник
Вы можете удалить {s вокруг цикла for и удалить пробел, echo "$i\n"чтобы получить echo"$i\n". Это сэкономит вам несколько символов. Кроме того, если вы хотите быть дерзким, вы можете поменять \nна `` и сохранить символ.
Томас Клэйсон
2

C, 98 символов

n,i,j,t;main(){for(scanf("%d",&n);i<=n;i-j?1:printf("%d ",i),i++)for(t=i,j=0;t;t/=10)j=j*10+t%10;}
saeedn
источник
2

Mathematica 61

Column@Select[0~Range~Input[],#==Reverse@#&@IntegerDigits@#&]
chyanog
источник
2

Befunge, 97 (размер сетки 37x4 = 148)

#v&#:< ,*25-$#1._.@
:>:::01-\0v >-!#^_$1-
*\25*/:!#v_::1>\#* #*25*#\/#$:_$\25*%
   `-10:\<+_v#

Иметь лучший ответ Befunge на этот вопрос. Это Befunge-93 специально; Я мог бы сделать его еще более компактным с Befunge-98. Я включу это в будущее редактирование.

Поскольку вы не можете работать со строками в Befunge, лучшее, что я мог сделать, - это вычислить обратное число каждого числа (которое, я удивлен, я смог обойтись без pи g), и сравнить его с исходным числом. Обратная цифра занимает большую часть кода (в основном целые третью и четвертую строки).

Обратите внимание, что программа в ее нынешнем виде печатает числа в обратном направлении от ввода до 0. Если это большое дело, дайте мне знать. (Задача состоит только в том, чтобы перечислять их, а не конкретно в порядке возрастания.)

Kasran
источник
+1. Строки могут быть закрыты в \nодиночку, поэтому их длина составляет 94 байта. Я не думаю, что ваш "размер сетки" имеет какое-то особое значение.
har-wradim
2

05AB1E , 5 байтов (не конкурирует)

Язык ставит после проблемы и, следовательно, не конкурирует . Код:

ƒNÂQ–

Объяснение:

ƒ      # For N in range(0, input() + 1)
 N     #   Push N
  Â    #   Bifurcate (pushes N and N[::-1])
   Q   #   Check for equality
    –  #   If true, pop and print N

Использует кодировку CP-1252 . Попробуйте онлайн! ,

Аднан
источник
LʒÂQ4, еще не конкурирует ..
Урна Магического Осьминога
2

Brachylog (2), вопрос о языковых постдатах:

С форматом ввода / вывода, указанным в вопросе, 8 байтов

≥ℕA↔A≜ẉ⊥

Попробуйте онлайн!

С современными правилами ввода / вывода PPCG, 4 байта

≥ℕ.↔

Попробуйте онлайн!

Это функция, которая генерирует все выходные данные, а не полная программа, как в предыдущем примере, и поэтому не соответствует спецификации, как написано, но я подумал, что покажу, как будет выглядеть программа, если бы вопрос был написан современным стандартам ввода / вывода (которые разрешают использование функций и вывод через генераторы).

объяснение

≥ℕ.↔ 
 ℕ    Generate natural numbers
≥     less than or equal to the input
  .   but output only the ones
   ↔  that would produce the same output if reversed

Для полной версии программы мы создаем временную переменную Aдля хранения выходных данных, явно обозначаем ее (это делается неявно для основного предиката программы) и используем хорошо известную ẉ⊥технику для вывода элементов генератора на стандартный вывод.


источник
Когда современные правила ввода / вывода PPCG позволили вам использовать генератор в качестве представления?
Утренняя монахиня
@LeakyNun: я сделал предложение 30 ноября 2016 года , но единодушным является то, что на тот момент они были уже законными (просто не задокументированы). У нас есть явное правило, разрешающее их сейчас; в течение большей части 2016 года они не были явно разрешены, и они также не были явно запрещены.
О, хорошо, я вижу.
Утренняя монахиня
1

питон

n=raw_input('')
for a in range(0,int(n)+1):
    r=str(a)
    if str(a)==r[::-1]:
        print r
user1027046
источник
Хм ... 232 персонажа на самом деле не очень конкурентоспособны. Возможно, вы могли бы сократить имена переменных до одного символа и удалить пробелы между переменными и операторами?
Гарет
Отличная работа. В этом вопросе можно найти несколько полезных советов по игре в гольф на Python: codegolf.stackexchange.com/questions/54/…
Гарет
Вы можете избавиться от n - просто замените int (n) на int (raw_input ()) - и вы можете изменить str (a) на r в операторе if
Омар
1

Groovy, 83

System.in.eachLine{(0..it.toInteger()).each{if("$it"=="$it".reverse())println(it)}}
Armand
источник
1

Q (34 символа)

Передайте n вместо n + 1 в качестве аргумента для этого Q-решения.

{i(&)({all i=(|)i:($)x}')i:(!)1+x}
skeevey
источник
1

Q (33)

{if[x="I"$(|:) -3!x;:x]} each til

Вероятно, более удобный способ сделать это, но в любом случае, пример использования (вы вводите n + 1, чтобы добраться до n):

q){if[x="I"$(|:) -3!x;:x]} each til  10
0 1 2 3 4 5 6 7 8 9

Предложение от tmartin, сводится к 29:

({$[x="I"$(|:) -3!x;x;]}')(!)

То же использование.

sinedcm
источник
1

Python, 106 символов

import sys as a
print(type(a.argv[1]))
for x in range(int(a.argv[1])+1):
 x=str(x)
 if x==x[::-1]:print(x)

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

python a.py 500
Ашвини Чаудхари
источник
1

C # ( 217 214 191 символ)

Гольф версия:

using System;using System.Linq;class P{static void Main(){int n=int.Parse(Console.ReadLine());do{var t=(n+"").ToArray();Array.Reverse(t);Console.Write(n+""==new string(t)?n+"\n":"");}while(n-->0);Console.ReadLine();}}

Удобочитаемый:

using System;
using System.Linq;
class P
{
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        do
        {
            var t = (n + "").ToArray();
            Array.Reverse(t);
            Console.Write(n + "" == new string(t) ? n + "\n" : "");
        } while (n-->0);

        Console.ReadLine();
    }
}

Это выводит палиндромы в порядке убывания, используя оператор n -> 0. (как n идет к 0).

* Отредактированная версия заменяет do ... while на while, сохраняя 3 символа, но теперь вы должны ввести с n + 1.

using System;using System.Linq;class P{static void Main(){int n=int.Parse(Console.ReadLine());while(n-->0){var t=(n+"").ToArray();Array.Reverse(t);Console.Write(n+""==new string(t)?n+"\n":"");}Console.ReadLine();}}

* отредактировано: найден лучший способ перевернуть строку без преобразования в массив:

using System;using System.Linq;class P{static void Main(){int n=int.Parse(Console.ReadLine());while(n-->0)Console.Write(n+""==string.Join("",(""+n).Reverse())?n+"\n":"");Console.ReadLine();}}

Удобочитаемый:

using System;
using System.Linq;
class P
{
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        while (n-->0)
            Console.Write(n + "" == string.Join("", ("" + n).Reverse()) ? n + "\n" : ""); 
        Console.ReadLine();
    }
}
Xantix
источник
1

PHP 53

Может ли 53 быть ниже? Четыре разных варианта:

for($i=$argv[1];$i-->0;)echo$i==strrev($i)?"$i\n":"";
for($i=$argv[1];$i-->0;)if($i==strrev($i))echo"$i\n";
while(($i=$argv[1]--)>0)echo$i==strrev($i)?"$i\n":"";
while(($i=$argv[1]--)>0)if($i==strrev($i))echo"$i\n";

Если вы хотите получить фанк ...

PHP 47

while(($i=$argv[1]--)>0)if($i==strrev($i))`$i`;

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

jdstankosky
источник
1

Пиф, 11

VhQIq`N_`NN

Пример:

$ pyth -c 'VhQIq`N_`NN' <<< 200
0
1
2
3
4
5
6
7
8
9
11
22
33
44
55
66
77
88
99
101
111
121
131
141
151
161
171
181
191
isaacg
источник