Усі квадрати, які відповідають послідовності підстановок [закрито]


9

Це надихнуло частину змагань команд ARML 2016 року.

Ось виклик:

Вам надається "послідовність підстановок", яка є послідовністю цифр та іншим символом. Рядок відповідає цій послідовності підказки наступним псевдокодом:

w = wildcard
s = string
# s matches w iff
for all 0 >= i > wildcard.length, w[i] == '?' or s[i] == w[i]

Де "?" - персонаж на ваш вибір.

З точки зору регулярного вираження, уявіть собі, яким '?'буде '.'.

Завдання полягає у пошуку всіх квадратних чисел (вимога до 1 мільйона), представлення десяткових рядків яких відповідає цій послідовності. "Символ підстановки" може бути будь-яким символом ASCII на ваш вибір, якщо, очевидно, це не цифра.

Так , наприклад, 4096сірники 4**6і , 4*9*але 4114не відповідає ні.

Вхідні дані

Введення буде подано у вигляді послідовності, що відповідає регексу [0-9?]+. Це може бути рядок, масив символів або байтовий масив символів ASCII.

Вихідні дані

Вихід буде списком / набором / масивом чисел, що розмежуються за вашим бажанням, які є ідеальними квадратами та відповідають послідовності підстановок.

Приклади дійсних входів:

1234567*90
1234567?90
1234567u90
['1', '2', '3', '4', '5', '6', '7', '*', '9', '0']
[49, 50, 51, 52, 53, 54, 55, 42, 57, 48]
[1, 2, 3, 4, 5, 6, 7, '*', 9, 0]

Приклади дійсних результатів:

[1, 4, 9]
1 4 9
1, 4, 9
1-4-9

тощо.

Технічні умови

  • Ви не можете використовувати вбудовані для пошуку списку квадратів у певному діапазоні
  • Застосовуються стандартні лазівки
  • Ви повинні вміти обробляти до 1 000 000 (1 мільйон)
  • Якщо він надається введенням 1******, його правильно надрукувати [1000000]. Це також правильно друкувати[1000000, 1002001, 1004004, 1006009, 1008016, 1010025, ...]
  • Послідовності підстановок ніколи не починаються із символів підстановки; тобто вони завжди будуть відповідати рядкам однакової довжини.

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

4**6  ->  [4096, 4356]
1**1  ->  [1521, 1681]
1**  ->  [100, 121, 144, 169, 196]
9****9  ->  [908209, 915849, 927369, 935089, 946729, 954529, 966289, 974169, 986049, 994009]
9*9***  ->  [919681, 929296]
1**0*  ->  [10000, 10201, 10404, 10609, 12100, 14400, 16900, 19600]
9***4  ->  [91204, 94864, 97344]

Перемога

Найкоротше (дійсне) (робоче) подання до 14 лютого, перерва внічию та найперша перемога.


1
Думаю, гарним початком зробити це зрозумілішим було б із уточнення, що ?його повинен обрати відповідач.
FryAmTheEggman

2
Чому 25справедлива відповідь на, ***а не на *2*?
Ніл

3
Я думаю, що це було б чистіше, якби числа ніколи не мали провідних нулів, тож лише відповідні послідовності їх довжини.
xnor

@Neil Це була б проблема з моїм власним рішенням. Я прийму пропозицію xnor.
HyperNeutrino

Чи може вхід представляти собою масив одноцифрових цілих чисел та спеціальний символ, наприклад {4, "w", "w", 6}(або ще краще {4, w, w, 6}), а не масив символів, наприклад {"4", "w", "w", "6"}?
Грег Мартін

Відповіді:


0

05AB1E , 22 байти

Напевно, тут багато місця для вдосконалення.
Будь-які нецифрові цифри в порядку, як підстановка.

3°LnvyS¹)ø€Æ0QPyg¹gQ&—

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

Пояснення, щоб прийти після подальшого гольфу.


Здається, це працює для всіх входів. Хороша робота.
HyperNeutrino

1

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

Print@@@IntegerDigits[Range@1*^3^2]~Cases~#&

Вхід - це перелік цифр, у _яких підкреслюється без знаків (без лапок). напр{4, _, _, 6}

Пояснення

Range@1*^3

Створити список {1, 2, 3, ... , 1000}

... ^2

Площа його. (список усіх квадратів від 1 до 1 000 000)

IntegerDigits[ ... ]

Розділіть кожен квадрат на список цифр.

... ~Cases~#

Знайдіть ті, які відповідають шаблону, вказаному вхідним даним.

Print@@@ ...

Роздрукуйте їх.


Здається, це працює для всіх тестових випадків. Хороша робота.
HyperNeutrino

1

Брахілог , 23 байти

@e:{@$|,}a#0:{c.~^#I,}f

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

Пояснення

@e                        Split into a list of characters
  :{@$|,}a                Replace each digit char by the corresponding digit, and each things
                            that are ot digits into variables
          #0              All elements of the resulting list must be digits
            :{       }f   Output is the result of finding all...
              c.            ...concatenations of those digits which...
               .~^#I,       ...result in a number which is the square of an integer #I

Різний формат введення, 13 байт

Залежно від того, що вважаєте дійсним як вхідне, ви можете це зробити:

#0:{c.~^#I,}f

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

що в основному є другою частиною відповіді, наведеною вище, зі списком, що містить введення цифр та змінних, де знаходяться підстановки.

Я не вважаю це дійсним, хоча у Brachylog є лише 26 змінних імен (прописних літер), тож це не спрацює, якби у вас було більше 26 wilcards.


Здається, це працює для всіх входів. Хороша робота. Однак я вважаю, що це 24 байти, оскільки необхідний 1-байтний аргумент. Я не впевнений, як би скоригувати це, як би спрацювало.
HyperNeutrino

1
@AlexL. Аргумент є лише для того, щоб вказати назву вихідної змінної (ви можете використовувати іншу велику літеру, якщо хочете). Це схоже на відповіді в Prolog / мовах з функціями, де предикат / функція названа, але ви насправді не рахуєте байти, якими користуєтесь, коли ви її викликаєте.
Фаталізувати

Добре. Я не впевнений, чи слід його оцінювати як 24, оскільки аргумент необхідний (інакше він просто повертається true.), але я раніше не використовував мови, які вимагають цього. Я спробую знайти деяку посилання, щоб визначити, як я повинен це оцінити, але було б сенс оцінити його як 23, тому я буду тримати це.
HyperNeutrino

1

Perl 6 , 30 26 байт

Завдяки @ b2gills за -4 байти!

{grep /^<$_>$/,map * **2,^1e4}

{grep /^<$_>$/,(^1e4)»²}

Використовує крапку як символ підстановки, так що вхід може використовуватися як регулярний вираз:

{                            }   # a lambda
                         ^1e4    # range from 0 to 9999
               map * **2,        # square each value
 grep /      /,                  # filter numbers that match this regex:
        <$_>                     #   lambda argument eval'ed as sub-regex
       ^    $                    #   anchor to beginning and end

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

Варіант, який приймає зірочку як підстановку (як це було запропоновано в попередній редакції опису завдання), буде 42 байти:

{grep /^<{.trans("*"=>".")}>$/,(^1e4)»²}

Я перезаписав правила, і ви можете обрати будь-який символ підстановки. Я бачу це як 38 байт.
HyperNeutrino

Гм, як ти цим користуєшся? Я нічого не знаю про Perl.
HyperNeutrino

@ Алекс .: Дякую, я оновив відповідь (і додав пояснення теж). Це лямбда; ви можете зателефонувати йому безпосередньо (наприклад { ... }("9*9***")) або призначити змінну / символ для подальшого використання. Зауважте, що Perl 6 - це окрема мова від Perl, тому він не працюватиме з перекладачем Perl.
smls

Я раніше sudo apt-get install rakudoотримував передбачуваного перекладача Perl6 ... Коли я ввожу perl6як команду в свій термінал, він починає те, що, здається, є перекладачем Perl6, але я не знаю, як ним користуватися. Я знаю, що це лямбда, але я не знаю, як це назвати.
HyperNeutrino

@AlexL. Я додав посилання "Спробуйте в Інтернеті", яке показує його як повний сценарій, який можна запустити perl6 foo.p6. Ви також можете протестувати його в оболонці, наприкладperl6 -e 'say {grep /^<$_>$/,map * **2,^1e4}( "9.9..." )'
smls

1

Рубін, 54 байти

Функція, яка бере аргумент рядка. Спробуйте в Інтернеті.

->s{(0..1e3).map{|i|"#{i**2}"[/^#{s.tr ?*,?.}$/]}-[p]}

Ви можете зберегти байт, скориставшись i * i замість i ** 2
GB

Схоже, це не працює, оскільки другий #робить коментар до решти рядка.
HyperNeutrino

@AlexL О, це працює добре. repl.it/FJCV
Значення чорнила

добре, я просто не знав, як перевірити Рубі. Мої вибачення. Здається, це працює для всіх даних. Хороша робота!
HyperNeutrino

0

Пакет, 109 байт

@for /l %%i in (0,1,999)do @set/aj=%%i*%%i&call copy nul %%j%%.%%j%%$>nul
@for %%s in (%1.%1$)do @echo %%~ns

Використовується ?як підстановка. Працює, створюючи 1000 файлів. Назва файлу - це квадратне число, а розширення файлу - квадратне число з $суфіксом. Це тому, що відповідність шаблону Batch вважає проміжні ?s як необов'язкові, тому вони 1?будуть відповідати як 1і 16; $тому змушує матч , щоб бути точним. Однак ми не хочемо $виводити цей файл, тому ми просто виводимо ім'я файлу лише без розширення.


0

JavaScript (ES6), 68 66 байт

EDIT: Оновлено моє рішення нижче після того, як надихнувся відповіддю ЮнгХвана Міна . Тепер він сумісний з ES6.

Здійснює введення у форматі, '1..4'де .знаходиться підстановка.

Замість ітерації до 1e6 та укорінення квадрата цей ітератор до 1e3 та квадратів.

p=>[...Array(1e3)].map((_,n)=>''+n*n).filter(n=>n.match(`^${p}$`))

JavaScript (ES7), 71 69 байт

p=>[...Array(1e6).keys()].filter(n=>n**.5%1?0:(''+n).match(`^${p}$`))

Створює масив чисел від 0 до 1e6, потім фільтрує його за числами, які є квадратними і відповідають шаблону.

Це жахливо повільно, тому що він завжди переходить на 1e6.


Я не думаю, що **це працює, тому що це дає мені "SyntaxError: expected expression, got '*'".
HyperNeutrino

@AlexL. Правила, здається, змінилися. Попередні правила підказували, що я можу вибрати символу підстановки.
Джордж Рейт

Вам потрібно лише підтримати до 1e6...
HyperNeutrino

Крім того, я змінив правила назад; проблема не в правилах, це тому, що **оператора не існує, принаймні, не в моїй системі.
HyperNeutrino

@AlexL. Ах вибачте, я думав, що ви мали на увазі вклад **. Так, це ES7 Я оновлю заголовок, ось список підтримуваних на даний момент браузерів developer.mozilla.org/uk/docs/Web/JavaScript/Reference/…
Джордж Рейт

0

Perl, 42 45 38 байт

EDIT: уточнення від Алекса, ми можемо використовувати період як символ підстановки, який голить операцію y //.

perl -pe 's|.*|@{[grep/^$&$/,map$_*$_,1..1e3]}|'

EDIT: рішення, яке використовує зірочку як символ підстановки та очікує послідовності підстановки на STDIN

perl -pe 'y/*/./;s|.*|@{[grep/^$&$/,map$_*$_,1..1e3]}|'

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

say"@{[grep/^$ARGV[0]$/,map$_*$_,1..1e3]}"

Питання вказує, що символи підкреслюються як зірочки. Чи дозволила попередня редакція запитання вибрати власного символу підстановки?
smls

1
@smls: Питання все ще вказує на вибір власного підключення, хоча це не в розділі правил: Персонаж, який використовується в якості підстановки, не обов'язково повинен бути зірочкою, він може бути будь-яким символом ASCII на ваш вибір, якщо це очевидно, це не цифра.
Емінья

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

1
Гм, власне, речення, яке цитує @Emigna, цілком зрозуміло, що ми можемо вибрати власного символу підказки , чи не так?
smls

Для уточнення символом підстановки може бути все, що завгодно. Я випадково переплутав правила при перезавантаженні пояснення.
HyperNeutrino

0

Python 3 - 98 97 байт

import re;print(re.findall(r"\b"+input()+r"\b",("\n".join([str(x*x) for x in range(1,1001)]))))

Потрібен введення типу "4..6".


Ви можете зберегти 3 байти за допомогою import reі re.findall; оптимізація за допомогою from...import *фактично не оптимізує її в цьому випадку.
HyperNeutrino

За умови введення 1...., він дає 1 4 9і 16 25валідні відповіді, що невірно. Виправте програму.
HyperNeutrino

Виправте випадок, приєднавшись до "\ n".
Carra

Це не працює для 1....... Він повертається [], але повинен дати [1000000]. Це можна виправити за рахунок 0 байт, використовуючи, range(0, 1001)а не використовуючи range(0, 1000).
HyperNeutrino

Добрий момент, я щойно перевірив усі тестові випадки з опису :)
Carra

0

k - 28 символів

{s(&:)($:s:s*s:!1001)like x}

Використовується ?як символ підстановки. Ця likeфункція використовується ?як підстановка, і ця функція складає список перших 1001 квадратів (включно до 1М), відкидає їх до рядків, а потім перевіряє, де вони відповідають шаблону.

    {s(&:)($:s:s*s:!1001)like x} "1??"
100 121 144 169 196

Я отримую цю помилку для цього: type error {s(&:)($:s:s*s:!1001)like x} "1" at execution instance 2 of ":". Чи можете ви надати посилання на робочий тестовий набір чи побачити, чи є проблема?
HyperNeutrino

@AlexL. Він працює для мене в режимі kdb + 's k
C. Quilley

Хм. Я спробую протестувати його з різними перекладачами.
HyperNeutrino

0

bash + Unix утиліти, 33 байти

dc<<<'0[2^pv1+lax]dsax'|grep ^$1$

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

Програма dc друкує квадратні числа у нескінченному циклі:

0     Push 0 on the stack.

[     Start a macro (called a).

2^    Square the number at the top of the stack.

p     Print the number at the top of the stack, followed by a newline.

v     Replace the number at the top of the stack (a square number) with its square root.

1+    Increment the number at the top of the stack.

lax   Run the macro again (looping).

]     End of the macro.

dsax  Store the macro in register a and run it.

Вихід постійного струму переводиться на греп, який друкує просто квадрати, які відповідають потрібному малюнку.

Це працює, коли я запускаю його на фактичній системі Linux або OS X (але це не працює в TIO, можливо, тому що програма dc намагається повторитись назавжди, і я підозрюю, що у TIO не вистачає місця для стеки для рекурсії та / або проблема з нескінченною трубою).


Я запускаю це з Linux Mint 17.3 Rosa, і це не закінчується. Я думаю, що проблема полягає в нескінченній dcкоманді.
HyperNeutrino

Я підозрюю, що причиною проблеми є саме буферизація. У мене немає такої версії Linux, але ви можете спробувати замінити grep на grep - line-buferi (для того, щоб кожен рядок був надрукований у міру завантаження). [Звичайно, це додає кількість байт.]
Мітчелл Спектор

Я додав аргумент grep, але це не має значення. Я спробував поставити --line-bufferedна обидві сторони ^$1$, але це не працює.
HyperNeutrino

@ AlexL. Дякую за те, що спробували. Я не знаю, чи є різниця в ядрі або в bash версії, яку я запускаю. Я змусив його працювати в TIO, примушуючи закінчувати введення грепа, використовуючи головну, таким чином: dc <<< '0 [2 ^ pv1 + lax] dsax' | head -1 sed s/./0/g<<<$1| grep ^ $ 1 $ При цьому використовується довжина шаблон для обмеження тестованих чисел (4-символьні шаблони перевіряють лише до 9999 тощо). Ось посилання TIO: tio.run/nexus/…
Мітчелл Спектор

Дякую за виправлення. Я не думаю, що поточне рішення насправді спрацює (хоча я не дуже знаю баш), тому що, здається, йому потрібно обчислити всі значення, перш ніж вводити це в grep. Однак, оскільки це наразі не найкоротше рішення, я буду тримати його в 33 байтах. Здається, працює на всі входи, так що хороша робота!
HyperNeutrino
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.