Послідовність квадратування


29

Кожен член у послідовності квадратування, x n , створюється шляхом взяття x n-1 , відведення квадрату та видалення всіх, крім перших чотирьох цифр.

Послідовність завжди починається з x 1 = 1111 . При квадраті цього виходить 1234321, тому х 2 = 1234

Перші кілька термінів:

1111
1234
1522
2316
5363
...

Змагання

Ваше завдання - задати невід'ємне ціле число n обчислити х n . Ви можете подати повну програму, яка виконує введення-виведення, або функцію, яка приймає n як параметр.

Ваше рішення може бути нульовим або індексованим, доки ви вкажете, який.

Оскільки всі терміни в цій послідовності коротші, ніж 5 цифр, ваш код також повинен бути максимально коротким. Застосовуються стандартні лазівки з .

Нехай переможе найкращий гольфіст!


Випробування

Примітка. Вони є 1-індексованими.

1   -> 1111
8   -> 6840
15  -> 7584
20  -> 1425
80  -> 4717

Відповіді:



24

JavaScript (ES7), 44 43 36 байт

f=n=>--n?(f(n)**2+f).slice(0,4):1111

Це чудовий приклад зловживання типом примусу: **перетворює обидва його аргументи в числа і +перетворює обидва його аргументи в рядки, якщо вони обидва числа. Це означає, що f(n)**2+fспочатку перетворюється f(n)на число і квадрат його, а потім з'єднує результат із представленням рядка f. Потім ми можемо використовувати .sliceдля отримання перших 4 символів рядка.

Ось кілька альтернативних підходів, які не використовують рядки:

f=(n,x=1111)=>x<1e4?--n?f(n,x*x):x:f(n,x/10|0)
f=n=>--n?(x=f(n))*x/(x>3162?1e4:1e3)|0:1111

Фрагмент тесту

Примітка. Це використовується, Math.powоскільки **підтримується не в усіх браузерах.


6

Haskell, 40 байт

((iterate(read.take 4.show.(^2))1111)!!)

Це послідовність на основі 0. Приклад використання: ((iterate(read.take 4.show.(^2))1111)!!) 79-> 4717.

Як це працює:

iterate (   ) 1111               -- repeatedly apply a function starting
                                 -- with 1111 and collect the results in a list
                                 -- the function is
           (^2)                  -- square
        show                     -- turn into string
     take 4                      -- take the first 4 chars
  read                           -- turn back to number
                     !!          -- finally pick the nth element from the list         

6

Математика, 48 байт

Nest[⌊10^(3-⌊t=2Log[10,#]⌋+t)⌋&,1111,#]&

Безіменна функція, що приймає цілий аргумент; 0-індексований. Використовує чотири трибайтові символи ⌊⌊⌋⌋: Mathematica використовує Floor[x]або ⌊x⌋для округлення реального числа до цілого числа, а останній, як правило, на один менший байт. Імена команд у Mathematica для перетворення цілих чисел у рядки занадто довгі, тому замість цього робимо математичний обчислення, щоб знайти перші чотири цифри x ^ 2: беремо логарифм base-10 з x ^ 2, віднімаємо його цілу частину, піднімаємо 10 поверніться до цієї сили і помножте на 1000 і округніть вниз.

tl; dr: логарифми ftw


6

Пітон 2, 51 46 44 байт

Я хотів би позбутися від незграбного, ifякщо можливо, але я думаю, що execможе бути коротшим. Виходить на той момент, який execкоротший. Неправильно знову! Рекурсивна функція повертається. Це одноіндексований.

f=lambda n:1111*(n<2)or int(`f(n-1)**2`[:4])

Алетеративний 46-байтний розчин з exec:

s=1111;exec's=int(`s*s`[:4]);'*input();print s

Альтернативне 49-байтне рекурсивне рішення:

f=lambda n,s=1111:s*0**n or f(n-1,int(`s*2`[:4]))

Завдяки Flp.Tkc за збереження байта, нагадуючи мені, що квадратик не потребує експоненції :)


Ще 46 байт-рішення:f=lambda n:1111if n<2else int(`f(n-1)**2`[:4])
акроліт

@daHugLenny, якого насправді може бути 45: repl.it/EejD
FlipTack

1
@ Flp.Tkc А це насправді може бути 44;)
Каде

5

V , 19 байт

4é1Àñ|C="*"
5|D

Спробуйте в Інтернеті!

Для цього використовується індексація на основі 0.

Звичайно, оскільки цифри не точно V- форте , це не дуже сильно. Однак це показує одну приємну перевагу, яку V має над vim. Ви можете запустити макрос 0 разів, що неможливо в vim, оскільки "0" - це команда не рахується.

Тут міститься багато недрукованих символів, тому ось шестинадцять:

0000000: 34e9 31c0 f17c 4312 3d12 222a 1222 0a1b  4.1..|C.=."*."..
0000010: 357c 44                                  5|D

І ось читана версія:

4é1Àñ|C<C-r>=<C-r>"*<C-r>"
<esc>5|D

Пояснення:

4                           " 4 times:
 é1                         " Insert a '1'
   Àñ                       " Arg1 times:
     |                      "   Move to the first character on this line
      C                     "   Delete this whole line and enter insert mode
       <C-r>=               "   Insert the following evaluated as vimscript:
             <C-r>"         "     Insert what we just deleted
                   *        "     Times
                    <C-r>"  "     What we just deleted
<esc>                       "   Escape to normal mode
     5|                     "   Move to the fifth column on this line
       D                    "   And delete until the end of this line
                            " The second 'ñ' is added implicitly

5

Желе , 12 9 байт

-3 байти завдяки Деннісу, що використовує індексацію на основі 1 та атом форми / переформатування. Пропозиції з гольфу вітаються! Спробуйте в Інтернеті!

²Dṁ4Ḍ
1Ç¡

Ungolfing

Helper link
²       Square.
 D      Integer to decimal (a list of digits).
  ṁ4    Mold/reshape list_of_digits to be 4 digits long.
    Ḍ   Decimal to integer.

Main link: implicit left argument n
1     Start with the nilad 1.
 Ç¡   Call the helper link n times.

Це економить 3 байти за допомогою індексації на основі 1.
Денніс

Ага, я не думаю, що можна використовувати 1замість цього ⁽¡n.
Ерік Атголфер

@EriktheOutgolfer Як так?
Шерлок9,

@ Sherlock9 О, ти, здається, 1-індексує цю послідовність? Гм, схоже, що код трохи складний, щоб зрозуміти ...
Ерік Аутгольфер

4

Perl, 37 байт

36 байт коду + -pпрапор.

$\=1x4;$\=substr$\*$\,0,4while--$_}{

Щоб запустити його:

perl -pe '$\=1x4;$\=substr$\*$\,0,4while--$_}{' <<< 80

4

Powershell, 73 55 байт

Величезне спасибі TimmyD за гоління 18 байт!

Код:

for($A=1111;$args[0]---1;$A=-join"$(+$A*$A)"[0..3]){}$A

$A=1111;1..($n=2)|%{[string]$B=[math]::pow($A,2);$A=$B.substring(0,4)};$A

$nдорівнює n в x n-1

Пояснення та підірваний код:

$A=1111                            #starting number
$n=4                               #n in formula
for($i=0; $i -lt $n;$i++)          #loop n times
{
    [string]$B=[math]::pow($A,2)   #create a new string $B and set it to $A raised to the power of 2
    $A=$B.substring(0,4)           #set $A to the first 4 characters of $B
}
$A                             #print $A

Деякі примітки:

  • Powershell дозволяє призначити змінні тим самим операторам, де ви посилаєтесь на них. Наприклад, 1..($n=4)|%встановить $ n до 4, а потім запустить цикл, який працює $ n разів. 1може бути змінено на будь-яке ціле число, і воно буде циклічно $ n- [ваше ціле число] +1 раз.
  • Тип даних за замовчуванням при використанні [math]::в Powershell - подвійний. У наведеному вище коді ми маємо явно $Bпередати рядок, щоб ми могли подзвонити .substring()по ньому, оскільки .substring()в Powershell немає функції для парних.

4

Python 2,  44  41 байт

-3 байти завдяки xnor (використовуйте ціле ділення, щоб уникнути and)

f=lambda n:int(1/n*1111or`f(n-1)**2`[:4])

repl.it

1-заснована рекурсивна функція.

Коли n>1ціле ділення, 1/nприводить до того 0, 0*1111=0що є фальсі, тому orоцінюється право значення, яке приймає перші чотири символи подання квадрата- n-1го результату; Потім це передається до int.

Коли n=1ціле ділення, 1/nпризводить до 1, то 1*1111=1111, що є truthy, а відступ int 1111до a intє 1111.


Хороший, ніндзя мене на один байт!
FlipTack

Я просто шукав вашу відповідь і тоді зрозумів, що ви написали виклик! Хороша робота.
Джонатан Аллан

1
Гарна ідея з виведенням intназовні. Якщо ви маєте 1-індекс, ви можете зробити базовий регістр коротшим g=lambda n:int(1/n*1111or`g(n-1)**2`[:4]).
xnor

1
"Перекреслений 44 все ще виглядає як 44 :("
FlipTack

1
@ Flp.Tkc не так сильно, як це без &nbsp;s!
Джонатан Аллан



3

MATL , 14 , 13 байт

1111G:"UV4:)U

Спробуйте в Інтернеті!

Пояснення:

1111            % Push 1111
    G           % Push input
     :"         % Input times:
       U        %   Square the top of the stack
        V       %   Convert it to a string
         4:)    %   Take the first four digits
            U   %   Convert it back to a number
                % Implictly display

2
Ви можете використовувати U(квадрат, для числового введення), що позначаєтьсяt*
Луїс Мендо

1
@LuisMendo Дякую за нагадування про функцію, яку я рекомендував! : P
DJMcMayhem

3

R, 58 56 55 53 байт

x=3334;for(e in N<-scan():1)x=x^2%/%10^(3+(x>3162));x

Бере Nзі стдін. 3334 - це практично X_0, що потрібно, оскільки цикл for-циклу потрібно виконати хоча б один раз (пропустити його було б довше).

R дійсно є жахливою мовою прийняття перших чотирьох цифр числа, але оскільки кількість випадків обмежена, нам залишається лише турбуватися про квадрати x<3163і x>3162, коли перший дає 6-значний номер, другий - 7-значний номер .

Решта досить прямолінійна, %/%розділяє і ігнорує залишок. xдрукується у stdout.

Збережено 2 байти завдяки @ETHproductions


Це так неривіально. Блискуче!
Андрей Костирка

1
Хороший! Що було б, якби ви почали 3334(або можливо 3333)?
ETHproductions

@ETHproductions 3333^2 = 11108889так дасть результат 1110, і .... як я перевіряю це, я бачу, що 3334це спрацює: | . Не впевнений, чому я більше цього не перевіряв.
JAD

3

Явагонія - 153 байти

Javagony є обмеженою версією Java, яка не дозволяє контролювати будь-який потік, крім рекурсії і try-catch, ні для циклів, циклів або if. Кодування в ньому - досить весела вправа, але засмучує. Не те, що звичайна Java сама по собі не так розчаровує.

int a(int i){return a(i-1,1111);}int a(int i,int n){try{int x=1/i;return a(i-1,Integer.parseInt((n*n+"").substring(0,4)));}catch(Exception e){return n;}}

3

PHP, 55 52 байти

Збережено 3 байти завдяки @ user59178

for($i=1111;$argv[1]--;)$i=substr($i**2,0,4);echo$i;

Запустити з командного рядка, нульового індексу.

Дякуємо, що не піклуєтесь про тип моїх змінних, PHP! Тут ми просто розбиваємо число і обрізаємо все, що минуло перші 4 цифри, недбало чергуючи число і рядок, не піклуючись про це у світі.


Ви можете зберегти 3 байти, використовуючи $argv[1]--як лічильник циклу.
user59178


2

C, 56 байт

a;s(n){for(a=1111;--n;)a=a*a/(a>3162?1e4:1e3);return a;}

Одноіндексовані.


1
У мене таке відчуття, що ти можеш піти на рекурсію ...
Мукул Кумар

2

Clojure, 76 байт

(defn s[n](if(= n 1)1111(read-string(subs(str(*(s(dec n))(s(dec n))))0 4))))

Перший гольф Clojure (здається, приємна мова). Це 1-індексований.

Пояснимо код пізніше.


2

C #, 64 60 байт

Збережено 4 байти, дотримуючись коментаря Олів'є Грегоара щодо відповіді на Java!

n=>{int x=1111;for(;n-->1;)for(x*=x;x>1e4;x/=10);return x;};

Попередня версія ( 64 байти ):

n=>{int x=1111;while(n-->1){x*=x;while(x>9999)x/=10;}return x;};

Повна програма з методом unolfolf та тестовими кейсами:

using System;

namespace SquaringSequence
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int, int> f = n =>
            {
                int x = 1111;
                while (n-- > 1)
                {
                    x *= x;
                    while (x > 9999)
                        x /= 10;
                }
                return x;
            };

            // test cases:
            Console.WriteLine(f(1));    // 1111
            Console.WriteLine(f(8));    // 6840
            Console.WriteLine(f(15));   // 7584
            Console.WriteLine(f(20));   // 1425
            Console.WriteLine(f(80));   // 4717
        }
    }
}

1
+1 для темного n-->1
переходу

2

Рубін, 47 байт

Перший гольф! Зберігає байти за допомогою -nпараметра (але все ж рахується як 1! :)).

a=1111;$_.to_i.times{a="#{a*a}"[0,4].to_i};p a

0-індексований. Щоб запустити його:

ruby -ne 'a=1111;$_.to_i.times{a="#{a*a}"[0,4].to_i};p a' <<< 80

Ласкаво просимо на сайт, і приємна перша відповідь! Один ниткоп, але технічно це 47 байт через нашу політику підрахунку прапорів командного рядка до кількості байтів. Крім цього, мені це добре виглядає!
DJMcMayhem

Спасибі! Не знав правил, відповідь змінили!
ghivert

2

Pyth, 13 12 байт

Дякуємо @Jakube за -1 байт

us<*4`*GG4Q1

Програма, яка приймає введення 1-індексованого цілого числа і друкує результат.

Тестовий набір

Для цього використовується аналогічний підхід до відповіді @ Аднана .

Як це працює

us<*4`*GG4Q1  Program. Input: Q
u         Q1  Execute the following Q times, starting at 1, with variable G:
      *GG      Yield G*G
     `          Convert to string
   *4           Repeat 4 times
  <      4      Yield first 4 characters
 s              Convert to integer
              Implicitly print

1
*GGзамість^G2<space>
Якубе


1

Пакет, 82 байти

@set n=1111
@for /l %%i in (1,1,%1)do @set/an*=n&call set n=%%n:~0,4%%
@echo %n%

Як і Perl, цілі числа - це рядки, але на відміну від Perl, я можу взяти лише підрядку змінної, а введення підрядків у цикл дещо незручне.


Я думаю, що ви можете залишити місце після @for.
YourDeathIsComing

@YourDeathIsComing "для" не розпізнається як внутрішня чи зовнішня команда, функціонуюча програма чи пакетний файл.
Ніл

1

Perl 6 , 36 байт

{(1111,{+$_².substr(0,4)}...*)[$_]}

Пояснення:

{                                 } # bare block lambda
  1111,                  ...        # sequence generator
                            *       # without a limit
       {                }           # lambda used to generate the next value
         $_²                        # start by squaring the previous value
            .substr(0,4)            # take only the first four digits
        +                           # make it numeric ( not necessary )
 (                           )[$_]  # return the requested value

Тест:

say {(1111,{+$_².substr(0,4)}...*)[$_]}( 1,8,15,20,80 X- 1 ).perl
# (1111, 6840, 7584, 1425, 4717)

1

Матлаб, 79 , 78 байт

function a=s(n)
if n<2;a=1111; else f=s(n-1);a=fix(f^2/10^(3+(f>1e7^.5)));end

Тестові приклади:

s(79) = 2172
s(49) = 8059
s(6)  = 2876

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

Редагувати: Поголив байт, встановивши 0,5 -> .5


1

Java 8, 77 93 74 71 69 78 байт

int n=1111;int m=1;while(x>m++){n=Integer.parseInt((n*n+"").substring(0,4));}

x->{int n=1111;int m=1;while(x>m++){n=Integer.parseInt((n*n+"").substring(0,4))‌​;}return n;}

x->{int n=1111;for(;--x>0;){n=Integer.parseInt((n*n+"").substring(0,4));}}

x->{long n=1111;for(;--x>0;){n=Long.valueOf((n*n+"").substring(0,4));}}

x->{long n=1111;for(;--x>0;)n=Long.valueOf((n*n+"").substring(0,4));return n;}

Кожне повторення складає nперші 4 символи n*n.

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

Історія публікацій:

  • 77 байт: початковий код (неповний)

  • +16 байт, Олів'є Грегоар: завершено код, зробивши його функцією "Лямбда".

  • -19 байт: замінити while з forциклом.

  • -4 байти: використовується longs замістьint s

  • -2 байти, автор Роман Гряф: видалено непотрібні дужки

  • +9 байт, відсутність returnзаяви

Спасибі @ OlivierGrégoire та @ RomanGräf за вказівку на деякі проблеми!

Зачекайте, Java б'є ... (барабанне) Clojure і Matlab тут! Великі оплески Java будь ласка!


2
Ця відповідь неповна. xне оголошено. Це має бути функція або повна програма. Не фрагмент коду.
нелінійний

@NonlinearFruit Я збирався на функцію. Здається, я пропустив це. Ви маєте на увазі, що я повинен просто замінити х цифрою?
РудольфДжелін

1
Що сказав @NonlinearFruit, це те, що ваша відповідь із вашим поточним кодом повинна бути такою: x->{int n=1111;int m=1;while(x>m++){n=Integer.parseInt((n*n+"").substring(0,4));}return n;}(загальна кількість байтів - 91). Це тому, що фрагменти заборонені: лише функції або повноцінні програми.
Олів'є Грегоар

@ OlivierGrégoire Це не 93 байти? І дякую за вказівку лямбда-функцій.
Рудольф Джелін

Ви маєте рацію, це 93 байти, я повинен був перевірити попередню, дефектну версію. Однак все, що я робив, було обгортання, щоб ваша програма була дійсним записом. Тепер ви можете грати в пекло від цього! Наприклад, ось версія для вашої програми для гольфу на всього 75 байт: x->{Long n=1111;for(;--x>0;)n=n.valueOf((n*n+"").substring(0,4));return n;}з декількома прийомами, які використовуються (використовувалася Longдля використання Long.valueOfз меншим числом байтів, вона не рекомендується в звичайному програмуванні, але повністю в гольфі; видаляється, mоскільки це зайве, якщо ми зменшимо xнатомість зняли непотрібні брекети)
Олів'є Грегоар

1

Perl, 36 байт

Інший підхід від іншого рішення Perl, що призводить до дещо коротшого коду. Аргументи командного рядка не потрібні (крім звичайного аргументу вибору версії -M5.010, який не рахується з кількістю байтів), це означає, що це та сама кількість коду, але з меншою кількістю штрафних санкцій, що дає кращу загальну оцінку.

say+eval'($&*$&||1x4)=~/(....)/;'x<>

Ми створюємо цикл Underload-стилю за допомогою повторення та eval-ing рядка; Я експериментував із початком струни посередині, але запуск її на старті виявляється найкоротшим. Ми множимо $&(результат останнього збігу з регулярними виразами) на себе на квадрат; якщо нуль результату, ми використовуємо 1x4(тобто 1111; Perl має оператор для повторення речей, включаючи цифри числа) замість результату. Потім регексуємо перші чотири символи. Вся справа працює в контексті списку завдяки знаходженню всередині say, таким чином, кінцевим результатом evalзаповіту буде вміст круглих дужок остаточного збігу.


1

Java, 79 67 66 64 байт

  • Версія 2.2 / 64 байти:

Завдяки @Oliver Grégoire

int a(int i){i=i<2?1111:a(--i);for(i*=i;i>1e4;)i/=10;return i;}
  • Версія 2.1 / 66 байт:

Завдяки @ETHProduction

long a(long i){i=i<2?1111:a(--i);for(i*=i;i>1e4;)i/=10;return i;}
  • Версія 2.0 / 67 байт:

Замінив підрядку та матеріали з ідеєю від @Xanderhall

long a(long i){i=i<2?1111:a(--i);i*=i;for(;i>1e4;)i/=10;return i;}
  • Версія 1.0 / 79 байт:

Хоча є і більш короткі рішення, я хотів опублікувати один рекурсивний :). І я найкоротша "реальна" функція :). Редагувати: Здається, я зараз найкоротший :)))

long a(long i){i=i<2?1111:a(--i);return Long.valueOf((i*i+"").substring(0,4));}

Можна зробити for(i*=i;i>1e4;)i/=10;? Це врятувало б байт.
ETHproductions

Хммм ... Що стосується вашої претензії щодо найкоротшої функції Java, у цій функції хотілося б мати кілька слів ;-)
Олів'є Грегоар

Гммм, думаючи про це, навіщо ти взагалі використовуєш longs? Можна вбити два байти за допомогою ints.
Олів'є Грегоар

Я пропустив це, коли я оновився до 2.0
Роман Гряф

1

Пушистий , 26 20 байт

1111@:2esL4-:.;Kjk;#

Наведіть аргументи в командному рядку: $ pushy sqseq.pshy 79 .

Добре відформатований з поясненням:

            % Implicit: N is on stack
1111@       % Push 1111, and then reverse stack to get [1111, n]
:           % N times do: (this consumes N)
 2e         %   Square last term
 s          %   Split into individual digits
 L4-:.;     %   Get stack length -4, pop that many times
 Kj         %   Join remaining digits (Uses flag "K" for whole stack)
 k          %   Set "K" flag to false, so operations only affect last item
;           % End loop.       
#           % Output final calculated term
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.