Перерахуйте всі паліндромні числа (у десятковій) між 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, ...

Це кодовий гольф, приз якого збирається найменше символів. Паліндромні числа повинні виводитись по одному на рядок до stdout. Програма повинна читати n з командного рядка або stdin.


3
Між 1 і n (за заголовком) або 0 і n (за тілом)? І який з меж включає "між"?
Пітер Тейлор

@wok: Ви все ще не відповіли, чи це діапазон включно чи ексклюзивно? Чи nварто включити в асортимент?
mellamokb

@mellamokb Інклюзивний діапазон.
Вок

Відповіді:


7

Гольфскрипт, 15 символів

~),{.`-1%~=},n*

Ви можете зберегти знак порівняння рядків замість чисел '~), {`.-1% =}, n *'.
Говард

@Howard, якщо ви хочете опублікувати це самостійно, я його схвалюю.
Пітер Тейлор

Це відчувало б, як просто копіювати ;-)
Говард

10

Перл 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..<>

Якщо ніхто з інших не кваліфікується.


Ви б настільки люб'язно пояснили, що робить $ / робить?
Gurzo

1
@Gurzo $/- це роздільник запису вхідних даних, який за замовчуванням відповідає новому рядку . Це просто трохи коротше, ніж буквальне "\n".
варення

Використання карти коротше:map{say if$_==reverse}0..<>
jho

2
@jho зло. Надішліть його :)
хобби

1
Якщо ви використовуєте -Eзамість цього -e, ви отримуєте sayбезкоштовно.
tchrist

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*,^
            ^                      <

Цікаво, чи зміг би я зробити це меншим за допомогою перестановки шляхів ...

Редагувати: покрасьте верхню частину, щоб уникнути зайвої лінії.


8

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

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

Читає аргумент від stdin.


7

Рубін 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}

Рохіт запропонував зберегти 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

Я можу прочитати! :) Приємно
дефль

btw, щоб відповідати вимозі вихідних номерів один на рядок, який слід додати ,"0.
дефл

@defhlt також ,.працює
Bolce Bussiere

5

Пітона, 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



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()не потрібно строго параметрів.
Clueless

Тим НЕ менше, ви можете використовувати параметри , 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 до числа символів, коли ви виправите це.
Thomas Eding

3

Perl - 43 символи

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

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



2

PHP 64 58

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

Змінено $ _GET ['n'] на $ argv [1] для введення командного рядка.


2

Scala 59

(0 to readInt)filter(x=>""+x==(""+x).reverse)mkString("\n")

Я не знаю жодної Scala, але чи справді це друкується на stdout? Я б здогадався, що це вираз, що повертає рядок.
Омар

В інтерактивній шкалі 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

Редагувати: дякую Томасу


Ви можете видалити {S навколо для петлі і зніміть простір , echo "$i\n"щоб отримати echo"$i\n". Це допоможе вам заощадити кілька символів. Крім того, якщо ви хочете бути нахабними, ви можете змінити \nна `` і зберегти знак.
Thomas Clayson

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



2

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

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

Майте кращу відповідь на це питання. Це конкретно Befunge-93; Можливо, я міг би зробити його ще більш компактним з Befunge-98. Я включу це в майбутньому редагуванні.

Оскільки ви не можете керувати струнами в Befunge, найкраще, що я міг зробити, - це обчислити зворотну цифру кожного числа (що мене здивувало, що я міг керувати без pі g) і порівняти його з початковим номером. Зворотна цифра займає більшу частину коду (в основному весь третій та четвертий рядки).

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


+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ʒÂQ- 4, все ще не конкуруючи ..
Magic Octopus Urn

2

Брахілог (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 дозволили використовувати генератор в якості подачі?
Leaky Nun

@LeakyNun: Я зробив цю пропозицію 30 листопада 2016 року , але консенсус полягає в тому, що вони вже були законними на той момент (просто не задокументовані). У нас є чітке правило, яке дозволяє їм зараз; протягом більшої частини 2016 року їх забороняли явно, і їх також не забороняли.

О, добре, я бачу.
Leaky Nun

1

Пітон

n=raw_input('')
for a in range(0,int(n)+1):
    r=str(a)
    if str(a)==r[::-1]:
        print r

Хм ... 232 символи не дуже конкурентоспроможні. Можливо, ви могли б зменшити імена змінних до одного символу та видалити пробіли між змінними та операторами?
Гарет

Хороша робота. Деякі хороші поради щодо гри в гольф Python можна знайти в цьому запитанні: codegolf.stackexchange.com/questions/54/…
Гарет

Ви можете позбутися від n - просто замінити int (n) на int (raw_input ()) - і можете змінити str (a) на r в операторі if
Омар


1

Q (34 знаків)

В якості аргументу для цього рішення Q введіть n, а не n + 1.

{i(&)({all i=(|)i:($)x}')i:(!)1+x}


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;]}')(!)

Те саме використання.


1

Пітон, 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, зберігаючи 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();
    }
}

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

Ви повинні проігнорувати текст помилки. Однак числа паліндром все ще виводяться в командний рядок.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.