Codegolf - На Основе Палиндромов

  • Автор темы Dmitriy 1402
  • Обновлено
  • 22, Oct 2024
  • #1

Палиндромное число для напоминания — это любое число, которое читается одинаково как в прямом, так и в обратном направлении. А как насчет палиндромов в других базах?

Вход

Любое целое число 9->{0,1,2,3,4,5,6,7,8,10,20,30,40,50,60,70,80,82,91,100,109,118,127,136,145,154,164,173,182,191,200,209,218,227,236,246,255,264,273,282,291,300,309,318,328,337,346,355,364,373,382,391,400,410,419,428,437,446,455,464,473,482,492,501,510,519,528,537,546,555,564,574,583,592,601,610,619,628,637,646,656,665,674,683,692,701,710,719,728,730,820,910,1000} where 2->{0,1,3,5,7,9,15,17,21,27,31,33,45,51,63,65,73,85,93,99,107,119,127,129,153,165,189,195,219,231,255,257,273,297,313,325,341,365,381,387,403,427,443,455,471,495,511,513,561,585,633,645,693,717,765,771,819,843,891,903,951,975} .

Выход

Все целые числа по основанию 10 от 0 до 1000 включительно, являющиеся палиндромами по основанию b. Выходные данные могут представлять собой либо список целых чисел, либо целые числа, разделенные разделителем, например запятой или новой строкой.

Тестовые случаи

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,525,535,545,555,565,575,585,595,606,616,626,636,646,656,666,676,686,696,707,717,727,737,747,757,767,777,787,797,808,818,828,838,848,858,868,878,888,898,909,919,929,939,949,959,969,979,989,999}

Input->Output

b > 1

b

#code-golf #base-conversion #палиндром

Dmitriy 1402


Рег
08 Sep, 2006

Тем
85

Постов
190

Баллов
615
  • 26, Oct 2024
  • #2

Питон 3, 78 байт

Выводит числа в порядке убывания

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 [ 1e3 [0,b] swap '[ _ >base dup reverse = ] filter ]
 
, and short-circuits with a b->{ // Method with Integer parameter and no return-type for(int i=-1;i++<1e3;){ // Loop `i` in the range [0,1000]: var s=b.toString(i,b); // Convert `i` to base-`b` as String if(s.contains(new StringBuffer(s).reverse())) // If this String is a palindrome: System.out.println(i);}} // Print `i` with trailing newline

b->{for(int i=-1;i++<1e3;){var s=b.toString(i,b);if(s.contains(new StringBuffer(s).reverse()))System.out.println(i);}}

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

f_IjTQUh^T3 | Explanation ------------+--------------------------------------- f | filter Uh^T3 | the range [0, 1001) jTQ | on whether each number in base <input> _I | equals itself reversed recurses until f_IjTQUh^T3 и ошибки, поскольку деление на ноль не определено.

Питон 3, 76 байт

Мы можем сократить ответ на 2 байта, если разрешен вывод с плавающей запятой.

. as $a | # Assign the input to $a. range(1001) | # For every item in [0..1000]: select ( # Filter out all items where: [ while(. > 0; # The list of quotients from repeatedly . / $a | floor) # short-dividing by $a |. % $a] # And then modulo-ing by $a | reverse == .) # is equal to its reverse ```

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

 

Dr.Web


Рег
05 Feb, 2011

Тем
72

Постов
188

Баллов
588
  • 26, Oct 2024
  • #3

С (ГКК) вперед, 118 117 115 байт

. as$a|range(1001)|select([while(.>0;./$a|floor)|.%$a]|reverse==.)

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

С (ГКК), назад, 115 113 байт

k1'⁰τḂ⁼

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

Объяснение

Подпись С:

M

Перебирает все числа от 0 до 1000, преобразует их в базу. param($u)0..1e3|?{for($b=@();$_=($_-($b+=$_%$u)[-1])/$u){}"$b"-eq$b[11..0]} by hand, then checks if it is a palindrome.

Обратная версия делает то же самое, но наоборот.

Выводит соответствующие числа через запятую на стандартный вывод.

Версия без гольфа

b=>{for(i=-1;i<1e3;){j=[],k=++i;while(k|=0)j.push(k%b),k/=b;''+j==j.reverse()&&print(i)}}

Спасибо Арно за -1 байт!

Спасибо Тоби Спейту за -2 байта!

 

Vadim33


Рег
27 Mar, 2011

Тем
67

Постов
227

Баллов
572
  • 26, Oct 2024
  • #4

05AB1E, 7 байт

.to_s

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

Объяснено

->b{(0..1e3).select{|k|(k=k.to_s b)==k.reverse}} ||answer||

Желе, 7 байт

->b{(0..1e3).select{(a=(g=->k,r=[]{k>0?g[k/b,r<<k%b]:r})[_1])==a.reverse}}

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

Как это работает

function(b) for(i in 0:1000) # loop i through zero to 1000 if(!i # if i is zero (always a palindrome), || # or all( # if all the digits of (a=i%/%b^(0:log(i,b))%%b) # a = the representation of i in base b ==rev(a)) # are the same as themselves reversed )cat(i,'') # output this i ||answer||

Япт, 11 байты

function(b)for(i in 0:1e3)if(!i||all((a=i%/%b^(0:log(i,b))%%b)==rev(a)))cat(i,'')

Попробуйте это

 

Ied869skestSoky


Рег
13 Jan, 2011

Тем
80

Постов
191

Баллов
611
  • 26, Oct 2024
  • #6

JavaScript (ES6), 87 86 байт

Возвращает строку, разделенную запятыми.

(-:|.)@

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

Как?

(#.inv) ||answer||

Скала, 62 87 байт

  • Исправлено после того, как Сиу Чинг Понг -Аска Кэндзи- указала "0 's (-:|.)@(#.inv)"0 работает только для оснований до 36.
  • Сэкономлено 1 байт благодаря @кубический салат.
#

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

Это довольно просто. Он составляет диапазон от 0 до 1000, затем фильтрует, проверяя, равны ли они своему обратному значению по базе. ] . To convert to base # (как строка), ...#] 's i.@1001 метод использовался, но теперь (...) i.@1001 is used to create a ((-:|.)@(#.inv)"0#])i.@1001 цифр.

 

Blinkov


Рег
21 Sep, 2005

Тем
70

Постов
169

Баллов
579
  • 26, Oct 2024
  • #7

Шелуха, 12 11 байт

Изменить: -1 байт благодаря LegionMammal978.

take n

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

Фактический код «основанного палиндрома» составляет 7 байт ( b&0=[] b&n=mod n b:b&div n b ), but specifying 0...1000 costs 5 4 (thanks to LegionMammal978) more bytes.
Мы могли бы сэкономить байт, если это нормально, чтобы вывести еще несколько палиндромов на основе значений до десятичных 1024 ( n ).

n ||answer||

Древесный уголь, 14 байт

n>0

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

take n ||answer||

Хаскелл, 63 байта

n=0

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

На основе хорошей идеи от ответ dingledooper на Python: чтобы проверить это take n is a base- f палиндром, не генерировать список оснований b&n=take n$mod n b:b&div n b f b=[n|n<-[0..1000],reverse(b&n)==b&n] digits, but reverse lambda b:[i for i in range(1001)if(f:=lambda n:n*[0]and[n%b]+f(n//b))(i)==f(i)[::-1]] как база- & number by running a base-conversion reading digits from the end, and check that the result still equals {x~|x}' .

Код x\'!1001 recursively defines an infix function {&{x~|x}'x\'!1001} который меняет базу i%b&&a (given i%b*a в качестве начального второго аргумента). Определение его внутри INT_MAX guard lets us access the argument 0 в основную функцию, тогда как автономная функция должна будет продолжать передавать его при каждом рекурсивном вызове.

 

Lakmus


Рег
15 Jun, 2005

Тем
83

Постов
205

Баллов
630
  • 26, Oct 2024
  • #8

APL (расширенный диалог), 17 15 байт

Благодаря Разетайм за -2 байта!
Исправлена ​​ошибка благодаря Сиу Чинг Понг!

Требуется происхождение индекса z .

a==0

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

a >= z ||answer||

С - 76 байт

z

Объяснение

Достаточно отличается от моего предыдущего ответа, чтобы его можно было опубликовать отдельно. На этот раз мы полностью переворачиваем число, а затем сравниваем его с оригиналом. Поэтому нам не нужно удалять конечные нули или особые случаи. a .

z

Этот метод надежно работает для a up to void fun(int b) { for (int i = 1001; --i;) { if (i%b) { /* no leading/trailing zeros */ for (int a = i, z = 0; a != 0; a /= b) { if (a==z) { printf("%d ",i); } z = z*b + a%b; if (a==z) { printf("%d ",i); } } } } puts("0"); } и i=1001,a,z;f(b){for(;--i;)for(a=i,z=0;i%b*a;a/=b)if(a==z||a==(z=z*b+a%b))printf("%d ",i);puts("0");} up to i или соответствующие эквиваленты, если мы изменим используемый целочисленный тип. Для беззнаковых типов (или с gcc -fwrapv ), it should work for the full range of INT_MAX .

 

Nazy


Рег
16 May, 2005

Тем
73

Постов
211

Баллов
606
  • 26, Oct 2024
  • #9

С, 100 байт

b

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

Негольфированный код

INT_MAX/b

Объяснение

При этом сначала выводятся самые высокие числа, поскольку конкретный порядок не указан. Для каждого числа кандидатов мы уменьшаем его (как i ) by successively dividing by the base, using the remainder to build up the reverse number (in void fun(int b) { for (int i = 1001; i--;) { int z = 0; for (int a = i; a != 0; a /= b) { z = z*b + a%b; } if (i==z) { printf("%d ",i); } } } ). Если 0 becomes equal to i=1001,a,z;f(b){for(;i--;i-z||printf("%d ",i))for(a=i,z=0;a;a/=b)z=z*b+a%b;} , то у нас есть палиндром. Обычно мы бы остановились на этом ( ⍝ tradfn taking the base as input ⍳1001 ⍝ the indices up to 1000 ⍵( )¨ ⍝ apply a function to each index as a right argument and the input base as a left argument: ⌽⊤ ⍝ the reverse of the index converted to the input base ≡ ⍝ does it match ⊤ ⍝ the index converted to the input base ⍸ ⍝ all truthy indices in the loop condition), but for golfing, we continue all the way to ⍸⎕(⊤≡∘⌽⊤)¨⍳1001 .

Нам нужно проверить равенство как до, так и после переноса остатка в 0 , to accept both odd and even length palindromes.

Наконец, мы печатаем b , which is always a palindrome, and is easier to special-case than include in the loop.

Метод работает для целых чисел до let if we ungolf the condition 0 вернуться к n , and would also work for other integer types.

 

Toptrace


Рег
08 Jun, 2006

Тем
65

Постов
202

Баллов
577
  • 26, Oct 2024
  • #12

Хаскель, 67 байт

b

b is the function of interest. Попробуйте онлайн!

Возможно, единственным умным моментом здесь является использование n to make a base case for the digit-expansion function. When f b|let 0%m=m;n%m=div n b%(m*b+mod n b)=[n|n<-[0..1000],n==n%0] , Nθ Input the base `b` φ Predefined variable 1000 ⊕ Incremented Φ Filter on implicit range ι Current value ↨ θ Converted to base `b` ⁼ Equals ι Current value ↨ θ Converted to base `b` ⮌ Reversed I Cast to string Implicitly print ignores its argument and so the recursion stops via laziness; when NθIΦ⊕φ⁼↨ιθ⮌↨ιθ , больше точно не будет f # output the truthy values of ŀdḋ9 # series from zero up to one less than 1001 # (decimal interpretation of binary digits of '9') o # based on combination of 2 functions: S=↔ # 1. is it equal to reverse of itself? B⁰ # 2. digits in base given by argument digits so it's safe to keep only the first foS=↔B⁰ŀ□32 . Следующее определение эквивалентно (и одинаково длинно):

foS=↔B⁰

...но foS=↔B⁰ŀdḋ9 version is more fun because it's more confusing. ^_^

 

Godo


Рег
10 Nov, 2008

Тем
77

Постов
201

Баллов
606
  • 26, Oct 2024
  • #13

Дж, 27 байт

Seq

как

  • Seq.unfold - The whole thing is a J hook, meaning that the argument will be the left arg to everything in the parens, and the right arg will be the integers from 0 to 1000: toString
  • BigInt The phrase inside the parens uses copy b чтобы отфильтровать правильный аргумент b by the boolean mask resulting from the phrase on the left of b=>0 to 1000 filter{x=>val y=Seq.unfold(x){q=>Option.when(q>0)(q%b,q/b)};y==y.reverse} :
  • toString - The rank 0 BigInt гарантирует, что фраза применима к каждому отдельному номеру правильного аргумента. Сама фраза сначала преобразует каждое из этих чисел в список цифр в базе, заданной левым аргументом. n => ( // n = input base g = k => // g is a recursive function taking a counter k --k && // decrement k; abort if it's equal to 0 g(k) + ( // otherwise do a recursive call and append the ... ( h = k => // ... result of the recursive function h a = k ? // which builds an array a[] [ k % n, // consisting of each digit of k in base n, ...h(k / n | 0) ] // dividing k by n and taking the integer part : // for the next iteration until k = 0 [] // )(k) + '' // invoke h with k and coerce the result to a string == a.reverse() ? // if this is palindromic: [, k] // append a comma followed by k to the output : // else: '' // just append an empty string ) // )(1001) // initial call to g with k = 1001 , and then checks if that list equals its reverse n=>(g=k=>--k&&g(k)+((h=k=>a=k?[k%n,...h(k/n|0)]:[])(k)+''==a.reverse()?[,k]:''))(1001) . Таким образом, вся фраза вернет 1, если это правда, и 0 в противном случае, и эта логическая маска будет фильтровать правильный аргумент по желанию.

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

 

MariyaOr


Рег
15 Mar, 2014

Тем
81

Постов
185

Баллов
610
  • 26, Oct 2024
  • #14

Р, 82 81 байт

(или 79 байт используя довольно сложный разделитель " Pick[r=0~Range~1000,r-r~IntegerReverse~#,0]& ")

Изменить: -1 байт благодаря caird coinheringaahing

A³ô fÈìU êê

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

Вручную вычисляет цифры в новом базовом представлении и проверяет, совпадают ли они с перевернутыми.

ȷŻbŒḂ¥Ƈ - Main link. Takes a base b on the left ȷ - 1000 Ż - [0, 1, 2, ..., 1000] ¥ - Group the previous 2 links into a dyad f(k, b): b - Convert k to base b ŒḂ - Is this a palindrome? Ƈ - Filter [0, 1, 2, ..., 1000], keeping those k that are true under f(k, b) ||answer||

Рубин 2.7, 74 байта

ȷŻbŒḂ¥Ƈ

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

TIO использует более старую версию Ruby, тогда как в Ruby 2.7 мы пронумеровали параметры, что позволяет сэкономить два байта.


Руби, 48 байт

₄Ý "Push the range [0, 1000]"\ ʒ "and keep the items where:"\ Iв "After being converted to base (input)"\ ÂQ "have its reverse equal to itself"\

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

Не работает для баз выше 64 из-за ограничения в ₄ÝʒIвÂQ method.

 

Faraon_minsk


Рег
13 Apr, 2007

Тем
88

Постов
205

Баллов
665
  • 26, Oct 2024
  • #15

JavaScript (V8), 77 89 байт

Исправлено для баз больше 36.

#include <stdio.h> // A buffer to hold our converted integer. // It is large enough for 1000 in binary. int buffer[11]; // Start and end pointers for buffer int *start, *end; // Loop counter int i; // Temporary int tmp; void f(int base) { // Loop for 0 to 1000 #ifdef BACKWARDS // Loop backwards for (i = 1001; i-- != 0;) { #else // Loop forwards // for (i = 0; i <= 1000; i++) for (i = -1; i++ < 1e3; ) { #endif // Convert to base in buffer, tracking the length in end. for(start = end = buffer, tmp = i; tmp != 0;) { *end++ = tmp % base; tmp /= base; } // Check if it is a palindrome. // Loop while our starting pointer is less than our ending pointer. // tmp will zero at the start thanks to the loop condition. while (end > start) // Assembly style comparison using subtraction. // If *end == *start, tmp will still be zero. // If not, it will be permanently set to non-zero with a binary or. tmp |= *--end - *start++; // If tmp is still zero (meaning it is a palindrome), print. tmp || printf("%d,", i); } }

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

 

Perunov_00


Рег
06 May, 2020

Тем
67

Постов
229

Баллов
594
  • 26, Oct 2024
  • #18

jq, 66 байт

b[11],*p,*x,i,m;f(n){for(i=-1;i++<1e3;){for(p=x=b,m=i;m;*p++=m%n,m/=n);while(p>x)m|=*--p-*x++;m||printf("%d,",i);}}

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

Объяснение

def f(b,n=1e3): r=0;m=n while m:r=r*b+m%b;m//=b n==r==print(n);f(b,n-n/n) ||answer||

Пиф, 11 байт

0

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


f(b,n-n//n) -> f(b,n-1) ||answer||

Java 10, 118 байт

def f(b,n=1000): r=0;m=n while m:r=r*b+m%b;m//=b n==r==print(n);f(b,n-n//n)

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

Объяснение:

ZeroDivisionError ||answer||

Фактор, 53 52 байта

1000 -> 0

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

 

Nightbringer


Рег
13 Oct, 2006

Тем
73

Постов
195

Баллов
580
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно