Створіть список номерів, які перекушують менше 50 000


24

Виклик номеру змії

Цікаво, скільки число зміїв налічує від 1 до 50 000?

Snake on a Nokia

У цій грі Snaking Numbers - це числа, які можна набрати на традиційній цифровій панелі (формат нижче), переміщаючи одну клавішу вгору, вниз, вліво або вправо.

7 8 9
4 5 6
1 2 3
 0

Наприклад, якщо ви почнете з числа 5, ви можете вибрати 4, 6, 8 або 2 як ваш наступний дійсний хід - проте 7, 3, 9 і 1 є поза межами, оскільки вони розташовані по діагоналі до поточної клавіші . Отже, якщо у вас є 5, то 2, ваш наступний життєздатний ключовий вибір - 0, 1, 3 або 5 знову.

У цій вправі «Код гольфу» ви маєте вивести список усіх позитивних перекусів від 1 до 50 тис., А також остаточне підрахунок усіх цифр, які відповідають критерію.

Правила

  1. Числа не можуть починатися з нуля.
  2. Числа повинні бути цілими додатними цілими числами.
  3. Кожен номер поспіль, прочитаний зліва направо, повинен "зміятися" навколо номерного поля.
  4. Змія не може рухатися по діагоналі по клавішах
  5. До числа 0 можна дійти як з числа 1, так і з 2
  6. Числа не можуть бути парними (наприклад: 22)

Приклади дійсних номерів для перекушування:

12369
45201
1254
10102
1
12
987

Приклади недійсних чисел

1238 - 8 is not connected
0001 - multiple leading 0s
0101 - leading 0
159  - snake cannot travel diagonally
4556 - duplicate 5

Відповідно до звичайного Code Golfs, мета - найменше байтів!

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


2
Чи слід сортувати вихід? Або це дозволено в будь-якому порядку?
tsh

2
Бачачи, як ви просите нас вивести фіксований і обмежений набір цілих чисел, я б запропонував включити повний список у специфікацію.
Кудлатий


4
Це підмножина A215009 .
bigyihsuan

Було б добре , щоб надрукувати 670 перших ?
дата

Відповіді:


14

К (нг / к) , 60 57 байт

(x;#x:{*/1=3!5&+/x*x:+1_-':(+0 1,'2*!3 3)@10\x}#1+!50000)

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

!50000список 0..49999

1+ додати 1 до всіх

{ }# фільтр з функцією в { }

10\x десяткових цифр аргументу

( )@ використовувати як індекси у ...

  • !3 3 пара списків: (0 0 0 1 1 1 2 2 2;0 1 2 0 1 2 0 1 2)

  • 2* помножити всі на 2

  • 0 1,'випереджати 0до першого списку і 1до другого

  • +транспонировать (пара списків -> список пар). це дає нам близько кнопки.

-':відняти від кожної пари попередню пару. використовувати 0 0як уявний елемент перед першим.

1_ киньте перше

+ переносити

x*x:квадрат (призначити xта помножити на x). тутx пара списків - ∆xs та ∆ys

+/ підсумовуйте два списки (елемент за елементом)

5& хв з 5

3! мод 3

1= булевий список, де він дорівнює 1

*/ продукт (булева "та")

(x;#x: )складіть пару результату і довжину ( #) результату


9

Желе ,  24  23 байти

5ȷ4µDo1.’d3ZIASĊ’ẸµÐḟṄL

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

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

Як?

5ȷ4µDo1.’d3ZIASĊ’ẸµÐḟṄL - Main Link: no arguments
5ȷ4                     - 5*10^4 = 50000
   µ              µÐḟ   - filter discard those for which this is truthy:
                        -                  e.g.: 8520        ... or           4559 
    D                   -   decimal digits       [8,5,2,0]                    [4,5,5,9]
      1.                -   literal 1.5
     o                  -   logical OR           [8,5,2,1.5]                  [4,5,5,9]
        ’               -   decrement            [7,4,1,0.5]                  [3,4,4,8]
         d3             -   div-mod by 3         [[2,1],[1,1],[0,1],[0,0.5]]  [[1,0],[1,1],[1,1],[2,2]]
           Z            -   transpose            [[2,1,0,0],[1,1,1,0.5]]      [[1,1,1,2],[0,1,1,2]]
            I           -   deltas               [[-1,-1,0],[0,0,-0.5]]       [[0,0,1],[1,0,1]]
             A          -   absolute value       [[1,1,0],[0,0,0.5]]          [[0,0,1],[1,0,1]]
              S         -   sum (vectorises)     [1,1,0.5]                    [1,0,2]
               Ċ        -   ceiling              [1,1,1]                      [1,0,2]
                ’       -   decrement            [0,0,0]                      [0,-1,1]
                 Ẹ      -   any?                 0 (i.e. keep)                1 (i.e. discard)
                     Ṅ  - print and yield
                      L - length
                        - implicit print

Я хотів би знати, як працює цей. Будь-який шанс ви могли б дати поломці?
MightBeAlon

1
@MightBeAlon зроблять пізніше ...
Джонатан Аллан

Мені цікаво, як 1.оцінювати 1.5?
Втілення Невідомості

@EmbodimentofIgnorance під час буквального розбору пропущеної цифри після періоду трактується як п'ять. Дивіться остаточне положення parse_literal у interpreter.py
Джонатан Аллан



5

JavaScript (V8) ,  112 106  104 байт

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

Повна програма.

for(n=0;++n<5e4;)[...n+''].every(x=>'6589632145201478'.match(x+p+'|'+p+(p=x)),p='')&&print(n)
print(670)

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

Або 96 байт, якщо ми можемо вивести числа в зворотному порядку:

for(n=5e4;n--;)[...n+''].every(x=>'6589632145201478'.match(x+p+'|'+p+(p=x)),p='')&&print(n||670)

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


працює також видалення останнього, 3можливо, тому 36, що вже є в рядку
Nahuel Fouilleul

@NahuelFouilleul Хороший улов. Спасибі!
Арнольд

1
також 6589632145201478на один байт коротше
Nahuel Fouilleul

4

Стакс , 37 35 байт

ü╞╡~▄ⁿ♪eµïê◙ü╔ï▼ΔJr¥æ≤PH╟♀I♣Δz8─¶Γ╞Ç▓

Запустіть і налагоджуйте його на staxlang.xyz!

Це було так приємно і коротко, поки цього не було.

Розпаковано (42 байти) та пояснення

49999{E2B{{om"#qYY>!(AFI"%A|E2B{{om-C_Qf%p
49999{                                 f      Filter range [1..49999]:
      E2B                                       All adjacent pairs of digits
         {{om                                   Each sorted
             "#qYY>!(AFI"%A|                    Literal 2012365478963258741
                            E2B{{om             Pairs of digits, each sorted
                                   -            Set difference
                                    C           Cancel block execution if any remain
                                     _Q         Print current value
                                        %p    Print length

2012365478963258741 кодує клавіатуру. Подивіться на пари сусідніх цифр. Можливо, якби я міг отримати гідно коротку альтернативу, яка йде в обох напрямках для кожної пари, я міг би скоротити вісім байтів{{om .

Без цього останнього 670 досить простого фільтра: f..!замість {..C_Qf%p. Можливо, є кращий спосіб вирішити цю нерегулярність. У будь-якому випадку ця поведінка діапазону фільтрів не є документальною.


Вибачте за недоліки в документації. FWIW, це буде у наступному випуску, 1.1.7. Ви можете побачити попередній перегляд на stax.tomtheisen.com , але це секрет, тому не кажіть нікому. ;)
рекурсивна

3

PHP , 145 байт

for(;$i++<5e4;$f&&print$i._)for($f=1,$l=b;''<$d=("$i")[$$i++];$l=$d)$f&=$l>a||strstr([12,240,1053,26,157,2468,359,48,579,68][$l],$d)>'';echo 670;

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

Для кожного числа від 1 до 50 000 перевіряйте кожну цифру цього числа зліва направо. Якщо всі цифри знаходяться у списку дійсних цифр попередньої цифри, це число друкується. Наприкінці друкується жорсткий 670 коду, оскільки він займає менше байтів, ніж насправді підрахунок.


3

05AB1E , 23 байти

ŽÅKLʒSÌYX;:3‰üαï€OP}=g=

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

Відповідь «Порт Джонатана Аллана» .


1
Ах, розумно просто стискати 50000 в 3 байти. Я використовував ₄50*або 4°5*коли я робив спробу раніше. І спершу я збентежився, чому ти мав €OPзамість просто OP, але потім я зрозумів, що однозначні числа (бути порожнім списком після цього üα) будуть [] → 0 → 0замість цього [] → [] → 1. :)
Кевін Круїссен

1
@KevinCruijssen Чому 4°5*коли можна 5°;? Мені більше подобається ZAK. І так, цей кращий регістр для одноцифрових чисел - це біль.
Grimmy

3

Perl 5 ( -M5.01), 96 , 92 байти

-4 байти завдяки @Xcali

$r=join"|",map$t++."[^$_]",12,240,1350,26,157,2648,359,48,579,68;map/$r/||say,1..5e4;say 670

ТІО



дякую, справді, надмірно складно, тому що першою відповіддю була позитивна відповідність
Науель Фуле

3

JavaScript (SpiderMonkey) , 179 173 151 129 байт

[12,240,1350,26,157,2468,359,48,579,68].map((_,i,l)=>i&&(f=(v,t)=>print(v)|v<5e3&&[...l[t]+''].map(k=>f(v+k,k)))(i,i)),print(670)

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

-22 байти подяки Арнольду -22 байти подяки дані

пояснення:

[12,240,1350,26,157,2468,359,48,579,68] 
// an array where keys are current position and values, the possible destinations
.map((_,i,l)=>                    // loop over it
    i&&(                          // if key is not 0
        f=(v,t)=>                 // create a function
                 print(v)|        // which print the value
                          v<5e3&& // and if the limit is not attained
                                 [...l[t]+''].map(k=>f(v+k,k)) 
                    // recurcively call itself with for each destinations
                                                              )(i,i)),
                    // make the first call with each digit
print(670) // finally print 670

@dana також дала рішення на 123 байти, якщо ми можемо спочатку надрукувати 670

[21,420,5310,62,751,8642,953,84,975,86].map((_,i,a)=>(f=(v,t)=>print(i?v:640)|i&v<5e3&&[...a[t]+''].map(k=>f(v+k,k)))(i,i))

@Arnauld дякую, що я забув це правило
jonatjano



123, якщо спочатку можна надрукувати 640.
дата


2

Стакса , 28 26 байт

Δh┤♣É╦&·é╝n$K»à¶▲v═NÆ;↨m≥8

Запустіть і налагоджуйте його

Розпакований, неозорений та коментований, це виглядає приблизно так.

G               Call to unbalanced trailing '}', then resume here
670P            Print 670
}               Call target
219J            219 squared (47961)
f               Filter 1-based range by the rest of the program; implicitly output
  $2B           Convert to string and get adjacent pairs; e.g. 213 -> ["21", "13"]
  O             Push 1 under list of pairs
  F             Iterate over pairs, using the rest of the program
    o           Order each pair; e.g. "21" -> "12"
    "{<f:[/T8Z" string literal with code points [123 60 102 58 91 47 84 56 90]
    $           concate as string i.e. "12360102589147845690"
    s#          How many times does the current pair appear in the constant string?
    *           Multiply this by running total.  Any zero will cause the result to be zero.

Виконати цей

Таємний соус знаходиться в рядковому буквальному "{<f:[/T8Z". Після заклинювання всіх точок коду разом, ви отримуєте 12360102589147845690. Висхідні пари в цьому рядку - дійсні змії.


1
15JJзамість того, 219Jщоб також працювати, але я не думаю, що ви можете гольфувати будь-який байт звідти, якщо немає 1-байтової постійної для 15.
Арнольд


1

Вугілля деревне , 42 байти

≔ΦI…·¹×⁵⁰φ⬤ι№”)¶∧XRτ_ΠGêR⁵m⎇λ”✂ιμ⁺²μ¹θθILθ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

≔ΦI…·¹×⁵⁰φ

Процес інклюзивної діапазону від 1до 50,000перетвореного в рядок.

⬤ι№”)¶∧XRτ_ΠGêR⁵m⎇λ”✂ιμ⁺²μ¹θ

Відфільтруйте ті, які мають пари цифр, які не містяться в стисненому рядку 01478963202125458565236987410.

θILθ

Виведіть залишок масиву та його довжину.



1

Perl 6 , 64 байти

{670,grep {[+&](:36<12HGX91H8VCL3MG0FDVQ>X+>m:ov/../)%2},1..5e4}

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

Пояснення

{670,grep {...},1..5e4}  # Meet questionable output requirements

# Actual decision problem

     :36<12HGX91H8VCL3MG0FDVQ>  # Bit field of allowed transitions
                                # encoded in base 36
                                 m:ov/../  # All 2-digit substrings
                              X+>  # Right shift by each substring
                                   # (implicitly converted to an integer)
[+&](                                    )  # Binary and
                                          %2  # Modulo 2

Шкода ~>ще не реалізовано, інакше ви можете це зробити за допомогою лише строкових операторів, при цьому бітове поле є рядком
Jo King

1

Pyth , 68 65 45 байт

l
f.Am}dCtB+J`65874589632012541_PJCtB`TS50000

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

Натхнення для переглянутого процесу пошуку надійшло від відповіді Стакса Хулдрасесета на'Барія , іди, дай їм підсумок!


Редагувати 2: Переписати, щоб зберегти купу байтів, попередня версія:

l
f.Am}ed@c"12 024 0135 26 157 2468 359 48 579 68";shdCtB`TS50000

Редагувати: 3 байти в гольфі, використовуючи рядок пошуку, попередня версія:

l
f.Am}ed@sMMc"12 024 0135 26 157 2468 359 48 579 68";hdCtBjT;S50000
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.