STAMPA come QUESTA


17

Scrivere un programma che dia un input a STDIN e renda maiuscole tutte le lettere minuscole (comprese le lettere accentate) nella 2k-1parola maiuscola e tutte le lettere maiuscole (comprese anche le lettere accentate) nella 2kparola minuscola ( kè un numero intero positivo). Il programma non dovrebbe influenzare nessun altro carattere in nessuna parola. Ad esempio, se la stringa è Ook! O0k!, l'output dovrebbe essere OOK! o0k!.

Una nuova parola si forma quando vi è una quantità diversa da zero dopo un carattere non bianco. Gli spazi bianchi all'inizio di un input devono essere ignorati. Se una parola non contiene caratteri modificati, il programma dovrebbe comunque considerarla come una parola e continuare.

Input di esempio ( input diversi sono separati da una riga vuota)

Nineteen Eighty-Four (1984)

Programming Puzzles & Code Golf   - 
Hooray for Code Golf Stack Exchange!

     2be or not 2be, that is the ~~~QuEsTiOn~~~

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

Output di esempio

NINETEEN eighty-four (1984)

PROGRAMMING puzzles & code GOLF   - 
HOORAY for CODE golf STACK exchange!

     2BE or NOT 2be, THAT is THE ~~~question~~~

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

Questo è il codice golf, ragazzi. Si applicano le regole CG standard. Vince il programma più breve in byte.


Sono abbastanza sicuro di aver coperto tutte le lacune riguardanti gli spazi bianchi e i caratteri non di lettere, ma se ne ho perso uno, per favore, dimmelo.


Grazie a @Optimizer per aver creato il seguente frammento di codice. Per utilizzare, fai clic su "Mostra frammento di codice", scorri verso il basso e fai clic su "► Esegui frammento di codice".


5
Che dire dei personaggi accentati? Dobbiamo ignorare quelli? Sono ammesse funzioni?
Downgoat,

Non avevo in mente personaggi accenti quando ho scritto la domanda, ma suppongo che contano. Sono ammesse funzioni.
Arcturus,

Di quali personaggi degli spazi bianchi dobbiamo tenere conto? Possiamo presumere che i caratteri non bianchi saranno stampabili?
Dennis,

Tutti i caratteri degli spazi bianchi e sì.
Arcturus,

Risposte:


4

Script Vim, 22 21 byte

nm Q vEUWvEuWQ|norm Q

Spiegazione:

Il primo comando è associato Qa:

vEUrendere la parola maiuscola
Wandare alla parola successiva
vEurendere la parola minuscola
Wandare alla parola successiva
Qripetere la mappatura ricorsiva

ed |norm Qesegue la mappatura

Utilizzo del programma

Ecco come fai in modo che Vim legga da stdin:

$ vim - -c 'nm Q vEUWvEuWQ|norm Q'
Vim: Reading from stdin
This is the first line!
This is the second line!
This is the third and last line I type to check if this works!
^D

Questo aprirà Vim mostrando questo:

THIS is THE first LINE.
this IS the SECOND line.
THIS is THE third AND last LINE i TYPE to CHECK if THIS works!
~
~
~

6

GNU sed, 28

Il punteggio include +2 per il -rzpassaggio a GNU sed.

s/(\S+\s*)(\S*)/\U\1\L\2/g

Uscita di prova

$ for t in 'Nineteen Eighty-Four (1984)' \
> 'Programming Puzzles & Code Golf   - 
> Hooray for Code Golf Stack Exchange!' \
> '     2be or not 2be, that is the ~~~QuEsTiOn~~~' \
> '++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.'; do
> echo "$t" | sed -zrf PRINTlikeTHIS.sed
> done
NINETEEN eighty-four (1984)
PROGRAMMING puzzles & code GOLF   - 
HOORAY for CODE golf STACK exchange!
     2BE or NOT 2be, THAT is THE ~~~question~~~
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
$ 

5

Perl, 26 byte

Codice 25 byte + riga comandi 1 byte

s/\S+/++$i%2?uc$&:lc$&/eg

Grazie a ThisSuitIsBlackNot per aver risolto un paio di bug!

Uso:

perl -p entry.pl

3

Pyth, 23

jdmjbmrk=xZ!!kcdbcjb.zd

Provalo online o esegui la suite di test

Si alterna tra pyth lowere upperfunzioni, che sono r...0or...1 . Ciò probabilmente influenzerà i caratteri unicode, in attesa di modifiche al chiarimento OP.

Sento che qualcosa deve essere golfabile. In particolare l'XOR per cambiare l'interruttore su quale upper/ lowerdovrebbe essere usato.


Se ho interpretato correttamente la domanda, l'input A\nBdovrebbe essere stampato A\nb.
Dennis,

Questa non è una corretta interpretazione della domanda. A new word is formed when there is a nonzero amount of whitespace after a non-whitespace character.L'output per A\nBè A\NB. Ma sembra che la tua risposta di CJAM abbia capito bene.
Arcturus,

@Dennis grazie, ora dovrebbe essere risolto.
FryAmTheEggman,

2

Perl, 87 byte

Dopo aver rovinato entrambe le espressioni regolari e mapper un po ', non sono riuscito a trovare una soluzione elegante, quindi questo è il risultato:

@a=split(" ",lc(<>));while($i<=$#a/2){@a[$i*2]=uc(@a[$i*2]);$i++;}print(join(" ", @a));

1
Bella soluzione. <STDIN> potrebbe essere sostituito con <> per salvare qualche byte? Inoltre, $ i = 0 potrebbe essere ignorato?
steve

@steve Grazie; e sì, che insieme a una correzione minore (testata con un input diverso e con un piccolo errore) sono ora inclusi. Grazie per le idee! Sono molto abituato alla codifica dettagliata ed esplicita: P
Codefun64

1
@ Codefun64 Benvenuti in PPCG! Puoi saltare la maggior parte delle parentesi per salvare più byte poiché sono opzionali in Perl, ad es. lc(<>), potrebbe essere lc<>e l'utilizzo di un modificatore di istruzione per whileconsentire di saltare anche la parentesi, ad es. print$i++while$i<10vs while($i<10){print$i++}. C'è una pagina utile che mi ha aiutato molto a giocare a golf in Perl
Dom Hastings,

2

Rubino, 56 byte

$><<gets.gsub(/\S+/){($.+=1)%2>0?$&.downcase: $&.upcase}

2

JavaScript ES6, 74 71 byte

.toUpperCase()e .toLowerCase()massacrare assolutamente il conteggio dei byte (aggiunge 32 byte 0.o). Tuttavia, la maggior parte delle soluzioni termina con più byte

s=>s.replace(/(\S+\s*)(\S*)/g,(_,a,b)=>a.toUpperCase()+b.toLowerCase())

1

Groovy, 108 125 120

System.in.eachLine{def b;it.split(" ").any{if(!it.empty)b=!b;print "${b?it.toUpperCase():it.toLowerCase()} "};println()}

Non pulito come speravo, che sembra essere un tema con le mie risposte di Groovy.

  • +17 per correggere il comportamento con i principali spazi bianchi
  • -5 per rimuovere la nuova riga finale e passare da .isEmpty () a .empty

 

$ cat tests.txt 
Nineteen Eighty-Four (1984)

Programming Puzzles & Code Golf   - 
Hooray for Code Golf Stack Exchange!

     2be or not 2be, that is the ~~~QuEsTiOn~~~

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
$ groovy PRINTlikeTHIS.groovy < tests.txt 
NINETEEN eighty-four (1984) 

PROGRAMMING puzzles & code GOLF   - 
HOORAY for CODE golf STACK exchange! 

     2BE or NOT 2be, THAT is THE ~~~question~~~ 

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

1

Lua, 96 byte

i=0 print(io.read'*l':gsub('%S+',function(x)i=i+1 return i%2==1 and x:upper() or x:lower()end))

Questo stampa un numero dopo l'output.
Trebuchette,

1

Python 3, 103 95 byte

print(' '.join(b.lower()if a%2 else b.upper()for a,b in enumerate(input().strip().split(' '))))

È possibile sostituire il condizionale con [b.upper(),b.lower()][a%2]per salvare 4 byte (supponendo che abbia contato correttamente sul cellulare).
PurkkaKoodari,

1

STATA, 252 byte

insheet using a.b
g b=word(v,1)
gl c=0
forv x=1/`=_N'{
loc d=1
while b[`x']!=""{
if !$c replace v=subinword(v,b,upper(b),1) if `x'==_n
if $c replace v=subinword(v,b,lower(b),1) if `x'==_n
loc ++d
replace b=word(v,`d') if `x'==_n
gl c=1-$c
}
di v[`x']
}

Prevede l'input come file CSV (una colonna) chiamato ab

Spiegazione:

Leggi i dati in (nome variabile predefinito è v1, abbreviabile in v). Rendi una nuova variabile b uguale alla prima parola (token separato da spazio) di v per ogni riga. Per ogni riga, mentre la parola successiva non è vuota (compare solo se non ci sono più caratteri su quella riga), sostituisci la parola in v con la versione maiuscola o minuscola di quella parola nella riga corrente, a seconda di quante (mod 2 ) sono già state trovate parole. Quindi ottenere la parola successiva e ripetere. Stampa l'intera riga al termine.


1

Delfi, 290 byte

program P;uses SysUtils;var s:string;i:word;w:byte;f:boolean;begin repeat readln(s);w:=0;f:=false; for I:=1 to length(s) do begin if s[i]>' ' then begin if w=0 then f:=not f;w:=1;if f then s[i]:=uppercase(s[i])[1] else s[i]:=lowercase(s[i])[1] end else w:=0 end;writeln(s)until false;end.

Non è davvero una buona lingua per giocare a golf con ...


Benvenuto in Programmazione di puzzle e codice golf!
Dennis,

1

Lua, 88 byte

a=io.read():gsub("%g+",function(s)m=not m return m and s:upper()or s:lower()end)print(a)

1

CJam, 28 byte

q{C' >Sc'!<*X^:XCelCeu?:S}fC

Attualmente sto prendendo in considerazione i primi 33 caratteri ASCII / Unicode (e solo quelli) spazi bianchi. Attendo chiarimenti per sapere se questo è valido o meno.

Provalo online nell'interprete CJam .



0

C #, 104 100 99 byte

static void Main(){string.Join(" ","".Split(' ').Select((o,i)=>i++%2==0?o.ToUpper():o.ToLower()));}

Sono 79 byte con

string.Join(" ","".Split(' ').Select((o,i)=>i++%2==0?o.ToUpper():o.ToLower()));
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.