Dividilo. Ma non tutto!


11

Ispirato da questa domanda StackOverflow .

Ingresso:

Prenderemo tre input:

  • Un carattere delimitatore su cui Ddividere
  • Un personaggio Itra due dei quali ignoriamo il carattere delimitatore (lo so, sembra vago, ma lo spiegherò di seguito)
  • Una stringa S

Produzione:

Un elenco / array contenente le sottostringhe dopo la divisione.

Esempio:

Input:
D = ','
I = '"'
S = '11020199,"Abc ",aduz,,444,bieb,dc,2 ,2222.00,whatever 5dc,222.22,22.00,"98,00","12,000,000",21-09-2018, 06:00,",-,"'

Output:
['11020199', 'Abc ', 'aduz', '', '444', 'bieb', 'dc', '2 ', '2222.00', 'whatever 5dc', '222.22', '22.00', '98,00', '12,000,000', '21-09-2018', ' 06:00', ',-,']

Perché? Splitting sulla virgola normalmente anche dividere 98,00, 12,000,000e ,-,in due / tre pezzi. Ma poiché sono all'interno del Icarattere di input, ignoriamo ignorare la divisione qui.

Regole della sfida:

  • Puoi presumere che ci sarà sempre una quantità pari di Icaratteri nella stringa di input.
  • Puoi presumere che il personaggio Iavrà sempre un Daccanto (tranne quando è il primo o l'ultimo carattere dell'input) che può ancora essere diviso correttamente. Quindi non avrai qualcosa del genere D = ','; I = '"'; S = 'a,b"c,d"e,f', né niente del genere D=','; I='"'; S='a",b,"c'.
  • La stringa di input non Spuò contenere nessuno dei due Do I. Se contiene no D, viene visualizzato un elenco con l'intera stringa di input come unico elemento.
  • L'elenco di output non conterrà più il carattere I, anche quando non conteneva no D(come puoi vedere al "Abc "divenire 'Abc 'nell'esempio sopra).
  • È possibile che la sottostringa all'interno Icontenga solo D. Ad esempio: D = ','; I = '"'; S = 'a,",",b,"c","d,e,,",f'si tradurrebbe in ['a', ',', 'b', 'c', 'd,e,,', 'f'].
  • Puoi presumere che Dnon sarà mai all'inizio o alla fine di S, quindi non dovrai occuparti di trascinare / portare oggetti vuoti.
  • Quando un input ha due adiacenti D, avremo un oggetto vuoto. Ie D = ','; I = '"'; S = 'a,"b,c",d,,e,"",f'comporterebbe ['a', 'b,c', 'd', '', 'e', '', 'f'].
  • Puoi presumere che gli ingressi e le uscite conterranno solo ASCII stampabili nell'intervallo [32, 126](quindi escludendo le schede e le nuove righe).
  • È anche consentito produrre tutti gli elementi delimitati da nuova riga anziché restituire / generare un elenco / matrice (specialmente per quelle lingue che non hanno liste / matrici; ad esempio Retina).
  • Puoi salvare l'elenco in ordine inverso se salva byte. Tuttavia, non è consentito emetterlo in ordine ordinato o 'mischiato'. Quindi D = ','; I = 'n'; S = 'a,2,b,3,c'può essere emesso come [a,2,b,3,c]o [c,3,b,2,a], ma non come [2,3,a,b,c,]o [a,3,b,c,2]per esempio.

Regole generali:

  • Questo è , quindi vince la risposta più breve in byte.
    Non lasciare che le lingue di code-golf ti scoraggino dal pubblicare risposte con lingue non codegolfing. Prova a trovare una risposta il più breve possibile per "qualsiasi" linguaggio di programmazione.
  • Per la tua risposta valgono regole standard , quindi puoi usare STDIN / STDOUT, funzioni / metodo con i parametri corretti e tipo di ritorno, programmi completi. La tua chiamata.
  • Le scappatoie predefinite sono vietate.
  • Se possibile, aggiungi un link con un test per il tuo codice (ad es. TIO ).
  • Inoltre, si consiglia vivamente di aggiungere una spiegazione per la risposta.

Casi test:

Input:
D = ','; I = '"'; S = 'a,"b,c",d,,e,"",f'
Output:
['a', 'b,c', 'd', '', 'e', '', 'f']

Input:
D = ','; I = '"'; S = '11020199,"Abc ",aduz,,444,bieb,dc,2 ,2222.00,whatever 5dc,222.22,22.00,"98,00","12,000,000",21-09-2018, 06:00,",-,"'
Output:
['11020199', 'Abc ', 'aduz', '', '444', 'bieb', 'dc', '2 ', '2222.00', 'whatever 5dc', '222.22', '22.00', '98,00', '12,000,000', '21-09-2018', ' 06:00', ',-,']

Input:
D = ' '; I = ','; S = 'this is a test , to see if you understand it, or not , hmmm, I think I have too many commas , or not , perhaps..'
Output:
['this', 'is', 'a', 'test', ' to see if you understand it', 'or', 'not', ' hmmm', 'I', 'think', 'I', 'have', 'too', 'many', 'commas', ' or not ', 'perhaps..']

Input:
D = 'x'; I = 'y'; S = 'contains no lowercase X nor Y'
Output:
['contains no lowercase X nor Y']

Input:
D = '1'; I = '3'; S = '3589841973169139975105820974944592078316406286208948254211370679314'
Output: ['58984197', '69', '9975105820974944592078', '64062862089482542', '', '70679', '4']

Input:
D = ' '; I = 'S'; S = 'regular split on spaces'
Output:
['regular', 'split', 'on', 'spaces']

La maggior parte (o tutte?) Delle risposte attuali non hanno elementi vuoti all'inizio e alla fine del caso di test 6. È un caso speciale o un errore nei casi di test? ( "", "'ll remove all ", "")
TFeld,

@TFeld È un caso speciale. Quasi tutte le risposte falliscono anche perché l' D = ','; I = '"'; S = ',"a,b",c,,d,""'ho appena notato. Modificherò un po 'la sfida in modo che gli oggetti vuoti non siano possibili all'inizio o alla fine. In base all'esperienza maturata sia in Java che in 05AB1E in passato, so quanto possano essere frustranti gli oggetti vuoti dopo la divisione da correggere manualmente quando la lingua non lo fa correttamente per impostazione predefinita. Un caso di test come questo dovrebbe essere comunque supportato: D = ','; I = '"'; S = 'a,"b,c",d,,e['a', 'b,c', 'd', '', 'e']con un oggetto vuoto in mezzo.
Kevin Cruijssen,

È necessario che l'output finale mantenga l'ordine dell'input? ad es.'1,"2,3"' -> ['2,3','1']
Kamil Drakari,

1
@KamilDrakari Hmm, aggiungerò una regola per permetterla sia in avanti che all'indietro, ma non mescolata. Quindi [a,b,c]e [c,b,a]sono consentiti output, ma ad esempio [a,c,b]o [b,a,c]no.
Kevin Cruijssen,

Quale dovrebbe essere il risultato D=','; I='"'; S='a",b,"c'o è anche un input valido?
Zgarb,

Risposte:


3

Japt , 16 byte

qV mÏu ?X:XrWRÃq

Provalo!

Fondamentalmente la stessa strategia della nuova risposta Pip di DLosc, mette da parte le sezioni "quotate", quindi sostituisce il delimitatore con una nuova riga nel resto della stringa, risultante in un output delimitato da nuova riga

Spiegazione completa:

qV                  Split on I
   m          Ã     For each segment:
    Ïu ?              If the segment has an odd index (quoted)...
        X             Keep it as-is
         :          Otherwise:
          XrWR        Replace each D in the segment with a newline
               q    Join it all to a single string

Si noti che anche se il primo elemento viene citato, andrà comunque all'indice 1 non all'indice 0. Se qtrova un delimitatore come primo carattere, il primo elemento nella divisione (indice 0) diventa una stringa vuota, quindi il contenuto del preventivo diventa correttamente il secondo elemento (indice 1). Ecco una demo di come gestire correttamente una citazione principale.


Ho appena salvato alcuni byte sostituendo D con newline al di fuori delle virgolette e suddividendolo su newline, eliminando così la necessità di sostituire newline con D alla fine. Potrebbe abbreviare anche il tuo codice?
DLosc

@DLosc In effetti, grazie per il suggerimento!
Inserendo

8

R , 34 byte

Regolare non modificato scancon gli argomenti appropriati per text, sepe quotedovrebbe farlo.

function(D,I,S)scan(,t=S,"",,,D,I)

Provalo online!


2
Come al solito, R apre la strada alle sfide di divisione delle corde.
ngm

2
Parla della lingua giusta per il lavoro. :) Ho verificato alcuni casi di test e sembrano tutti funzionare bene, quindi +1 da parte mia. PS: prendere input memorizzandolo in una variabile non è consentito secondo il meta.
Kevin Cruijssen,

1
@KevinCruijssen Posso inviare scanper 4 byte e quindi chiamarlo con gli argomenti nei punti appropriati?
J.Doe,

1
@ J.Doe Umm .. non lo so. Non troppo familiare con i possibili formati di input accettabili per R tbh. Per quanto ne so, utilizzare un programma completo con argomenti di programma o STDIN, nonché una funzione (lambda) con i parametri appropriati o anche l'uso di STDIN sono accettabili per impostazione predefinita. Nel meta post ho collegato in precedenza tutti i formati di input validi (con un punteggio positivo) sono menzionati. Come funziona per R non lo so.
Kevin Cruijssen,

@ J.Doe la tua presentazione in questo momento è un programma completo e attualmente non accetta input da stdin. La soluzione più breve sarebbe avvolgerla in una funzione.
Giuseppe,

7

C (gcc) , 64 byte

c;f(d,i,s)char*s;{for(;*s;s++)*s==i?c=!c:putchar(d-*s|c?*s:10);}

Provalo online!

JavaScript (Node.js) , 57 byte

(d,i,s)=>s.replace(c=/./g,e=>i==e?(c^=1,''):d!=e|c?e:`
`)

Provalo online!


1
La tua risposta C funziona alla grande, ma la tua risposta JS sembra ancora divisa Dall'interno Ie contiene anche Inell'output, che può essere visto anche nei primi casi di test nel tuo link TIO. (PS: potrebbe anche essere meglio pubblicarli come risposte separate, con un link che indica che è una porta della tua risposta C.)
Kevin Cruijssen,

1
@KevinCruijssen Risolto. Di solito invio insieme risposte simili e dico che è un porto solo se proviene dal lavoro di altri
l4m2

4

Python 2, 67 byte

import csv
lambda D,I,S:next(csv.reader(S,delimiter=D,quotechar=I))

Provalo online!

Python 2, 71 byte

D,I,S=input()
k=1
for p in S.split(I):print p.replace(D*k,'\n'*k),;k^=1

Provalo online!


4

Pip , 18 byte

FxcxQb?!:oOo?xRanx

Accetta input come argomenti della riga di comando. Provalo online!

Approccio completamente diverso: elaborare la stringa di un carattere alla volta e generare i risultati desiderati delimitati da nuova riga.

Come?

                    a,b,c are cmdline args (respectively representing D,I,S); o is 1;
                    n is newline (implicit)
                    We use o for a flag indicating whether or not to change D into newline
Fxc                 For each character x in c:
   xQb?              If x equals b (the ignore character),
       !:o            Logically negate o in-place
          O          Else, output the following (with no trailing newline):
           o?         If o is truthy,
             xRan      x, with a (the delimiter) replaced with newline
                 x    Else, x unchanged

4

MATL , 24 byte

y=Yso~yi=*~*cO10Zt2G[]Zt

Gli ingressi sono S, I, D.

Provalo online! Oppure verifica tutti i casi di test .

Come funziona

Considerare gli input D = ','; I = '"'; S = 'a,"b,c",d,,e,"",f'.

y     % Implicit inputs: S, I. Duplicate from below
      % STACK: 'a,"b,c",d,,e,"",f', '"', 'a,"b,c",d,,e,"",f'
=     % Is equal? Element-wise
      % STACK: 'a,"b,c",d,,e,"",f', [0 0 1 0 0 0 1 0 0 0 0 0 0 1 1 0 0]
Ys    % Cumulative sum
      % STACK: 'a,"b,c",d,,e,"",f', [0 0 1 1 1 1 2 2 2 2 2 2 2 3 4 4 4]
o~    % Parity, negate
      % STACK: 'a,"b,c",d,,e,"",f', [1 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1]
y     % Duplicate from below
      % STACK: 'a,"b,c",d,,e,"",f', [1 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1], 'a,"b,c",d,,e,"",f'
i=    % Input: D. Is equal? Element-wise
      % STACK: 'a,"b,c",d,,e,"",f', [1 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1], [0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0]
*~    % Multiply, negate (equivalent to NAND). Element-wise
      % STACK: 'a,"b,c",d,,e,"",f', [1 0 1 1 1 1 1 0 1 0 0 1 0 1 1 0 1]
*     % Multiply, element-wise. Characters are converted to ASCII code
      % STACK: [97 0 34 98 44 99 34 0 100 0 0 101 0 34 34 0 102]
c     % Convert to char (character 0 is shown here as '·')
      % STACK: 'a·"b,c"·d··e·""·f'
O10   % Push 0 and then 10
      % STACK: 'a·"b,c"·d··e·""·f', 0, 10
Zt    % Replace character 0 by character 10 (newline; shown here as '¶')
      % STACK: 'a¶"b,c"¶d¶¶e¶""¶f'
2G[]  % Push second input (I) and then [] (empty array)
      % STACK: 'a¶"b,c"¶d¶¶e¶""¶f', '"', []
Zt    % Replace character given by input I by empty; that is, remove it. Implicit display
      % STACK: 'a¶b,c¶d¶¶e¶¶f'

3

Retina , 45 byte

L$`(?=.*¶(.)¶(.))(\2(.*?)\2|(.*?))(\1|¶)
$4$5

Provalo online! Spiegazione:

(?=.*¶(.)¶(.))(\2(.*?)\2|(.*?))(\1|¶)

Guarda avanti per trovare i valori di De Isulle seguenti due righe. Quindi, se lo troviamo, Ilo mangiamo e abbiniamo i personaggi al successivo Ie D, in caso contrario, abbina i caratteri al successivo Do alla fine della linea.

L$`
$4$5

Elenco cattura 4 e 5 da ogni partita; 4 è la cattura tra due Isecondi mentre 5 è la cattura tra due Dsecondi.


3

Powershell, 71 byte

param($d,$i,$s)$s-split{(1-($script:a+=$i-ceq$_)%2)*($d-ceq$_)}|% *m $i

Script di test meno golfato:

$f = {

param($d,$i,$s)
$s-split{
    $script:a+=$i-ceq$_
    (1-$a%2)-and($d-ceq$_)
}|% Trim $i

}

@(
    ,(',','"',
    '',
    '')

    ,(',','"',
    'a,"b,c",d,,e,"",f',
    'a', 'b,c', 'd', '', 'e', '', 'f')

    ,(',','"',
    '11020199,"Abc ",aduz,,444,bieb,dc,2 ,2222.00,whatever 5dc,222.22,22.00,"98,00","12,000,000",21-09-2018, 06:00,",-,"',
    '11020199', 'Abc ', 'aduz', '', '444', 'bieb', 'dc', '2 ', '2222.00', 'whatever 5dc', '222.22', '22.00', '98,00', '12,000,000', '21-09-2018', ' 06:00', ',-,')

    ,(' ',',',
    'this is a test , to see if you understand it, or not , hmmm, I think I have too many commas , or not , perhaps..',
    'this', 'is', 'a', 'test', ' to see if you understand it', 'or', 'not', ' hmmm', 'I', 'think', 'I', 'have', 'too', 'many', 'commas', ' or not ', 'perhaps..')

    ,('x','y',
    'contains no lowercase X nor Y',
    'contains no lowercase X nor Y')

    ,('1','3',
    '3589841973169139975105820974944592078316406286208948254211370679314',
    '58984197', '69', '9975105820974944592078', '64062862089482542', '', '70679', '4')

    ,(' ','S',
    'regular split on spaces',
    'regular', 'split', 'on', 'spaces')

) | % {
    $d,$i,$s,$expected = $_
    $result = &$f $d $i $s
    "$("$result"-eq"$expected"): $result"
}

Produzione:

True:
True: a b,c d  e  f
True: 11020199 Abc  aduz  444 bieb dc 2  2222.00 whatever 5dc 222.22 22.00 98,00 12,000,000 21-09-2018  06:00 ,-,
True: this is a test  to see if you understand it or not  hmmm I think I have too many commas  or not  perhaps..
True: contains no lowercase X nor Y
True: 58984197 69 9975105820974944592078 64062862089482542  70679 4
True: regular split on spaces

Spiegazione:


2

SNOBOL4 (CSNOBOL4) , 109 byte

	D =INPUT
	I =INPUT
	S =INPUT
S	S (I ARB . OUTPUT I | ARB . OUTPUT) (D | RPOS(0)) REM . S	DIFFER(S)	:S(S)
END

Provalo online!

Supponiamo che D =','e I ='"'. Quindi il pattern (I ARB . OUTPUT I | ARB . OUTPUT) (D | RPOS(0))abbina stringhe che sembrano ".*"o .*seguite da ,o alla fine della stringa e OUTPUTs i caratteri arbitrari ( .*), impostando il REMainder senza eguali su Se iterando finché Snon è vuoto.


2

Pip -n , 29 24 byte

cR Xa[na]@(bN{$`})^n||:b

Accetta input come argomenti della riga di comando. Provalo online!

Strategia: Icoppie esterne , sostituisci Dcon newline (poiché siamo sicuri che le newline non appariranno nella stringa). Quindi dividere su newline e strip I.


2

Gelatina ,  20  18 byte

;`j⁵œṣ⁴œṣḊṖYʋ€Ðo³Y

Un programma completo di prendere i tre argomenti D, I, Sche stampa ogni voce su una linea.

Provalo online! (Il piè di pagina si unisce alle nuove righe)

Come?

Circondati di un extra Dsu ciascun lato, dividi a Is, dividi gli elementi a indice dispari a Ds, quindi rimuovi le loro teste e code e uniscili con le nuove linee, infine unisci il risultato con le nuove linee.


1
Penso che l' output dell'elenco (anziché restituire un elenco) debba essere delimitato in qualche modo, quindi puoi dire 1) che è un elenco e 2) dove finisce un elemento e ne inizia un altro. (Non ho un meta post specifico per sostenerlo, ma c'è una certa correlazione con la discussione sul comportamento non osservabile . Al momento, non è osservabile che il tuo programma produca un elenco piuttosto che, diciamo, una stringa. )
DLosc,

Quindi immagino di poter sostituire il serraggio con un join con newline (che restituirà un elenco di elenchi di caratteri mescolati con caratteri, ma un programma completo stamperà gli elementi su nuove righe).
Jonathan Allan,


@JonathanAllan La tua soluzione a 20 byte funziona come previsto, ma il tuo 17-byte nel commento sembra dare alcuni risultati errati .
Kevin Cruijssen,

1
@KevinCruijssen - sì, golf mobile non va bene, mi sono perso il join di newline per gli articoli con indicizzazione dispari, 18 pubblicati.
Jonathan Allan,

2

PHP , 50 byte

function q($D,$I,$S){return str_getcsv($S,$D,$I);}

Provalo online! Utilizza una funzione integrata .

Se la riorganizzazione degli ingressi è consentita ( (S,D,I)quindi corrisponde alla str_getcsvfirma), ho una versione da 44 byte .


1
Credo che sia consentito riorganizzare l'input, purché si specifichi l'ordine. Per rendere più chiaro, è possibile utilizzare le variabili $S, $De $Icon un costo di 0 byte, per questa versione lunga 50 byte.
Ismael Miguel,

Inoltre, la versione 50 byte, con il $S, $D, $Ivariabili potrebbero servire come guida per l'ordine degli argomenti.
Ismael Miguel,
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.