Заповнити пропущені місця


14

Вхідні дані

Невід’ємне ціле число nі непорожній рядок, sщо містить лише буквено-цифрові символи та підкреслення _. Перший персонаж s- ні _. Підкреслення sінтерпретуються як порожні пробіли, які можна заповнити іншими символами.

Ми визначаємо нескінченну послідовність "нескінченних рядків" наступним чином. Рядок просто повторюється нескінченно багато разів. Для всіх , рядок отримується шляхом заповнення порожніх пробілів символами , так що перший з замінюється на , другий - і так далі. Оскільки перша літера не є , то кожне порожнє пробіл заповнюється зрештою, і ми позначаємо нескінченним рядком, де кожне було замінене його можливим значенням.s1 = s s s...sk > 1sk+1sks1_sks1[0]s1[1]s_s_

Вихідні дані

Перші nсимволи як рядка.s

Приклад

Розглянемо вхідні дані n = 30та s = ab_c_. Ми маємо

s1 = ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_...

Підставляючи заготовки , ми маємоs1s1

s2 = abacbab_ccab_caabbc_abcc_abacbab_cc...

Ми знову підставляємо заготовки, в результаті чогоs1

s3 = abacbabaccabbcaabbc_abcccabacbab_cc...

Ще одна заміна:

s4 = abacbabaccabbcaabbcaabcccabacbabbcc...

З цього ми можемо вже вивести перші 30 символів , які єs

abacbabaccabbcaabbcaabcccabacb

Це правильний вихід.

Правила

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

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

0  "ab__"    -> ""
1  "ab__"    -> "a"
3  "ab__"    -> "aba"
20 "ab"      -> "abababababababababab"
20 "ab__"    -> "abababababababababab"
20 "ab_"     -> "abaabbabaabaabbabbab"
30 "ab_c_"   -> "abacbabaccabbcaabbcaabcccabacb"
50 "ab_a_cc" -> "abaabccabaaaccabbacccabcaaccabbaaccabaaaccabcaccca"
50 "abc____" -> "abcabcaabcbcaaabcbcbcabcaaababccbcbabccabcabcaaaba"

Чи можемо ми взяти вхід у зворотному порядку (мовами, де порядок має значення)?
Мартін Ендер

@ MartinBüttner Звичайно, я дозволю це.
Згарб

Відповіді:


4

Піта, 17

<ussC,cG\_GUQ*zQQ

Вхід повинен бути вказаний рядок у першому рядку, а довжина - у другому, на STDIN. Наприклад:

abc____
50

Спробуйте тут.

Пояснення:

                             Implicit:
                             z = input()              z is the string.
                             Q = eval(input())        Q is the length.

<               Q            First Q characters of
 u         UQ*zQ             Reduce, with an initial value of z repeated Q times, 
                             on the list range(len(Q)).
                             Since the reduce function doesn't use the sequence variable H
                             this function amounts to applying the inner code Q times to
                             the initial value, where the working variable is G.
  ss                         Sum from list of tuples of strings, to tuple of strings,
                             to string.
    C,                       Zip together
      cG\_                   G split on underscores
          G                  with G.
                             This inserts a character of G between every underscore
                             separated group of G, which amounts to replacing the
                             underscores with characters of G, after summation.

7

ДПЛ 29 28

{a⊣(b/a)←a↑⍨+/b←'_'=a←⍺⍴⍵}⍣≡

використовується так:

fun←{a⊣(b/a)←a↑⍨+/b←'_'=a←⍺⍴⍵}⍣≡
20 fun 'ab_c_'
abacbabaccabbcaabbca

Пояснення:

a←⍺⍴⍵           makes vector long as left argument using repeated chars in right argument
a↑⍨+/b←'_'=a   takes a string from the beginning of string a (a↑⍨), long as the number of _'s in a (+/b←'_'=a)
(b/a)←          puts those chars in place of the _'s in the original vector
a⊣             and returns a
{}⍣≡            repeats function ( {} ) until results doesn't change anymore

Tryapl.org


⍣≡- витончена ідея. Можливо, я повинен спробувати
перенести

7

CJam, 26 24 20 байт

4 байти збережено завдяки Петру.

l~:I*{_'_/[\]zsI<}I*

Тестуйте це тут. Бере рядок перший і nдругий на STDIN.

Ви можете запустити всі тестові випадки, вставивши їх у вхід, як вони є (включіть, -> outputякщо ви хочете), та скориставшись наступним тестовим джгутом (який змінює порядок для коду):

qN/{"->"/0=S/W%S*

~:I*{_'_/[\]zsI<}I*

]oNo}/

Пояснення

l~:I*{_'_/[\]zsI<}I*
l~                       "Read the input and evaluate.";
  :I                     "Store n in I for future use.";
    *                    "Repeat s n times to ensure it's long enough for the output.";
     {           }I*     "Repeat this block n times. This will always be enough passes.";
      _                  "Duplicate the string.";
       '_/               "Split the string on underscores.";
          [\]            "Swap with the other copy, putting both in an array.";
             z           "Zip the two arrays together, interleaving substrings from the split
                          copy with characters from the unsplit copy. Extraneous
                          characters from the unsplit copy just go at the end and
                          can be ignored.";
              s          "Convert the result into a string, flattening the array in the
                          process. This basically joins the two interleaved strings together.";
               I<        "Truncate to n characters.";

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

Примітка про [\]: В принципі, [запам'ятовує поточний розмір стека і ]збирає все до останнього запам'ятовуваного розміру в масиві. Однак якщо розмір масиву впаде нижче запам’ятовуваного розміру між ними, то початок масиву буде відповідно скориговано. Тепер ви можете подумати, що заміна верхніх двох елементів масиву взагалі не впливає на розмір масиву, але \насправді з'являється два значення, а потім висуває їх у зворотному порядку. Це те, що штовхає початок масиву вниз на два. Отже, [\]це найкоротший спосіб обернути два верхні елементи стека в масив. Іноді побічний ефект їх збирання у зворотному порядку досить дратує, але в цьому випадку це саме те, що мені потрібно.


Я думаю , ви могли б замінити _'_#) gз I*. Для мене працює в GolfScript.
Пітер Тейлор

@PeterTaylor о, дуже гарна ідея, дякую!
Мартін Ендер

6

Python 3, 110 байт

n=int(input())
*b,=input()*n
a=b[:n]
while"_"in a:b,a=b[:],[x*(x!="_")or b.pop(0)for x in a]
print("".join(a))

Потрібно трохи більше гольфу, але ось якийсь безумство. Читає nпотім sвід STDIN.

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



4

Ява - 162 174

Це не кожен день, коли я можу використовувати цикл do / while під час гольфу на Java: D

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

char[]a(int n,char[]s){char[]o=new char[n];if(n>0)do for(int i=0,j=0;i<n;i++)if(o[i]==95|o[i]<1)o[i]=s[j++%s.length];while(new String(o).contains("_"));return o;}

З розривами рядків:

char[]a(int n,char[]s){
    char[]o=new char[n];
    if(n>0)
        do
            for(int i=0,j=0;i<n;i++)
                if(o[i]==95|o[i]<1)
                    o[i]=s[j++%s.length];
        while(new String(o).contains("_"));
    return o;
}

Я не збирався відповідати на це, але інша відповідь на Java була занадто довгою, щоб вистояти;)
Geobits

3

Ява 8, 238

(n,s)->{int i=0,j=0;for(s=String.join("",java.util.Collections.nCopies(n,new String(s))).toCharArray();j<1;){for(i=0;i<n;i++){for(;s[++j]!=95&j<n;);if(j<n)s[j]=s[i];}for(j=1,i=0;i<n;)j=s[++i]==95?0:1;}return java.util.Arrays.copyOf(s,n);}

Менше гольфу:

(Integer n, char[] s) -> {
    int i = 0, j = 0;
    for (s = String.join("", java.util.Collections.nCopies(n, new String(s))).toCharArray(); j < 1;) {
        for (i = 0; i < n; i++) {
            for (; s[j] != 95 & j < n; j++);
            if (j < n) {
                s[j] = s[i];
            }
        }
        for (j = 1, i = 0; i < n;) {
            j = s[++i] == 95 ? 0 : 1;
        }
    }
    return java.util.Arrays.copyOf(s, n);
}

3

Рубі, 60

->n,s{eval"r=%1$p.chars;s.gsub!(?_){r.next};"*n%s*=n;s[0,n]}

Зв'язує sсебе з nчасом, потім створює nкопії коду, який замінює підкреслення s, оцінює ці копії та повертає перші nсимволи результату. Оскільки принаймні один підкреслення видаляється в кожному циклі, це гарантовано дає нам nсимволи, які не підкреслюють.


Який правильний синтаксис для цього? Коли я кличу його fі бігти puts f[10,"ab_"], я отримую наступне повідомлення про помилку: in 'eval': undefined method 'next' for #<Array:.... Це, здається, працює, коли в рядку немає підкреслень.
Теофіл

О, цікаво, схоже, поведінка String#charsзмінилася між Ruby 1.9.3 та Ruby 2.0; у Ruby 1 повертає нумератор, коли немає блоку, у Ruby 2 - масив. Це може бути версією нечутливого шляхом зміни charsдо each_charціні-чистіших байт коди.
гістократ

3

Пітон 2, 75

n,s=input()
S='';c=0
for x in s*n:b=x=='_';S+=S[c:c+b]or x;c+=b
print S[:n]

Це очікує на зразок введення (30,"ab_c_").

У Python рядки не дозволяють призначити. Отже, замінити заготовки на потрібний символ важко. Можна обійти це шляхом перетворення в список і назад, але я вважав, що це коротше, щоб просто генерувати вихідний рядок з нуля, додаючи потрібні символи по одному.

Побудований вихід є S, який починається порожнім. Ми прокручуємо символи вводу, sскопійованого багато разів, щоб імітувати коло. Ми перевіряємо, чи це порожнє через булеве значення b. Ми перевіряємо рівність, x=='_'а не порівняння, оскільки підкреслення лежить між великими та малими літерами.

Якщо символ не є порожнім, ми просто додаємо його S. Якщо він порожній, ми додаємо наступну невикористану літеру виводу-поки що S. Ми відстежуємо використані літери за покажчиком, cякий починається з 0 і збільшується щоразу, коли ми зустрічаємо пробіл.

В кінці ми друкуємо перші nсимволи отриманого рядка S.

Ми повинні використовувати S[c:c+b]замість коротшого, b*S[c]тому що останній видає помилку поза межами, коли Sстарт порожній і cдорівнює 0. Це ніколи не має значення, оскільки нам гарантовано, що перший символ sне пустий, тому це S[c]ніколи не потрібно, але код цього не знає. Переключення orна коротке замикання також може вирішити це, але коштує більше символів.


Пітон 2, 83

Порт Pyth-to-Python рішення isaacg , який використовує splitта zipвиконує заміну:

n,s=input()
s*=n
exec"s=''.join(a+b for a,b in zip(s.split('_'),s));"*n
print s[:n]

Виявилося довше, тому що, здивуйтеся, названі методи довгі в пітоні. Але це, можливо, може бути покращено шляхом рифлінгу sта s.split('_')разом більш коротким способом.


Приємно! Не очікував, що реконструкція рядка буде настільки коротшою!
Sp3000

3

Хаскелл (93) 67

Я не писав жодного часу Haskell, тому це, ймовірно, може бути скорочене на багато. але це було так добре, нам довелося його скоротити і покращити!

('_':b)&(d:e)=d:b&e;(a:b)&c=a:b&c
f n s=take n$q where q=cycle s&q

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

*Main> f 50 "ab_a_cc"
"abaabccabaaaccabbacccabcaaccabbaaccabaaaccabcaccca"

2

Партія - 425

Чи я програю?

@echo off&setLocal enableDelayedExpansion&set s=%2
if "%3"=="" (for /l %%a in (1,1,%1)do set o=!o!%s%)else set o=%3
set o=!o:~0,%1!&set l=0
:c
if defined s set/al+=1&set "s=%s:~1%"&goto c
set s=%2&set/ap=%1-1
set y=&set c=0&for /l %%a in (0,1,%p%)do set x=!o:~%%a,1!&if !x!==_ (for %%b in (!c!)do set y=!y!!s:~%%b,1!&set/ac+=1)else (set y=!y!!x!)&if !c!==%l% set c=0
if "!y:_=!"=="!y!" echo !y!&goto :EOF
%0 %1 %2 !y!

Пакет має обмеження - я приймаю це. Наприклад; Мені довелося використовувати цикл for, щоб отримати єдину змінну у використаному форматі через обмеження синтаксису розбору змінних. for %%b in (!c!)do... просто існує, тому я можу використовувати %%bзамість цього, !c!щоб я міг фактично робити маніпуляції з рядком !s:~%%b,1!і змусити розширення змінних в потрібний час.

Є кілька досить простих речей, які я міг би зробити для цього в гольф далі, але, мабуть, не нижче 400 байт. Незабаром у мене з’явиться ще одна тріщина.


3
Якщо хтось не
опублікує

@ Sp3000 Якби хтось хотів.
нечисте м'ясо

2

ECMAScript 6, 78

f=(s,n,i=0)=>[...s.repeat(n)].reduce((s,x)=>s+(x=='_'?s[i++]:x),'').slice(0,n)

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


1

Пітон 2 - 99 97 байт


Оскільки 4 подання на основі пітона не достатньо ...

n,s=input();S=s=s*n
while"_"in S:x=iter(s);S="".join(j>"_"and j or next(x)for j in S)
print S[:n]

Приклад:

$ python2 t.py 
(50, "ab_a_cc")
abaabccabaaaccabbacccabcaaccabbaaccabaaaccabcaccca

0

ECMAScript 6, 93 91

(n,s)=>{for(x="_".repeat(n);n=0,/_/.test(x);)x=x.replace(/_/g,a=>s[n++%s.length]);return x}

Поголив 2 символи з першої версії.

(n,s)=>{x="_".repeat(n);while(/_/.test(x)){n=0,x=x.replace(/_/g,a=>s[n++%s.length])}return x}

0

C # - 162

Я вкрав рішення Geobits і змінив його на C #

char[]p(int n,string s){var r=new char[n];if(n>0)do for(int i=0,j=0;i<n;i++)if(r[i]=='_'||r[i]<1)r[i]=s[j++%s.Length];while(r.ToList().IndexOf('_')>=0);return r;}

1 char краще, так що ви можете покращити Geobits;)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.