N (e (s (t))) una stringa


77

Per "annidare la funzione" una stringa, è necessario:

  • Tratta il primo carattere come una funzione e i seguenti caratteri come argomenti per quella funzione. Ad esempio, se la stringa di input fosse Hello, il primo passo sarebbe:

    H(ello)
    
  • Quindi, ripetere questo stesso passaggio per ogni sottostringa. Quindi otteniamo:

    H(ello)
    H(e(llo))
    H(e(l(lo)))
    H(e(l(l(o))))
    

Il tuo compito è quello di scrivere un programma o una funzione che "nidi funzione" una stringa. Ad esempio, se la stringa di input fosse Hello world!, allora dovresti produrre:

H(e(l(l(o( (w(o(r(l(d(!)))))))))))

L'input conterrà sempre e solo ASCII stampabile , e puoi prendere l'input e l'output in qualsiasi formato ragionevole. Ad esempio, STDIN / STDOUT, argomenti di funzione e valore di ritorno, lettura e scrittura su un file, ecc.

Per semplicità, puoi anche supporre che l'input non conterrà parentesi e non sarà vuoto.

Input:
Nest a string
Output:
N(e(s(t( (a( (s(t(r(i(n(g))))))))))))

Input:
foobar
Output:
f(o(o(b(a(r)))))

Input:
1234567890
Output:
1(2(3(4(5(6(7(8(9(0)))))))))

Input:
code-golf
Output:
c(o(d(e(-(g(o(l(f))))))))

Input:
a
Output:
a

Input:
42
Output:
4(2)

Come al solito, si applicano tutte le nostre regole e lacune predefinite e vince la risposta più breve segnata in byte!


21
Ahem: questo messaggio ha a che fare con la sfida? :-)
wizzwizz4,

12
T I L 4 2 = 8
ETHproductions

Qual è la lunghezza massima per la stringa di input? Caso di metodi ricorsivi
Ferrybig,

1
@ kamoroso94 You may take the input and the output in any reasonable format.Un elenco di personaggi mi sembra perfettamente ragionevole.
DJMcMayhem

1
Ecco come appare il codice Lisp
caird coinheringaahing

Risposte:


63

Python, 41 39 34 byte

lambda e:"(".join(e)+")"*~-len(e)

Ideone

Abbastanza esplicativo.

Mette una parentesi tra ogni altro carattere, quindi ne aggiunge una in meno della lunghezza tra parentesi alla fine.


13
Quel trucco ~ è fico, dovrò ricordarlo.
Skyler,

come funziona il ~-trucco?
ShadowFlame,

1
@ShadowFlame -rende il numero negativo e il ~bit lo ribalta. Puoi leggere qualcosa in più sulla pagina dei suggerimenti .
Wheat Wizard

1
@ShadowFlame. La meccanica è come ha detto WheatWidard. Funziona su sistemi che utilizzano la modalità a doppio complemento per memorizzare numeri negativi (che è la maggior parte dei sistemi al giorno d'oggi).
Fisico pazzo,

1
@MadPhysicist Con Python, funziona sempre, perché ~ è definito come -x-1
Mega Man,

45

File .com MS-DOS, 30 byte

0000   fc be 82 00 b4 02 ac 88 c2 cd 21 ac 3c 0d 74 0d
0010   b2 28 50 cd 21 5a e8 f0 ff b2 29 cd 21 c3

La stringa viene passata all'eseguibile utilizzando la riga di comando. (Un carattere spazio tra il nome del file .COM e la stringa).

Il risultato viene scritto nell'output standard.

Lo smontaggio è qui:

  fc          cld              ; Make sure DF is not set (lodsb!)
  be 82 00    mov    si,0x82   ; First character of command line args
  b4 02       mov    ah,0x2    ; AH=2 means output for INT 21h
  ac          lodsb            ; Load first character
  88 c2       mov    dl,al     ; Move AL to DL (DL is written to output)
recursiveFunction:
  cd 21       int    0x21      ; Output
  ac          lodsb            ; Get the next character
  3c 0d       cmp    al,0xd    ; If it is "CR" (end of command line) ...
  74 0d       je     doReturn  ; ... return from the recursive function
  b2 28       mov    dl,0x28   ; Output "(" next...
  50          push   ax        ; ... but save character read first
  cd 21       int    0x21      ; (Actual output)
  5a          pop    dx        ; Restore character (but in DL, not in AL)
  e8 f0 ff    call   recursiveFunction  ; Recursively enter the function
doReturn:
  b2 29       mov    dl,0x29   ; Output ")"
  cd 21       int    0x21
  c3          ret              ; Actually return

Nota: è possibile uscire da un file .COM DOS (diversamente dai file con intestazioni EXE) usando un'istruzione "RET".


Dal momento che non riesco a trovare alcuna documentazione effettiva o informazioni soddisfacenti: perché call 0xfoff? Il programma è caricato in memoria all'indirizzo 0per quanto ne so (o 0x100su CP / M-DOS ma queste sembrano essere istruzioni x86), perché recursiveFunctionimprovvisamente si trova in 0xffof? Sembra iniziare 9 byte dopo l'inizio del programma e non ci sono virtualizzazione o metadati nell'eseguibile.
gatto

6
DOS carica i file .COM da indirizzare, 0x100tuttavia questo programma verrebbe eseguito anche su QUALSIASI indirizzo: e8 f0 ffè un'istruzione di chiamata relativa : salta all'indirizzo dell'istruzione seguendo l' callistruzione meno 0x10.
Martin Rosenau,

32

JavaScript (ES6), 40 34 33 byte

Risparmiato 6 byte, grazie a ETHproductions

Una funzione ricorsiva.

f=([c,...s])=>s+s?c+`(${f(s)})`:c

Provalo online!


1
Bel trucco con 1/s.
ETHproductions

Un bel trucco con ([c,...s])te dovrebbe scrivere un consiglio
edc65,

@ edc65 Per motivi di chiarezza, questo è stato suggerito da ETHproductions.
Arnauld,

o beh, qualcuno deve scrivere comunque una mancia
edc65,

1
@jmingov grazie, lo so. Il punto qui sta usando DA per tagliare una stringa in un modo molto breve (molto più corto di .slice)
edc65

27

Brainfuck, 42 40 byte

>+[-->+[<]>-]>+>>,.,[<+<.>>.,]<<+>[-<.>]

Provalo online!

Ungolfed:

>+[-->+[<]>-]>+     # count to 40 (ASCII for open paren)
>>                  # move to the input holder
,.                  # input the first byte and output it
,                   # input the next byte
[                   # while it's not zero
  <+                # move to the input counter and increment it
  <.                # move to the open paren and output it
  >>.               # move to the input holder and output it
  ,                 # input the next byte
]
<<+                 # move to the open paren and increment it to a close
>                   # move to the input counter
[                   # while it's not zero
  -                 # decrement it
  <.                # move to the close paren and output it
  >                 # move to the input counter
]

1
Di solito c'è un modo più breve per ottenere una costante rispetto all'ovvia moltiplicazione a 2 fattori.
Martin Ender,

Ah, grazie. Questa è stata la mia prima presentazione BF (il mio primo programma BF, davvero) quindi sono sicuro che ci sono anche molti altri possibili miglioramenti.
Alex Howansky,

hai un paio di parentesi troppo !?
Vloxxity,

Questo mette una coppia vuota tra parentesi dopo l'ultimo carattere della stringa. Non so se c'è un modo per evitarlo senza aggiungere ",." prima del loop e commuta l'ordine di output all'interno del loop, il che rende il programma più lungo di due byte.
user59468,

Ah bugger, hai ragione. Non ho letto abbastanza attentamente e ho trasformato l'ultima lettera in una chiamata di funzione come le altre.
Alex Howansky,

23

05AB1E , 11 byte

S'(ý¹g<')×J

Provalo online!

Spiegazione:

S'(ý         join input by "("
    ¹g<      push length of input - 1, call it n
       ')×   push a string with char ")" n times
          J  concatenate

18

Brainfuck, 44 byte

>+++++[-<++++++++>],.,[<.>.>+<,]<+>>[-<<.>>]

Legge un byte alla volta, mette una parentesi aperta prima di ognuna tranne la prima, mette alla fine lo stesso numero di parentesi chiuse.


+++++[->++++++++<],.,[>.>+<<.,]>+>[-<.>]è leggermente più corto.
Tesseract,

17

Haskell, 30 byte

f[x]=[x]
f(a:b)=a:'(':f b++")"

Esempio di utilizzo: f "Nest a string"-> "N(e(s(t( (a( (s(t(r(i(n(g))))))))))))".

Prendi il carattere successivo, seguito da un (, seguito da una chiamata ricorsiva con tutti tranne il primo carattere, seguito da un ).


2
Se interpretiamo le risposte come Haskell, possiamo risolverle con solo f=Data.List.intersperse '$'! Questo ci dà f "Nest a string"-> "N$e$s$t$ $a$ $s$t$r$i$n$g".
porglezomp,

Volevo solo farti sapere che @fornit (non ha abbastanza rappresentante per commentare) ha suggerito di usarlo f[]=[]come un caso base instaurato dal tuo f[x]=[x]. Non ho familiarità con Haskell, quindi non so se sia legittimo o no, ti lascerò giudicare.
Dada,

@Dada: non funzionerà, perché metterebbe un ulteriore ()dietro l'ultima lettera, ad es. f "abc"-> "a(b(c()))".
nimi,

Anche questo non gestisce input vuoti. La versione più corta corretta ho potuto trovare è 44, con una tecnica diversa: f=(++).intersperse '('<*>drop 1.map(\_->')').
Jon Purdy,

@JonPurdy: non dobbiamo gestire input vuoti. intersperserichiede import Data.Listaltri 17 byte.
nimi,

16

Gelatina , 9 8 byte

-1 byte grazie a @Dennis (usa stampo , al posto della lunghezza L, e ripeti, x)

j”(³”)ṁṖ

TryItOnline

Come?

j”(³”)ṁṖ - Main link: s     e.g. "code-golf"           printed output:
j        - join s with
 ”(      - literal '('           "c(o(d(e(-(g(o(l(f"
    ”)   - literal ')'
      ṁ  - mould like
   ³     - first input, s        ")))))))))"
         - causes print with no newline of z:          c(o(d(e(-(g(o(l(f
       Ṗ - pop (z[:-1])          "))))))))"            c(o(d(e(-(g(o(l(f
         - implicit print                              c(o(d(e(-(g(o(l(f))))))))

3
A proposito, in ³realtà Jelly stampa l'attuale valore di ritorno, quindi non hai mai due elenchi di caratteri.
Dennis,

13

Retina , 22 17 byte

\1>`.
($&
T`(p`)_

Provalo online!

In alternativa:

S_`
\`¶
(
T`(p`)_

Spiegazione

Dimentico sempre che è possibile stampare roba lungo la strada invece di trasformare tutto nel risultato finale e produrlo in una volta sola ...

\1>`.
($&

Qui \dice a Retina di stampare il risultato di questa fase senza un avanzamento di riga finale. La 1>è un termine che significa che il primo match della regex dovrebbe essere ignorato. Per quanto riguarda lo stesso stage, sostituisce semplicemente ogni personaggio ( .) tranne il primo con (seguito da quel personaggio. In altre parole, si inserisce (tra ogni coppia di caratteri. Per input abc, questo lo trasforma in (e stampa)

a(b(c

Non resta che stampare le parentesi di chiusura:

T`(p`)_

Questo viene fatto con una traslitterazione che sostituisce (con )e cancella tutti gli altri caratteri ASCII stampabili dalla stringa.


Dangit. Così veloce ...
mbomb007,

@ mbomb007 ... e tutt'altro che ottimale. ;)
Martin Ender,

13

> <> , 19 18 byte

io8i:&0(.')('o&!
o

Provalo online!

Spiegazione

La prima riga è un loop di input che stampa tutto fino all'ultimo carattere dell'input (inclusi tutti i ( ) e lascia la giusta quantità di )nello stack:

io                 Read and print the first character.
  8                Push an 8 (the x-coordinate of the . in the program).
   i               Read a character. Pushes -1 at EOF.
    :&             Put a copy in the register.
      0(           Check if negative. Gives 1 at EOF, 0 otherwise.
        .          Jump to (8, EOF?). As long as we're not at EOF, this is
                   a no-op (apart from popping the two coordinates). At EOF
                   it takes us to the second line.
         ')('      Push both characters.
             o     Output the '('.
              &    Push the input character from the register.
               !   Skip the 'i' at the beginning of the line, so that the next
                   iteration starts with 'o', printing the last character.

Una volta che colpiamo EOF, il puntatore dell'istruzione finisce sulla seconda riga e semplicemente eseguiremo oin un ciclo, stampando tutto ), fino a quando lo stack è vuoto e il programma si guasta.


12

J, 13 byte

(,'(',,&')')/

J viene eseguito da destra a sinistra, quindi utilizzando l'avverbio di inserimento /, è possibile utilizzare un verbo per ridurre le lettere della stringa di input.

uso

   f =: (,'(',,&')')/
   f 'Nest a string'
N(e(s(t( (a( (s(t(r(i(n(g))))))))))))
   f 'foobar'
f(o(o(b(a(r)))))
   f '1234567890'
1(2(3(4(5(6(7(8(9(0)))))))))
   f 'code-golf'
c(o(d(e(-(g(o(l(f))))))))

È possibile osservare le uscite parziali tra ciascuna riduzione.

   |. f\. 'Hello'
o            
l(o)         
l(l(o))      
e(l(l(o)))   
H(e(l(l(o))))

Spiegazione

(,'(',,&')')/  Input: string S
(          )/  Insert this verb between each char and execute (right-to-left)
      ,&')'      Append a ')' to the right char
  '(',           Prepend a '(' to that
 ,               Append to the left char

12

C #, 32 byte

F=s=>*s+++(0<*s?$"({F(s)})":"");

Questo lambda deve essere un metodo statico, dovrei contare eventuali byte extra per quel requisito? Normalmente non userei un lambda per la ricorsione in C #, ma poi penso che sarebbe più breve non usare la ricorsione.

/*unsafe delegate string Function(char* s);*/ // Lambda signature
/*static unsafe Function*/ F = s =>
    *s++                               // Take first char and increment pointer to next one
    + (0 < *s                          // Check if any chars left
        ? $"({F(s)})"                  // If so concat surrounding parens around recursion
        : ""                           // Otherwise done
    )
;

la definizione dovrebbe essere eseguita come dichiarato e conteggiato
cat

9

R, 61 byte

cat(gsub("(?<=.)(?=.)","(",x,F,T),rep(")",nchar(x)-1),sep="")

Regex trova e sostituisce gli spazi tra i caratteri con "(". Quindi cate repaggiungi ")" n-1 volte alla fine.


Può effettivamente sottrarre 1 byte qui eliminando la F, in questo modo , perché ogni voce ha già un'impostazione predefinita, quindi lasciare un carattere vuoto tra le virgole farà sì che l'opzione ignore.case utilizzi il suo valore predefinito. Ma probabilmente sapevi che ... Lavoro ben fatto!
Sumner18,

9

Java 7,81 79 byte

1Byte salvato. Grazie a Kevin.

String f(char[]a,String b,int l){return l<a.length?f(a,b+'('+a[l],++l)+')':b;}

Bel approccio ricorsivo. Più breve del for-loop che stavo per pubblicare. +1 Due cose che puoi giocare a golf: l!=a.length-> l<a.lengthe b=b+'('+a[l],++l)+')'-> b+="("+a[l],++l)+")"( -2 byte )
Kevin Cruijssen

@KevinCruijssen b+="("+a[l],++l)+")"ti dà 144141148))) e BTW b+"("+a[l],++l)+")"è corretto. e questo è stato un mio errore molto sciocco ( !=).
Numberknot,

No, b+='('+a[l],++l)+')'144141148, ma b+="("+a[l],++l)+")"non lo fa. Le parentesi sono racchiuse tra virgolette invece di virgolette.
Kevin Cruijssen,

Pubblico la mia versione (82 byte in Java 7) usando solo l'input String come parametro. Verbose ma non così male;) Se trovi qualcosa da cambiare: codegolf.stackexchange.com/a/96745/59739
AxelH

8

PowerShell v2 +, 46 byte

param([char[]]$a)($a-join'(')+')'*($a.count-1)

Prende la stringa di input, char-array, -joins l'array insieme a parentesi aperte (, quindi concatena il numero appropriato di parentesi chiuse ).


8

APL, 19 byte

{∊('(',¨⍵),')'⍴⍨⍴⍵}

Spiegazione:

{
  ('(',¨⍵)          ⍝ join a ( to each character in ⍵          
          ,')'⍴⍨⍴⍵  ⍝ for each character in ⍵, add an ) to the end
 ∊                  ⍝ flatten the list 
                   }

Soluzione alternativa, anche 19 byte:

{⊃{∊'('⍺⍵')'}/⍵,⊂⍬}

Spiegazione:

{              
              ⍵,⊂⍬  ⍝ add an empty list behind ⍵ (as a base case)
  {         }/      ⍝ reduce with this function:
    '('⍺⍵')'        ⍝   put braces around input
   ∊                ⍝   flatten the list
 ⊃                  ⍝ take first item from resulting list
                   }

6
Dove acquisti le tastiere per una lingua simile !!!
Ronan Dejhero,

@RonanDejhero Forse semplicemente rimappando le chiavi usando cltr, shift, alt, capslock, numlock ecc.
Ariana,

8

MATL , 16 byte

t~40+v3L)7MQ3L)h

Provalo online!

Spiegazione

t     % Implicit input. Duplicate
      % STACK: 'foobar', 'foobar'
~     % Negate. Transforms into an array of zeros
      % STACK: 'foobar', [0 0 0 0 0 0]
40+   % Add 40, element-wise. Gives array containing 40 repeated
      % STACK: 'foobar', [40 40 40 40 40 40]
v     % Concatenate vertically. Gives a two-row char array, with 40 cast into '('
      % STACK: ['foobar'; '((((((']
3L)   % Remove last element. Converts to row vector
      % STACK: 'f(o(o(b(a(r'
7M    % Push array containing 40 again
      % STACK: 'f(o(o(b(a(r', [40 40 40 40 40 40]
Q     % Add 1, element-wise 
      % STACK: 'f(o(o(b(a(r', [41 41 41 41 41 41]
h     % Concatenate horizontally, with 41 cast into ')'
      % STACK: 'f(o(o(b(a(r)))))'
      % Implicit display

8

Acc !! , 129 byte

Non male per un tarpit di Turing abbastanza prolisso ...

N
Count i while _%128-9 {
Count x while _/128%2 {
Write 40
_+128
}
Write _%128
_+128-_%128+N
}
Count j while _/256-j {
Write 41
}

(Sì, tutto quello spazio bianco è obbligatorio.)

Nota: a causa delle limitazioni di input di Acc !! , è impossibile leggere una stringa arbitraria di caratteri senza delimitatore finale. Pertanto, questo programma prevede input (su stdin) come una stringa seguita da un carattere di tabulazione.

Acc !! ?

È una lingua che ho creato che sembra essere inutilizzabile . L'unico tipo di dati è numeri interi, l'unico costrutto del flusso di controllo è il Count x while yciclo e l'unico modo per archiviare i dati è un singolo accumulatore _. L'input e l'output vengono eseguiti un carattere alla volta, utilizzando il valore speciale Ne l' Writeistruzione. Nonostante questi limiti, sono abbastanza sicuro che Acc !! è Turing completo.

Spiegazione

La strategia di base in Acc !! la programmazione consiste nell'utilizzare la %divisione mod e integer /per partizionare concettualmente l'accumulatore, consentendogli di memorizzare più valori contemporaneamente. In questo programma, utilizziamo tre di queste sezioni: i sette bit di ordine più basso ( _%128) memorizzano un codice ASCII dall'input; il bit successivo ( _/128%2) memorizza un valore flag; e i bit rimanenti ( _/256) contano il numero di parentesi chiuse di cui avremo bisogno.

Ingresso in Acc !! deriva dal valore speciale N, che legge un singolo carattere e restituisce il suo codice ASCII. Qualsiasi affermazione che consiste esclusivamente in un'espressione assegna il risultato di quell'espressione all'accumulatore. Quindi iniziamo memorizzando il codice del primo personaggio nell'accumulatore.

_%128memorizzerà l'ultimo carattere letto. Quindi il primo ciclo viene eseguito mentre _%128-9è diverso da zero, ovvero fino a quando il carattere corrente non è una scheda.

All'interno del ciclo, vogliamo stampare a ( meno che non siamo alla prima iterazione. Dal momento che Acc !! non ha un'istruzione if, dobbiamo usare i loop per i condizionali. Usiamo il bit 128 dell'accumulatore _/128%2, come valore flag. Al primo passaggio, l'unica cosa nell'accumulatore è un valore ASCII <128, quindi il flag è 0 e il ciclo viene saltato. Ad ogni passaggio successivo, ci assicureremo che la bandiera sia 1.

All'interno del Count xloop (ogni volta che il flag è 1), scriviamo un open paren (ASCII 40) e aggiungiamo 128 all'accumulatore, impostando così il flag su 0 ed uscendo dal loop. Questo succede anche per aumentare il valore di _/256, che useremo come nostro conteggio di parentesi ravvicinate da produrre.

Indipendentemente dal valore della bandiera, scriviamo il carattere di input più recente, che è semplicemente _%128.

Il prossimo incarico ( _+128-_%128+N) fa due cose. Innanzitutto, aggiungendo 128, imposta la bandiera per la prossima volta attraverso il ciclo. In secondo luogo, azzera lo _%128slot, legge un altro personaggio e lo memorizza lì. Quindi andiamo in loop.

Quando il Count iciclo termina, abbiamo appena letto un carattere di tabulazione e il valore dell'accumulatore si scompone in questo modo:

  • _%128: 9(il carattere di tabulazione)
  • _/128%2: 1(la bandiera)
  • _/256: numero di caratteri letti, meno 1

(Il meno 1 è perché aggiungiamo 128 all'accumulatore solo una volta durante il primo passaggio attraverso il circuito principale.) Tutto ciò di cui abbiamo bisogno ora sono i parentesi strette. Count j while _/256-jCicli _/256volte, scrivendo un paren vicino (ASCII 41) ogni volta. Ecco!


7

Perl, 25 byte

Grazie a @Ton Hospel per aver giocato a golf 4 byte.

24 byte di codice + -F.

$"="(";say"@F".")"x$#F

Bisogni -Fe -Ebandiere:

echo -n "I love lisp" | perl -F -E '$"="(";say"@F".")"x$#F'

Nota che se lo provi su una vecchia versione di perl, potresti dover aggiungere -aflag.


Un altro modo interessante (un po 'più lungo però: 28 byte):
Grazie ancora una volta a Ton Hospel per avermi aiutato a farlo bene.

#!/usr/bin/perl -p
s/.(?=.)/s%\Q$'%($&)%/reg

(Per usarlo, inserisci il codice all'interno di un file e chiamalo con echo -n "Hello" | perl nest.pl)


Non è necessario il ""dopo il -F. Inoltre, non è necessario -lse si richiede l'inserimento della stringa di input senza la nuova riga finale:echo -n Hello | program
Ton Hospel

@TonHospel Giusto, ho dimenticato (o non sapevo, non sono sicuro) di questo comportamento -F, grazie. (Mi chiedevo come ottenere l'input senza la nuova riga finale, grazie anche per quello)
Dada,

perl -F -E '$"="(";say"@F".")"x$#F'
Ton Hospel,

Puoi far funzionare l'altra tua idea con qualcosa del genere s/.(?=.)/s%$'%($&)%/reg, ma ovviamente non supporta stringhe contenenti metacaratteri regex
Ton Hospel

@TonHospel Grazie mille per tutto questo! (Circa il secondo, ho aggiunto \Qper supportare i metacaratteri regex) :-)
Dada,

6

Rubino, 27 byte

->s{s.chars*?(+?)*~-s.size}

Spiegazione

->s{                       # Declare anonymous lambda taking argument s
    s.chars                # Get the array of chars representing s
           *?(             # Join the elements back into a string using "("s as separators
              +?)*~-s.size # Append (s.size - 1) ")"s to the end

6

Perl, 24 23 byte

Include +1 per -p

Dare una stringa su STDIN senza newline (o aggiungere -lun'opzione al programma)

echo -n Hello | nest.pl

nest.pl:

#!/usr/bin/perl -p
$\=")"x s/.(?=.)/$&(/g

6

PHP, 63 byte

<?=str_pad(join("(",$s=str_split($argv[1])),count($s)*3-2,")‌​");

Versione precedente 64 byte

<?=join("(",$s=str_split($argv[1])).str_pad("",count($s)-1,")");

1
È possibile salvare due byte utilizzando <?=invece di echo e un altro se si imposta $ s sul risultato della str_splitchiamata anziché $argv[1], quindi si utilizza count($s)invece distrlen($s)
Alex Howansky,

2
63 byte: <?=str_pad(join("(",$s=str_split($argv[1])),count($s)*3-2,")");- wordwrapbatterebbe la combinazione split / join, ma sfortunatamente fallisce se l'input contiene spazi bianchi.
Tito

1
@Titus bella alternativa Grazie
Jörg Hülsermann,

6

GNU sed, 37 35 31 byte (30 +1 per -rargomento)

Pure sed soluzione linux

:;s/([^(])([^()].*)$/\1(\2)/;t
  1. Denominare la sovvenzione :; poi chiamandolo ricorsivamente cont
  2. Creare 2 gruppi regex:
    • Il primo gruppo è il primo carattere di due personaggi consecutivi che non lo sono tra parentesi
    • Il secondo gruppo è il secondo carattere consecutivo e il resto della stringa fino alla fine della riga
  3. Aggiungi parentesi attorno al secondo gruppo \1 ( \2 )

modificare : grazie a @manatwork per l'aiuto nella rimozione di 4 personaggi!

Tester online


2
L'uso di solo 2 gruppi sembra essere sufficiente. Cattura il 2 ° e il 3 ° insieme.
arte

Oh, e mi dispiace, ma le opzioni della riga di comando necessarie per modificare il comportamento predefinito dell'interprete affinché il codice funzioni, devono essere incluse nel conteggio delle dimensioni. È appena necessario -epassare il codice all'interprete gratuitamente. (Ok, sedè felice anche senza di essa.) Quindi per sed -re '…'te conta +1.
arte

1
Le etichette vuote sono una caratteristica / bug di GNU sed, quindi forse il titolo dovrebbe essere GNU sed.
Riley,

6

Medusa , 19 18 byte

P
,+>`
_  {I
/'␁'(

Il carattere è il carattere di controllo non stampabile con valore byte 0x1. Provalo online!

Spiegazione

Questo è un programma Jellyfish piuttosto complesso, poiché molti valori vengono utilizzati in più punti.

  • I è un input non elaborato, letto da STDIN come stringa.
  • '( è il personaggio letterale ( .
  • L' {identità (sinistra) prende '(e Icome input e ritorna'( . Il valore restituito non viene mai effettivamente utilizzato.
  • `è il thread. Modifica {per restituire il carattere (per ogni carattere di I, risultante in una stringa di (s con la stessa lunghezza diI .
  • >è coda; prende la stringa di( s come input e taglia il primo carattere.
  • +accetta come argomenti la stringa di se (il byte non stampabile e aggiunge il valore del byte (1) a ciascun carattere. Questo dà una stringa di uguale lunghezza di )s. Usando il personaggio garantisce che il valore restituito sia una stringa e non un elenco di numeri interi.
  • Nell'angolo in basso a sinistra, /accetta il byte non stampabile e restituisce una funzione che accetta due argomenti e unisce il secondo argomento al primo una volta (poiché il valore del byte è 1).
  • _prende questa funzione, afferra gli argomenti del basso {(che erano '(e I) e chiama la funtion con loro. Questo inserisce il carattere (tra ogni coppia di caratteri in I.
  • ,concatena questa stringa con la stringa di )s e Pstampa il risultato.

5

05AB1E , 22 21 19 18 byte

¤Ug<©FN¹è'(}X®')×J

Provalo online!

Spiegazione:

¤Ug<©FN¹è'(}X®')×J #implicit input, call it A                                 
¤U                 #push the last letter of A, save it to X
  g<©              #push the length of A, subtract 1, call it B and save it to register_c
     F     }       #repeat B times
      N¹è          #push the Nth char of A
         '(        #push '('
            X      #push X
             ®')×  #push ')' repeated B times
                 J #join together
                   #implicit print

5

Vim, 17 byte

$qqha(<Esc>A)<Esc>%h@qq@q

Passa dall'inizio alla fine, perché altrimenti inciampi su quelli )che hai già scritto. Usa hainvece di ifallire quando raggiunge l'inizio.

Di solito, non si farebbero due inserti separati come questo; faresti qualcosa come C()<Esc>Psalvare un colpo. Ma questa volta il posizionamento non funziona altrettanto bene.


Puoi usare la <End>chiave in modalità inserimento invece di uscire dalla modalità inserimento e fareA
BlackCap

@BlackCap Non è un byte. Avrei bisogno di contare i tratti anziché i byte. (E Vimgolf è un gioco migliore quando bandisci i tasti cursore, anche se qui la differenza è banale.)
icaica


4

> <> , 37 byte

i:0(?\'('
$,2l~/~
/?(2:<-1$')'
>~ror:

Riga per riga

  1. Spinge ogni carattere dall'input con una parentesi aperta dopo ciascuno
  2. Rimuove EOF e l'ultima parentesi aperta e spinge la lunghezza della pila
  3. Utilizza un confronto con metà della lunghezza dello stack per inserire la parentesi di chiusura
  4. Stampa il contenuto della pila

Provalo online!


4

Brain-Flak 103 97 byte

Include +3 per -c

{({}<><(((((()()){}()){}){}){})>)<>}<>({}<([][()]){({}[()()]<(({})()<>)<>>)}{}>){({}<>)<>}<>{}

Provalo online!


Spiegazione:

#reverse the stack and put a 40 between every number
{({}<><(((((()()){}()){}){}){})>)<>}<>
{                                  }   #repeat this until the stack is empty
 ({}                            )      #pop the top and push it after
    <>                                 #switching stacks and
      <(((((()()){}()){}){}){})>       #pushing a 40 (evaluated as 0) 
                                 <>    #switch back to the first stack
                                    <> #switch to the stack that everything is on now    

#put as many )s on the other stack as needed
({}                                      ) #pop the top letter and put it  back
                                           #after doing the following
                                           #This leaves ( on the top
   <                                    >  #evalute this part as 0
    ([][()])                               #push the height of the stack minus one
            {                        }    #repeat until the "height" is 0
             ({}[()()]              )     #pop the "height" and push is minus two
                      <            >      #evaluate to 0
                       (        )         #push:
                        ({})              #the top of the stack (putting it back on)
                            ()            #plus one onto
                              <>          #the other stack
                                 <>       #switch back to the other stack

                                      {}  #pop what was the height of the stack

#move the string of letters and (s back, reversing the order again
{        }     # repeat until all elements are moved
 (    )        # push:
  {}           # the top of the stack after
    <>         # switching stacks
       <>      # switch back to the other stack
          <>   # switch to the stack with the final string
            {} #pop the extra (

Battimi. +1
DJMcMayhem

Hmm. Ho pensato che il riutilizzo del 40 per evitare di spingere di nuovo un intero grande ti farebbe risparmiare un sacco di byte, ma il meglio che posso {({}<><(((((()()){}()){}){}){})>)<>}<>({}<(({})<>())><>)([]){({}[()()]<(<>({})<>)>)}{}{}{({}<>)<>}<>{}
inventare

Grazie per avermi dato l'idea di riutilizzare il 40. L'ho portato a 95 + 3. Perché comunque sono 3 byte -ain Brain-Flak?
Riley,

Oh, bel lavoro! I +3byte sono standard per speciali flag della riga di comando . Il che è sfortunato, ma qualcosa che posso sopportare. In realtà ho pensato a modi per accorciarlo, ma non sono ancora sicuro di come.
DJMcMayhem

Normalmente non sono 2 byte? uno per il -e uno per la bandiera? Potresti avere un flag per la normale esecuzione come fa Perl -e. In questo modo sarebbe solo 1 byte extra.
Riley,

4

Fattore, 81 byte

[ [ >array [ 1string ] map "("join ] [ length 1 - [ 40 ] replicate >string ] bi ]       
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.