Isi kolom yang kosong

14

Memasukkan

Bilangan bulat negatif n, dan string kosong syang hanya berisi karakter alfanumerik dan garis bawah _. Karakter pertama stidak _. Garis bawah sditafsirkan sebagai ruang kosong yang dapat diisi dengan karakter lain.

Kami mendefinisikan urutan "string tak terbatas" sebagai berikut. Tali hanya diulang berkali-kali. Untuk semua , string diperoleh dari dengan mengisi ruang kosong dengan karakter , sehingga yang pertama dari diganti dengan , yang kedua dengan , dan sebagainya. Karena huruf pertama tidak , setiap ruang kosong akhirnya terisi, dan kami menyatakan dengan string tak terbatas di mana setiap telah digantikan oleh nilai akhirnya.s1 = s s s...sk > 1sk+1sks1_sks1[0]s1[1]s_s_

Keluaran

nKarakter pertama sebagai string.s

Contoh

Pertimbangkan input n = 30dan s = ab_c_. Kita punya

s1 = ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_...

Mengganti dengan kekosongan , kita milikis1s1

s2 = abacbab_ccab_caabbc_abcc_abacbab_cc...

Kami kembali mengganti dengan yang kosong, yang menghasilkans1

s3 = abacbabaccabbcaabbc_abcccabacbab_cc...

Satu lagi penggantian:

s4 = abacbabaccabbcaabbcaabcccabacbabbcc...

Dari sini kita sudah dapat menyimpulkan 30 karakter pertama , yaitus

abacbabaccabbcaabbcaabcccabacb

Ini adalah output yang benar.

Aturan

Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan. Menabrak input yang salah dapat diterima.

Uji Kasus

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"
Zgarb
sumber
Bisakah kita mengambil input dalam urutan yang berlawanan (dalam bahasa di mana urutan itu penting)?
Martin Ender
@ MartinBüttner Tentu, saya akan mengizinkannya.
Zgarb

Jawaban:

4

Pyth, 17

<ussC,cG\_GUQ*zQQ

Input harus diberikan dengan string pada baris pertama, dan panjang pada baris kedua, pada STDIN. Sebagai contoh:

abc____
50

Coba di sini.

Penjelasan:

                             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.
isaacg
sumber
7

APL 29 28

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

digunakan seperti ini:

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

Penjelasan:

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

Moris Zucca
sumber
⍣≡adalah ide bagus. Mungkin saya harus mencoba untuk port ini ke ...
FUZxxl
7

CJam, 26 24 20 byte

4 byte disimpan berkat Peter.

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

Uji di sini. Mengambil string pertama dan nkedua di STDIN.

Anda dapat menjalankan semua test case dengan menempelkannya ke input apa adanya (termasuk -> outputjika Anda mau), dan menggunakan test harness berikut (yang membalik urutan kode):

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

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

]oNo}/

Penjelasan

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.";

Hasilnya dicetak secara otomatis di akhir program.

Catatan tentang [\]: Pada prinsipnya, [mengingat ukuran stack saat ini dan ]mengumpulkan semuanya ke ukuran yang terakhir diingat dalam sebuah array. Namun, jika ukuran array berada di bawah ukuran yang diingat di antaranya, maka awal array akan disesuaikan. Sekarang Anda mungkin berpikir bahwa menukar dua elemen array teratas tidak mempengaruhi ukuran array sama sekali, tetapi \sebenarnya muncul dua nilai dan kemudian mendorongnya dalam urutan terbalik. Inilah yang mendorong awal array turun dua. Oleh karena itu, [\]adalah cara terpendek untuk membungkus dua elemen tumpukan teratas dalam sebuah array. Kadang-kadang, efek samping dari mengumpulkan mereka dalam urutan terbalik cukup mengganggu, tetapi dalam kasus ini, itulah yang saya butuhkan.

Martin Ender
sumber
Saya pikir Anda bisa menggantinya _'_#) gdengan I*. Bekerja untuk saya di GolfScript.
Peter Taylor
@PeterTaylor oh, ide yang sangat bagus, terima kasih!
Martin Ender
6

Python 3, 110 byte

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))

Perlu sedikit lebih banyak bermain golf, tetapi ini adalah kegilaan belaka. Dibaca nkemudian sdari STDIN.

Bagian yang menyenangkan adalah, dalam tugas loop yang kita salin b, kemudian mulai muncul dari bsaat pemahaman daftar . Jika tugasnya sebaliknya, itu tidak akan berhasil!

Sp3000
sumber
4

k, 30

{{@[x;i;:;(#i:&"_"=x)#x]}/x#y}
tmartin
sumber
4

Jawa - 162 174

Tidak setiap hari saya bisa menggunakan do / while saat bermain golf di Jawa: D

Ini hanya mengulang dan mengisi saat mereka datang. Itu terus berjalan sampai tidak ada lagi _hasilnya.

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;}

Dengan jeda baris:

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;
}
Geobit
sumber
Saya tidak akan menjawab ini, tetapi jawaban Java lainnya terlalu panjang untuk dibiarkan;)
Geobits
3

Java 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);}

Kurang golf:

(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);
}
Ypnypn
sumber
3

Ruby, 60

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

Menyatukan waktu ssendiri n, lalu menghasilkan nsalinan kode yang menggantikan garis bawah dengan s, mengevaluasi salinan itu, dan mengembalikan nkarakter pertama dari hasilnya. Karena setidaknya satu garis bawah dihapus di setiap loop, ini dijamin untuk memberi kami nkarakter bebas garis bawah.

histokrat
sumber
Apa sintaks yang tepat untuk menjalankan ini? Ketika saya menyebutnya fdan menjalankan puts f[10,"ab_"], saya mendapatkan error berikut: in 'eval': undefined method 'next' for #<Array:.... Itu tampaknya berfungsi ketika tidak ada garis bawah dalam string.
Théophile
Oh, menarik, sepertinya perilaku String#charsberubah antara Ruby 1.9.3 dan Ruby 2.0; di Ruby 1 mengembalikan enumerator ketika tidak ada blok, di Ruby 2 sebuah array. Dapat dibuat versi-tidak sensitif dengan mengubah charske each_char, dengan biaya lebih dari 4 byte kode.
histokrat
3

Python 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]

Ini mengharapkan input seperti (30,"ab_c_").

Dengan Python, string tidak mengizinkan tugas. Jadi, mengganti yang kosong dengan karakter yang diinginkan itu sulit. Seseorang dapat menyiasatinya dengan mengonversi ke daftar dan kembali, tetapi saya merasa lebih pendek untuk hanya menghasilkan string keluaran dari awal, menambahkan karakter yang diinginkan satu per satu.

Output yang sedang dibangun adalah S, yang mulai kosong. Kami mengulang-ulang karakter input yang sdisalin berkali-kali untuk mensimulasikan sebuah lingkaran. Kami memeriksa apakah itu kosong melalui Boolean b. Kami memeriksa kesetaraan x=='_'daripada perbandingan karena garis bawah terletak di antara huruf kapital dan huruf kecil.

Jika karakternya bukan kosong, kita tambahkan saja S. Jika kosong, kami menambahkan huruf keluaran yang tidak digunakan berikutnya sejauh ini S. Kami melacak huruf yang digunakan oleh penunjuk indeksc yang dimulai dari 0 dan bertambah setiap kali kami menemukan tanda kosong.

Pada akhirnya, kami mencetak nkarakter pertama dari string yang dihasilkan S.

Kita harus menggunakan S[c:c+b]pengganti yang lebih pendek b*S[c]karena yang terakhir memberikan kesalahan di luar batas ketika Smulai kosong dan cbernilai 0. Tidak pernah masalah karena kami dijamin karakter pertama snon-kosong, jadi ini S[c]tidak pernah diperlukan, tetapi kode tidak mengetahuinya. Membalikkan orke hubungan arus pendek juga bisa menyelesaikan masalah ini, tetapi membutuhkan lebih banyak karakter.


Python 2, 83

Port Pyth-to-Python dari solusi isaacg , yang menggunakan splitdan zipuntuk melakukan penggantian:

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

Ternyata lebih lama karena, mengejutkan, metode bernama panjang dalam python. Tetapi mungkin bisa ditingkatkan dengan riffling sdan s.split('_')bersama - sama dengan cara yang lebih pendek.

Tidak
sumber
Bagus! Jangan berharap merekonstruksi string menjadi jauh lebih pendek!
Sp3000
3

Haskell (93) 67

Saya belum menulis Haskell dalam beberapa saat, jadi ini mungkin bisa disingkat banyak. tapi itu sangat bagus, kami harus mempersingkat dan membuatnya lebih baik!

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

Pemakaian:

*Main> f 50 "ab_a_cc"
"abaabccabaaaccabbacccabcaaccabbaaccabaaaccabcaccca"
marinus
sumber
2

Gelombang - 425

Apakah saya kalah?

@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!

Batch memiliki batasan - Saya menerima ini. Sebagai contoh; Saya harus menggunakan for for untuk mendapatkan variabel tunggal dalam format yang dapat digunakan karena keterbatasan sintaks parsing variabel. for %%b in (!c!)do... hanya ada sehingga saya bisa menggunakan %%balih-alih !c!jadi saya benar-benar dapat melakukan manipulasi string!s:~%%b,1! dan memiliki variabel yang berkembang pada waktu yang tepat.

Ada beberapa hal mendasar yang bisa saya lakukan untuk bermain golf lebih jauh, tetapi mungkin tidak di bawah 400 byte. Saya akan memiliki celah lain segera.

hapus clemeat
sumber
3
Kecuali orang lain memposting jawaban Batch yang lebih baik, saya tidak akan menyebut kehilangan ini :)
Sp3000
@ Sp3000 Jika hanya seseorang yang mau.
hapus klasifikasi
2

ECMASkrip 6, 78

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

Mulai dengan string kosong dan untuk setiap kemunculan garis bawah, ganti dengan karakter di indeks berikutnya dari string saat ini.

cPu1
sumber
1

Python 2 - 99 97 byte


Karena 4 pengajuan berbasis python tidak cukup ...

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]

Contoh:

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

ECMASkrip 6, 93 91

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

Memotong 2 karakter dari versi pertama.

(n,s)=>{x="_".repeat(n);while(/_/.test(x)){n=0,x=x.replace(/_/g,a=>s[n++%s.length])}return x}
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
sumber
0

C # - 162

Saya mencuri solusi Geobits dan mengubahnya ke 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 lebih baik, jadi kamu bisa meningkatkan Geobits;)

mike m
sumber