Bir dizeyi bir dizinin içine n kez yerleştirme


16

Bir dize nests bir işlev üretmek gerekir s, bir dizi içindeki ndefa

>>> N("stackoverflow",2)
[['stackoverflow']]

Parametreler:

  1. s - Bir ascii dizesi
  2. n - Bir tam sayı >= 0

kurallar

  • En kısa kod kazanır.
  • Çıkış iç içe olacak array, listya da tuple(bir dizi kapalı tabanlı veya benzer tipte)

Test Durumları

>>> N("stackoverflow",0)
'stackoverflow'
>>> N("stackoverflow",1)
['stackoverflow']
>>> N("stackoverflow",5)
[[[[['stackoverflow']]]]]

Esinlenen: Bir dizeyi bir listeye n kez yerleştirme, yani bir liste listesinin listesi


6
Çıktı bir liste olmalı mı yoksa bu listeyi temsil eden bir dize olabilir mi?
clismique

2
Parametreleri herhangi bir sırayla alabilir miyiz?
Sokratik Phoenix

@SocraticPhoenix Bence açıkça yasaklanmadığı sürece, evet - girdiyi herhangi bir makul formatta alabilirsin (ki ikisini de bir liste olarak almayı da içerir). Belki daha deneyimli biri alakalı bir meta gönderiyi gösterebilir.
Jonathan Allan

Dize hiç çıkış karakterini içerecek "mi? ÖrnN("stack\"overflow",5)
Riley

@Riley Herhangi bir ascii karakteri içerebilir
jamylak

Yanıtlar:


11

Jöle , 2 bayt

Biraz kafa karıştırıcı, çünkü: (1) Jelly'in dizeleri yok, sadece karakter listeleri var; ve 2); çıktı yuvalama göstermez. Bunun aslında ne yapıldığını görmek için sonucun bir Python dizesi temsiline bakın:

W¡ŒṘ

[]Dizenin kendisi bir karakter listesi olacağından fazladan bir çift mevcut olacaktır. Örneğin

Nasıl?

W¡ - Main link: s, n
W  - wrap left, initially s, in a list
 ¡ - repeat previous link n times

Kavram kanıtı kodu şunları ekler:

W¡ŒṘ - Main link: s, n
  ŒṘ - Python string representation


"Daha iyi" dizeleri kullanılıyor gibi görünüyor ... bir karakter listesinin aslında kullanılıyor olduğunu göstermez.
Jonathan Allan

15

Java ve C #, 62 bayt

Object f(String s,int n){return n<1?s:new Object[]{f(s,n-1)};}

Java ve C # 'de değişiklik yapılmadan çalışmalıdır.


Akıllı! +1 Ben gerçekten işe yaramadı bir String-dizisi yuvalayarak Java çalışmak için çalışıyordum. Bir Nesneyi döndürme türü olarak kullanmak ve bunu bir Object [] içine yerleştirmek, Object [] (veya herhangi bir dizi) de bir Object olduğu için bu meydan okuma için gereken çözümdür. Güzel.
Kevin Cruijssen

12

05AB1E , 3 bayt

kod

`F)

açıklama

`   # Flatten the input array on the stack.
 F  # Element_2 times do:
  ) # Wrap the total stack into a single array.

Bu , dize zaten yığın üzerinde olduğu için bunun 0 -testcase için de işe yarayacağı anlamına gelir .

Çevrimiçi deneyin!


8

JavaScript (ES6), 20 bayt

d=>g=n=>n--?[g(n)]:d

İnsanlar normalde 1 baytlık tasarruf için işlevlerimi köreltmeme rağmen, bu aslında çözüme katkıda bulunduğu bir durumdur.


Büyük köri kullanımı. Ben biraz daha okunabilir yapabilirsiniz düşünüyorum:d=>g=n=>n?[g(n-1)]:d
ETHproductions 17:16


5

CJam , 7 6 bayt

{{a}*}

Çevrimiçi tercüman

Bu şekilde istiften kendi bağımsız değişkenleri alır isimsiz fonksiyonudur S N, Sdize olan ve Nsargısı olan. ~Operatör ile çalıştırabilirsiniz , yani eval.

Açıklama:

{{a}*}
{      Open block    [A B]
 {     Open block    [A]
  a    Wrap in array [[A]]
   }   Close block   [A B λwrap]
    *  Repeat        [A:wrap(*B)]
     } Close block   ["S" N λ(λwrap)repeat]

Garip giriş biçiminden kaçınmak için adsız bir blok kullanın {{a}*}veya {'a*~}.
Martin Ender

@MartinEnder Bayt süreceğinden korkuyorum ve giriş formatının% 100 kabul edilebilir olduğunu düşünüyorum. Bu sadece bir liste ve bence bu iki parametrenin nasıl girileceği konusunda bir kısıtlama yok. Ayrıca, bloğa hiç isim vermedim.
Outgolfer Erik

Baytlar hakkında ne demek istediğini bilmiyorum? Bu çözümlerin her ikisi de sadece 6 bayttır.
Martin Ender

@MartinEnder Oh, bütün bu çözümler miydi? Programımı uzatmaktan bahsettiğini sanıyordum, ama onu bir işleve dönüştürdün mü? Bu, tüm noktayı değiştirir. CJam / GolfScript / Pyth'te yeniyim. Birincisini tercih ederim çünkü {a}ikincisi yerine daha anlaşılır ( n kez tekrarlayın ) (bir n as dizesi üretin ve çalıştırın).
Outgolfer Erik

4

Javascript ES6, 23 bayt

Özyinelemeli işlev

f=(a,i)=>i?f([a],--i):a

console.log(f("stackoverflow",0))
console.log(f("stackoverflow",1))
console.log(f("stackoverflow",2))
console.log(f("stackoverflow",5))

Aynı uzunlukta kurutma sonuçları

f=a=>i=>i?f([a])(--i):a

4

Brachylog , 10 bayt

tT,?h:T:gi

Çevrimiçi deneyin!

açıklama

tT,            T is the integer (second element of the Input)
   ?h:T:g      The list [String, T, built-in_group]
         i     Iterate: Apply built-in_group T times to String

Eğer hata olmasaydı bu 3 bayt olurdu. Burada zaten [String, T, built-in_group]girdimiz olsa bile listeyi almak için tüm bunlara ihtiyacımız var [String, T].

Ne yazık ki :gdoğrudan sonuçlanır [[String, T], built-in_group], bu itamsayı Tilk listenin içinde olduğu için doğru şekilde tanınmaz .


4

MATL, 6 bayt

ji:"Xh

Bu, çıktı olarak iç içe bir hücre dizisi üretir. Ancak MATL'in varsayılan ekranı ile, tüm kıvırcık parantezleri göstermeyeceğinden bunun ne olduğunu göremezsiniz . Aşağıdaki demo, çıktının dize olarak temsilini gösteren biraz değiştirilmiş bir sürümdür.

ji:"Xh]&D

Çevrimiçi Deneyin

açıklama

j       % Explicitly grab the first input as a string
i       % Explicitly grab the second input as an integer (n)
:"      % Create an array [1...n] and loop through it
    Xh  % Each time through the loop place the entire stack into a cell array
        % Implicit end of for loop and display


3

Pyth , 3 bayt

]Fw

kalıcı

Bu gibi bir şey çıktı ...[[[[['string']]]]].... Sıfır derinlik için teklif vermeyecektir:string .

Açıklama:

]Fw
   Q Implicit: Eval first input line
]    Function: Wrap in array
  w  Input line
 F   Apply multiple times

Sıfır derinlikte alıntı yapmak istiyorsanız, bunun yerine bu 4 baytlık çözümü kullanın (açıklama):

`]Fw
    Q Implicit: Eval first input line
 ]    Function: Wrap in array
   w  Input line
  F   Apply multiple times
`     Representation

3

PHP, 60 Bayt

for($r=$argv[1];$i++<$argv[2];)$r=[$r];echo json_encode($r);

48 Görev yalnızca görev gibi görünüyorsa

for($r=$argv[1];$i++<$argv[2];)$r="[$r]";echo$r;

Ben soru sahibinin kendi Python cevabın doğrudan yeniden yazma çok hala PHP en kısa olduğunu düşünüyorum: function f($s,$n){return$n?[f($s,$n-1)]:$s;}.
manatwork

print_r()ve bu seçeneği beğenmezseniz , çıktıyı farklılaştırırken serialize()ikisini de kısaltmak json_encode()gerekir.
user59178

BTW, ')kodun sonunda yalnız olan garip görünüyor.
manatwork

@manatwork Kopyala ve Yapıştır hatası Teşekkürler
Jörg Hülsermann

3

Yakut: 23 bayt

->n,s{n.times{s=[s]};s}

Bu, orijinal snippet yerine çağrılabilir bir Proc olacak şekilde güncellenir. sAçıkça iade etmek yerine dolaylı olarak geri dönmenin bir yolu olup olmadığını bilmek isterim .


2
Genellikle "birkaç kelime daha" kodunuzun nasıl çalıştığının bir açıklaması olmalıdır. Ama yine de iyi bir cevap.
wizzwizz4

“Bir işlev üretmelisiniz” Bu bir kod pasajıdır. Aksi açıkça belirtilmedikçe, girdi ve çıktı kod tarafından açıkça veya böyle bir özelliğe sahipse yorumlayıcı tarafından dolaylı olarak ele alınmalıdır. Bazı global değişkenlerin ayarlanmasını bekleyemezsiniz ve sonucu sadece bazı global değişkenlerde bırakamazsınız.
manatwork

PPCG'ye Hoşgeldiniz! Tüm cevaplar çağrılabilir işlevler veya tam programlar olmalıdır. Sizin durumunuzda, en kısa düzeltme, adsız bir işlevi kullanmak olacaktır ->s,n{...}.
Martin Ender

@ wizzwizz4 ve Martin, cesaretiniz ve yardımcı girdiniz için teşekkür ederim, bir şeyler öğrendim ve güncelleyeceğim. manatwork, kalın bir cildim var ve SO üzerinde çok puanım var ama bunun gibi künt ifadelerin Stack sitelerinden uzak korkutup korkuttuğunu biliyorsunuz. Utanç verici değil mi?
Peter Nixey

3

C, 44 bayt , 41 bayt

int*n(int*s,int a){return a?n(&s,a-1):s;}

Aşağıdakileri yaparak test edebilirsiniz:

int main(void) {
    char* s = "stackoverflow";

    /* Test Case 0 */
    int* a = n(s,0);
    printf("'%s'\n", a);

    /* Test Case 1 */
    int* b = n(s,1);
    printf("['%s']\n", *b);

    /* Test Case 2 */
    int** c = n(s,2);
    printf("[['%s']]\n", **c);

    /* Test Case 3 */
    int*** d = n(s,3);
    printf("[[['%s']]]\n", ***d);

    /* Test Case 4 */
    int********** e = n(s,10);
    printf("[[[[[[[[[['%s']]]]]]]]]]\n", **********e);

    return 0;
}

Çıktı:

'stackoverflow'
['stackoverflow']
[['stackoverflow']]
[[['stackoverflow']]]
[[[[[[[[[['stackoverflow']]]]]]]]]]

Tabii ki uyarılar alacaksınız. Bu, gccWindows makinemde ( gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)ve gerçek bir Linux makinesinde ( gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)) bash üzerinde çalışır .


2
Diğer derleyiciler hakkında emin değilim ama int*n(s,a)int*s;{return!a?s:n(&s,a-1);}gcc ile çalışır.
Dennis

cc -v-> için segfaults Apple LLVM version 8.0.0 (clang-800.0.38).
nimi

2
!Üçlü durumdan düşebilir ve bir baytın sırasını değiştirebilir sve n(&s,a-1)kaydedebilir misiniz?
Riley

2
Aradığınızda @VolAnd n(s,6), değiştirmek zorunda ***için ******değişken bildiriminde ve kullanımda. Bu tam olarak gereklidir, çünkü fonksiyon beklenen şeyi yapar: dizeyi birkaç (burada: 6) kez bir diziye yerleştirir. Elbette []sabit kodlanmış oldukları için üç seviye elde edersiniz . Programın çıktılarını hiç almaması gerektiğini düşünüyorum. Bu zorluk parantezler değil, yuvalama ile ilgili. Bazı dillerde parantez içeren diziler yazdırılır, C'nin bunları yazdırmak için yerleşik bir işlevi yoktur. Ne olmuş yani? Burada gerekli değil.
Christian Sievers

1
*Fonksiyon imzasındaki boşluklardan sonra boşluk bırakabilir misiniz ?
Monica'nın Davası


2

Ruby, 25 karakter

Arasında yeniden yaz jamylak 'ın Python çözümü .

f=->s,n{n>0?[f[s,n-1]]:s}

Örnek çalışma:

irb(main):001:0> f=->s,n{n>0?[f[s,n-1]]:s}
=> #<Proc:0x00000002006e80@(irb):1 (lambda)>

irb(main):002:0> f["stackoverflow",0]
=> "stackoverflow"

irb(main):003:0> f["stackoverflow",1]
=> ["stackoverflow"]

irb(main):004:0> f["stackoverflow",5]
=> [[[[["stackoverflow"]]]]]

2

C # 6, 50 bayt

dynamic a(dynamic s,int n)=>n<2?s:a(new[]{s},n-1);

1
Olmamalı mı n<1? objectBunun yerine -2 bayt kullanırsanız dynamic.
süt

2

Yakut, 24 bayt

f=->*s,n{s[n]||f[s,n-1]}

İnsanoğlunun cevabı ile aynı denir , ama bir garip uygulama. *sgirdiyi (muhtemelen iç içe dizgi) bir diziye sarar. Sonra nsıfır ise , işlevinin no-op haline dönüştürülmesinin s[n]ilk öğesini döndürür s. Aksi takdirde, döner nilberi sbiz özyinelemeli çağrısına geçmesine böylece sadece hiç bir eleman olacaktır.




2

Agda, 173 bayt

İşlevin dönüş türü bağımsız değişken olarak verilen sayıya bağlı olduğundan, bu açıkça bağımlı bir şekilde yazılan bir dilin kullanılması gereken bir durumdur. Ne yazık ki, golf kullanmak için doğalları ve listeleri almak zorunda olduğunuz bir dilde golf yapmak kolay değildir. Artı tarafta, sucayrıntılı olmasını beklediğim yerde kullanıyorlarsucc . İşte benim kod:

module l where
open import Data.List
open import Data.Nat
L : ℕ -> Set -> Set
L 0 a = a
L(suc n)a = List(L n a)
f : ∀ n{a}-> a -> L n a
f 0 x = x
f(suc n)x = [ f n x ]

(Umarım boşlukların atlanabileceği tüm yerleri buldum.) LDoğal verilen bir tür fonksiyonudur nve bir tür iç içe listelerin türünü adöndürür , bu yüzden listelerin liste listelerinin türü olurdu ( ithal ). Bu, işlevimizin türünü şu şekilde ifade etmemizi sağlar:naL 3 BoolBoolBool(n : ℕ) -> {a : Set} -> a -> L n a , kıvırcık parantezlerin bu argümanı örtülü kıldığı . Kod, bu tür yazmak için daha kısa bir yol kullanır. Fonksiyon artık ilk argümandaki desen eşleşmesi ile açık bir şekilde tanımlanabilir.

Bir Bu dosyayı yükleme .agdaemacs'dan uzantıya kullanımına izin veren C-c C-nörneğin girişi (normal forma terimini değerlendirmek) f 2 3ve garip bir biçimde doğru cevabı alıyorum: (3 ∷ []) ∷ []. Şimdi elbette bunu dizelerle yapmak istiyorsanız, onları içe aktarmanız gerekir ...


Sadece bunun yerine yazabileceğimi hatırladım ->, ancak elbette ki UTF-8 kodlu bir dosyanın boyutunu arttırıyor.
Christian Sievers

Bunu Haskell'e çirkin çevirim biraz daha kısa. Kısa tutmak için elle tek başınıza sadık kalmak zorundayım.
dfeuer

2

k, 3 bayt

,:/

İkili bir işlev olarak alındığında /, soldaki işlevi ,:( enlist) n kez ikinci bağımsız değişkene yinelemeli olarak uygular .

Misal:

k),:/[3;"hello"]
,,,"hello"

1

PHP, 44 bayt

function n($s,$n){return$n?n([$s],--$n):$s;}

sofistike bir şey yok, sadece özyinelemeli bir işlev


1

Python 2, 32 bayt

lambda s,n:eval('['*n+`s`+']'*n)

nAçık parantezleri dizenin önüne koyar ve nparantezleri önünden kapatır, ardından sonucu değiştirir. Bir dize çıktısına izin verilirse, evalkaldırılabilir.


1

Aslında 4 bayt

Girdi stringSonran . Golf önerileri hoş geldiniz. Çevrimiçi deneyin!

`k`n

Ungolfing

          Implicit input string, then n.
`...`n    Run the function n times.
  k         Wrap the stack in a list.
          Implicit return.

1

R, 39 40 bayt

DÜZENLEME: Sabit n=0 @rturnbull sayesinde sorun .

İki giriş s(dize) ve n(iç içe geçme) alan ve iç içe liste çıkaran işlev. Ancak R-sınıfının listçıktıyı yerel olarak diğer dillerden farklı şekilde yazdırdığını, ancak işlevsel olarak bir anahtar / değer haritasına (muhtemelen adsız anahtarlarla) veya python'daki bir listeye benzediğini unutmayın.

f=function(s,n)if(n)list(f(s,n-1))else s

Misal

> f=function(s,n)if(n)list(f(s,n-1))else s
> f("hello",3)
[[1]]
[[1]][[1]]
[[1]][[1]][[1]]
[1] "hello"


> # to access the string nested 5 times in the "list-object" named "list" we can do the following
> list = f("nested string",5)
> list[[1]][[1]][[1]][[1]][[1]]
[1] "nested string"

1
Çok hoş! Yine de istenen çıktıyı vermez n=0. Cevabınızı n=0f=function(s,n)if(n)list(f(s,n-1))else s
görmeden

@rturnbull Tabii ki haklısın. Çözümünüz bence çok daha zarif ve n=0davayı tamamen unuttum . Ancak, çözümünüz aslında 38işlevin adlandırılması ve dolayısıyla daha kısa olan baytlardır. Büyük av
Billywob

1
Özyinelemeli bir işlev olduğundan maalesef adlandırılmalıdır! (Aksi takdirde f(s,n-1)içindeki çağrıyı yorumlayamaz .) R'de bildiğim kadarıyla yinelemeli anonim işlevler mümkün değildir.
rturnbull

@rturnbull Yine haklısın. Cevabı güncelleme.
Billywob

Bir yıl sonra, başka bir bayt çıkardım: f=function(s,n)'if'(n,list(f(s,n-1)),s) .
rturnbull

1

Raket 83 bayt

(for((c n))(set! s(apply string-append(if(= c 0)(list"[\'"s"\']")(list"["s"]")))))s

Ungolfed:

(define (f s n)
  (for ((c n))
    (set! s (apply string-append
                   (if (= c 0)
                       (list "[\'" s "\']")
                       (list "[" s "]"))
                   )))
  s)

Test yapmak:

(f "test" 3)

Çıktı:

"[[['test']]]"

1

Haskell, 40 38 bayt

data L=N[Char]|C L 
f 0=N
f n=C. f(n-1)

Haskell'in katı tip sistemi farklı türlerin (Dizeler vs Dizeler Listesi vs Dizeler Listesi, ...) geri dönmesini önler, bu yüzden tüm bu durumları barındıran kendi tipimi tanımlamalıyım. Ana işlev , yapıcı ve temel durum için yapıcıyı ftekrar tekrar çağırır .nCN

Kullanım örneği ( yazdırabilmek deriving (Show)için yeni datatüre eklenmiş olarak ): f 4 "codegolf"->C (C (C (C (N "codegolf")))) .

Düzenleme: @Christian Sievers işlevi dize argümanı için noktasız bir tarzda yeniden yazarak 2 bayt kaydetti. Teşekkürler!


Elbette Haskell listeleri iç içe yerleştirilebilir, ancak bir işlev bir değer için dize ve aynı türdeki başka bir değer için dize listesi listesi döndüremez. Ek derivingfıkra golf : parens gerekli değildir. - Yalnızca Cliste benzeri olmayan kurucuyu yerleştirmenin doğru olup olmadığından emin değilim. Benim çok benzer girişimim olarak tanımlanan bir veri türüne dayanıyordu data D x=J x|L[D x].
Christian Sievers

Argümanların sırasını tersine çevirir ve bir infix operatörü kullanmazsanız, ikinci argümandan bahsetmenize gerek yoktur:f 0=N;f n=C. f(n-1)
Christian Sievers

@ChristianSievers: evet, haklısın, iç içe listelerle ilgili açıklamam doğru değildi - değiştirdim. Liste benzerliği ile ilgili olarak: Veri yapımın liste benzeri olduğunu düşünüyorum. Yerel Haskell listesini 1:(2:(3:([])))C (C (C (N "codegolf"))) ile karşılaştırın. Ccons ( :), Nnil ( []) 'dir.
nimi

Ceksileri yoktur, yalnızca gömülür, veri türünüz ifade edemez [["a","b"],["c"]]. Ama belki de bu sorun sadece singletonlara ihtiyaç duyduğu için sorun değil. - f n=...noktasal değil. Noktadan azaltılmış?
Christian Sievers

Veri türünüzü tanımlamak için 19 karakter harcıyorsunuz. Mevcut bir türün (ör. Either) Yapıcıların biraz daha ayrıntılı olduğu anlamına gelse bile daha mantıklı olmaz mıydı ?
Periata Breatta

1

tinylisp (repl), 34 bayt

(d F(q((S N)(i N(F(c S())(s N 1))S

Bir işlevi tanımlar F. Teknik olarak tinylisp dizeleri içermez, ancak bu kod verilen herhangi bir veri türü için çalışır.

Ungolfed (yerleşiklerin anahtarı: d= tanımla, q= alıntı yap, i= if, c= eksileri, s= çıkar):

(d nest
 (q
  ((item number)
   (i number
    (nest (c item ()) (s number 1))
    item))))

Örnek kullanım:

tl> (d F(q((S N)(i N(F(c S())(s N 1))S
F
tl> (F 2 3)
(((2)))
tl> (F () 1)
(())
tl> (F (q Hello!) 7)
(((((((Hello!)))))))
tl> (F c 3)
(((<builtin function tl_cons>)))

1

Clojure, 24 bayt

#(nth(iterate list %)%2)

Clojure burada biraz rekabetçidir. iteratebir dizi oluşturur x, (f x), (f (f x)) ...,nth gerekli öğeyi döndürür.

Çevrimiçi görün: https://ideone.com/2rQ166

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.