Чому 6 боялися 7?


61

Чому 6 боялися 7? Тому що 7 8 9!

Задавши рядок, застосуйте такі перетворення:

  • Якщо поруч із 7 є 6, видаліть 6 (6 боїться 7)
  • Якщо з'являється послідовність "789", видаліть 8 та 9 (7 з'їли 9)

(Якщо я не помиляюся, не має значення, в якому порядку ви робите перетворення)

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

Приклад:

78966

Спочатку ми бачимо "789", тому рядок стає "766". Потім ми бачимо "76", тому виймаємо 6, а рядок стає "76". Потім ми знову бачимо "76", тому нам залишається "7".

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

  • 987=> 987(Не в правильному порядку. Нічого не робить.)
  • 6 7=> 6 7(Пробіл діє як буфер між 6 і 7. Нічого не відбувається)
  • 676 => 7
  • 7896789 => 77
  • 7689 => 7
  • abcd => abcd

130
Чому Vista боялася 7? Тому що 7 8 10.
ліртосіаст

2
Ще один тестовий випадок 68978966897896=>68977
Бред Гілберт b2gills

19
@ThomasKwa О, я розумію: Microsoft пропустила Windows 9, тому що вони збиралися разом із загадкою. ;)
ETHproductions

43
Чому боялися семи було п’ять? Тому що шість сім вісім. --Yoda
Jakuje

2
Шість боялися семи, бо у семи були холодні мертві очі.
Conor O'Brien

Відповіді:



12

Javascript ES6, 29 байт

s=>s.replace(/6*7(89|6)*/g,7)

Тест:

f=s=>s.replace(/6*7(89|6)*/g,7)
;`987 -> 987
6 7 -> 6 7
676 -> 7
7896789 -> 77
7689 -> 7
abcd -> abcd`
.split`\n`.every(t=>(t=t.split` -> `)&&f(t[0])==t[1])

12
Чудово, і оскільки з'їдається 9, у вас є лише 2 байти і виграйте з цією відповіддю: P
П'єр Арло

12

Java, 126 81 66 58 байт

Дякуємо @GamrCorps за надання лямбда-версії цього коду!

Дякуємо @ user902383 за вказівку трюку автобоксингу!

...Так.

Це насправді довше, ніж я очікував - Java замінює елементи в рядках replaceAll()один раз на матч, а не повторно, поки не перестане змінюватися. Тож мені довелося використати фантазію для циклу.

Форма лямбда:

x->{for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}

Форма функції:

String s(String x){for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}

Код, який може бути перевірений:

class B{
    public static void main(String[]a){
        System.out.print(new B().s(a[0]));
    }
    String s(String x){for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
}

2
Чому б не поїхати з лямбдою?
Збережеш

@GamrCorps Не знаю, як це викласти - ніколи не використовуйте функції.
Аддісон Кримп

1
в чому сенс інтерфейсу, а не класу?
eis

3
Інтерфейс @eis усуває необхідність оголошувати main як загальнодоступний, що дає найменшу перевагу. Дивіться: codegolf.stackexchange.com/a/64713/44713
Addison Crump

1
@ user902383 Скорочення, яке ви робите, полягає в зміні .equalsна !=, що не робить те саме. ==(або !=) порівнює за шестигранним об'єктом об'єкта, а не за значенням. Інакше така ж довжина. while()становить 7 байт, for(;;)це 7 байт.
Аддісон Кримп

9

GNU Sed, 17

Оцінка включає +1 за -rваріант.

s/6*7(6|89)*/7/g

Не працює для того, 67789щоб повернутися, 77але замість цього повертається677
Бред Гілберт b2gills

1
Ви можете використовувати s/67|7(6|89)/7/замістьs/6?7(6|89)/7/
Бред Гілберт b2gills

1
Боже, мені цікаво, звідки Ларрі придумав ідею s///g?
Бред Гілберт b2gills

8

Perl 6 , 19  18 байт

{S:g/6*7[6|89]*/7/} # 19 bytes

$ perl6 -pe 's:g/6*7[6|89]*/7/' # 17 + 1 = 18 bytes

(Зауважте, що [6|89]версія, (6|89)яка не захоплює , написана так, як (?:6|89)у Perl 5. <[6|89]>- це як ви написали те, що написано, як [6|89]у Perl 5)

використання:

$ perl6 -pe 's:g/6*7[6|89]*/7/' <<< '
987
6 7
6676689
7896789
7689
abcd
68978966897896
79|689
'
987
6 7
7
77
7
abcd
68977
79|689

Я не знаю Perl 6, але я припускаю, що це повторна заміна. Якщо " 6*і" [6|89]*не відповідають нічого, що зупиняє 7заміну 7реклами на нескінченність?
Цифрова травма

2
@DigitalTrauma Він обміняється, 7після 7чого починається знову на наступній позиції, працюючи до кінця. :gкороткий для :globalне repeat until it doesn't match anymore.
Бред Гілберт b2gills

1
@DigitalTrauma Щоб приступити s/67|76|789/7/до роботи, 667я мусив би написати це як щось таке: while s/67|76|789/7/ {}що, звичайно, ніколи не зупиниться, якби ти написав це так, while s/6*7[6|89]*/7/ {}як ти очікував. Крім того, кінець попереднього коментаря може зійти як середньодуховий, не таким чином він був задуманий
Бред Гілберт b2gills

1
Чи не []слід змінювати ()? Ви не хочете , щоб відповідати труби або 79999.
jwodder

1
@jwodder Ні []- це версія (), яка не захоплює Perl 6 , те, що ви думаєте, написано так, як <[6|89]>в Perl 6.
Бред Гілберт b2gills



4

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

StringReplace[#,"67"|"76"|"789"->"7"]&~FixedPoint~#&

Пояснення:

                                                   &   A function returning
                                     &                   a function returning
              #                                            its first argument
StringReplace[ ,                    ]                     with
                "67"                                        "67"
                    |                                      or
                     "76"                                   "76"
                         |                                 or
                          "789"                             "789"
                               ->                         replaced with
                                 "7"                       "7"
                                    ~FixedPoint~        applied to
                                                #        its first argument
                                                        until it no longer changes.

8
Код для гольфу зрозуміліший, ніж код пояснення .. :)
Роб

@Rob Не робив багато пояснень раніше, використовуючи систематичний підхід.
LegionMammal978

Я просто дражнив, товариш :)
Роб

3

Іржа, 96 байт

fn f(mut s:String)->String{for _ in 0..s.len(){for r in&["67","76","789"]{s=s.replace(r,"7")}}s}

Безнадійно довго, як зазвичай у Руста ...

Безголівки:

fn seven_ate_nine(mut str: String) -> String {
    for _ in 0..str.len() {
        for to_replace in &["67","76","789"] {
            str = str.replace(to_replace, "7");
        }
    }
    s
}

Принаймні, це не Java

3

Emacs Lisp, 59 байт

(lambda(s)(replace-regexp-in-string"6*7\\(6\\|89\\)*""7"s))

З пробілами стає ясніше:

(lambda (s) (replace-regexp-in-string "6*7\\(6\\|89\\)*" "7" s))

3

Рубін, 27 байт

Це рішення - з коментарів, кредиту Бреду Гілберту b2gills .

->s{s.gsub /6*7(6|89)*/,?7}

Рубін, 37 байт

(старе рішення)

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

->s{s.chars{s.sub! /67|76|789/,?7};s}

Ви можете використовувати charsзамість того, size.timesщоб зберегти кілька байт.
Дверна ручка

Невже у Ruby немає глобального прапора для заміни регулярного виразу, чи це займе більше байтів для включення?
Бред Гілберт b2gills

@ BradGilbertb2gills, у Ruby це як у Awk: є окремі sub()та gsub()методи заміни спочатку чи всіх. Тож глобальний просто на один символ довший.
манатура

1
@manatwork Тоді я би написав це щось на кшталт:, ->s{s.gsub /6*7(6|89)*/,'7'}і нехай gsubвиконувати всі роботи в циклі.
Бред Гілберт b2gills

Якщо я правильно розумію правила прапорців командного рядка, ви можете зберегти 16 байт, використовуючи прапор командного рядка -p (+1), зробивши його gsub /6*7(6|89)*/,?7з використанням ruby -pe "gsub /6*7(6|89)*/,?7"загалом 20 + 1 байт
Алексіс Андерсен


2

PowerShell, 27 байт

$args-replace'6*7(89|6)*',7

e.g.
PS C:\temp> .\ate.ps1 "7689"
7

PS C:\temp> .\ate.ps1 "abcd"
abcd

PS C:\temp> .\ate.ps1 "68978966897896"
68977

Використання:

  • чужий виразний шаблон
  • спосіб -replaceглобальної заміни за замовчуванням в PowerShell
  • розгортання циклу, де він застосує -regexоператор до масиву $args, застосувавши його до всіх елементів окремо, і тут є лише один елемент, тому що є лише один параметр сценарію, тому він працює ОК, і ми не можемо індексувати елемент [0].

Початкова попередня спроба перед реалізацією глобальної заміни зробила б це; 74 байти побудови ланцюжка "-замінити -замінити -замінити", використовуючи множення рядка стільки разів, скільки довжина рядка, а потім його оцінюйте:

"'$($args)'"+("{0}6|6(?=7)'{0}89'"-f"-replace'(?<=7)")*$args[0].Length|iex

(З невеликою підстановкою рядків, щоб скоротити кількість замін).


2

CJam, 70 64 байт

Завдяки @Peter Taylor за різання {"789":I}{"76:":I}?до"789""76"?:I

"67":Iq:A{AI#:B){AB<7+A{BI,+}~>+s:A];}{"76"I={"789":I}{"76":I}?];}?}/A

"67":Iq:A{AI#:B){AB<7+A{BI,+}~>+s:A];}{"76"I="789""76"?:I];}?}/A

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

Пояснення:

"67":I                e# Assign the value of 67 to I
q:A                   e# Read the input and assign to A
{                     e# Opening brackets for loop
    AI#:B)            e# Get the index of I inside A and assign to B. The increment value by 1 to use for if condition (do not want to process if the index was -1)
    {                 e# Open brackets for true result of if statement
        AB<           e# Slice A to get everything before index B
        7+            e# Append 7 to slice
        A{BI,+}~>     e# Slice A to get everything after index B plus the length of string I (this will remove I entirely)
        +s:A          e# Append both slices, convert to string, and assign back to A
        ];            e# Clear the stack
    }                 e# Closing brackets for the if condition
    {                 e# Open brackets for false result of if statement
        "76"I=        e# Check if I is equal to 76
        "789"         e# If I is 76, make I 789
        "76"?:I       e# If I is not 76, make I 76
        ];            e# Clear the stack if I does not exist inside A
    }?                e# Closing brackets for false result of if statement
}/                    e# Loop
A                     e# Output A

Я не намагався це питання сам, так що я не впевнений, чи є це найкращий підхід, але якщо ви хочете зробити розділення і з'єднання потім дивитися на /і *. Також зауважте, що мислення з точки зору стеків, коли ви звикли до мов, подібних С, потребує певної адаптації. Напр., {"789":I}{"76":I}?Можна витягнути завдання "789""76"?:I, яким можна стати , до якого можна подати гольф 78976`3/?:I.
Пітер Тейлор

Дякую! Я не міг повністю зрозуміти, як використати вашу другу пропозицію.
Conrad Crates

Вибачте, моя помилка. 78976`3/дає масив ["789" "76"]; то замість того, щоб використовувати, ?вам потрібно було б використовувати =для індексації; але це повернення вперед, тому знадобиться інвертувати індекс, втрачаючи перевагу.
Пітер Тейлор

2

MATL , 17 байт

jt"'789|76'55cYX]

Приклад

>> matl
 > jt"'789|76'55cYX]
 > 
> 7896789
77

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

Пояснення

j                   % input string
t                   % duplicate
"                   % for each character. Iterates as many times as the string length
    '789|76'        % regular expression for replacement
    55c             % string to insert instead: character '7'
    YX              % regexprep
]                   % end for

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


1

Серйозно, 29 байт

,;l`'7;;"67"(Æ"76"(Æ"789"(Æ`n

Приймає введення як рядок з подвійним цитуванням, як "6789". Спробуйте в режимі он-лайн (вам потрібно буде вручну цитувати дані).

Пояснення:

,;l`'7;;"67"(Æ"76"(Æ"789"(Æ`n
,;l                            get input and push its length (we'll call it n)
   `                       `n  call the following function n times:
    '7;;"67"(Æ                   replace all occurrences of "67" with "7"
              "76"(Æ             replace all occurrences of "76" with "7"
                    "789"(Æ      replace all occurrences of "789" with "7"

1

Чт , 26 байт

67::=7
76::=7
789::=7
::=

включаючи зворотний новий рядок.

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


Я не думаю, що так. Якщо у вас є спосіб STDOUT, ви повинні. Вибачте!

Так, це дозволено відповідно до мета-повідомлення.
геокавель

1

Баш, 102 82 67 (+7)? байт

версія extglob

x=$1
while v=${x/@(76|67|789)/7};[ $v != $x ];do x=$v;done
echo $v

Це призначено для введення у файл та виклику з, напр bash -O extglob 789.sh 6567678989689789656. (+7)? байт - це якщо опція extglob зараховується до байтів.

Дякуємо @BinaryZebra за вказівку функцій extglob!


Неекглобійна версія (82 байти)

x=$1
while v=${x/76/7};v=${v/67/7};v=${v/789/7};[ $v != $x ];do x=$v;done
echo $v

Це призначено для введення у файл та виклику з, напр ./789.sh 65678989656.

Він використовує розширення параметрів для пошуку та заміни в циклі. Я задіяв низку розширень для заміни, оскільки мені не відомо про спосіб ефективнішого розширення ланцюга.


Ласкаво просимо до PPCG!
Mego

@BinaryZebra Ах, дякую за @()синтаксис. Я знав, що повинен бути спосіб їх поєднання. І @Mego, дякую за привітання!
Pooping

1

R, 35 байт

cat(gsub("6*7(6|89)*",7,scan(,"")))

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


0

PHP 51 символ

while($s!=$r=str_replace([789,67,76],7,$s)){$s=$r;}

Тест написаний довгою рукою

$s = '78966';
while ($s != $r = str_replace([789, 67, 76], 7, $s) )
{
    $s = $r;
}
echo $s; // 7;

Це робить порівняння рядків і рядок замінюють обидва в режимі while. Якщо умова виконується, вона оновлює ліву руку порівняння з результатом. Повідомте мене про будь-які вдосконалення.



0

PHP, 36 байт

preg_replace('/6*7(6|89)*/','7',$a);

regex рішення, бере $ рядок і замінює через вираз.


Параметри GET не прийнятні як метод введення в PHP . Вам потрібно буде або зробити цю функцію і передати вхід як функціональні параметри, або отримати вхід від $argvабо STDIN.
Mego

@Mego Здається, немає жодної думки щодо публікації, до якої ви пов’язані.
користувач253751

@immibis Правильно. Необхідний консенсус, щоб зробити метод вводу / виводу прийнятним. Відсутність одного означає, що це неприйнятно.
Mego

TL; DR у вас є серйозні недоліки, якщо ви використовуєте PHP для codegolf.
HamZa

0

Clojure, 71 байт

Клуджур є менш ідеальним для гри в гольф через його багатослівний характер - але, тим не менш, це цікаве вправа:

Версія для гольфу, використовуючи Java interop:

(defn f[s](let[x(.replaceAll s "67|76|789" "7")](if(= s x)s(recur x))))

Версія без гольфу, використовуючи Java interop:

(defn six-fears-seven [s]
  (let [x (.replaceAll s "67|76|789" "7")]
    (if (= s x)
      s
      (recur x))))

Версія "чистого Clojure" без гольфу:

(defn six-fears-seven [s]
  (let [x (clojure.string/replace s #"67|76|789" "7")]
    (if (= s x)
      s
      (recur x))))

0

/// , 19 байт (неконкурентоспроможний)

/67/7//76/7//789/7/

Ви фактично не можете надати введення цією мовою, тому передбачуваний ввід іде праворуч від коду.


Зауважте, що Itflabtijtslwi є косою рискою, але з введенням.
FryAmTheEggman

@FryAmTheEggman Хоча цей вводить символи , а не рядки .
Ерік Аутгольфер

Здається, у вашому посиланні відсутня одна коса риса.
Delioth


0

Japt v2.0a0, 12 байт

e/6?7(6|89/7

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

Як це працює

String.eє рекурсивна функція заміни. У Japt 2 є новий синтаксис регулярних виразів та автоматичне заповнення дужок всередині регулярного вираження, що зберігає тут один байт. (У Japt 1.x, ми повинні були пропустити рядки замість регулярних виразів, що було свого роду незграбним.)


0

Діалог APL , 17 байт

'6*7(6|89)*'⎕R'7'

'6*будь-яку кількість шісток ,
7 супроводжувані сім
(... )*' слід нуль або більше послідовності ...
6|89 в шість або вісім-дев'ять

⎕RR eplace , що з

'7' сім


0

05AB1E , 12 байт

Δ67‚7:789¬:

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

Δ               # Continue doing the following until it no longer changes:
 67             #  Push 67 to the stack
   Â            #  Bifurcate (short for Duplicate & Reverse); which pushes 76 to the stack
               #  Pair them up
     7:         #  Replace all occurrences of 67 or 76 with 7 in the (implicit) input
                #   i.e. 17893762 → 1789372
       789      #  Push 789 to the stack
          ¬     #  Take the head (without popping); which pushes 7 to the stack
           :    #  Replace all 789 with 7
                #   i.e. 1789372 → 17372
                # (And implicitly output the result after the loop)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.