CETAK seperti INI

17

Tulis sebuah program yang mengambil input ke STDIN dan buat semua huruf kecil (termasuk huruf beraksen) dalam 2k-1huruf besar ke - th dan semua huruf besar (juga termasuk huruf beraksen) dalam 2khuruf kecil ke - th ( kadalah bilangan bulat positif). Program seharusnya tidak mempengaruhi karakter lain dalam kata apa pun. Sebagai contoh, jika string adalah Ook! O0k!, maka outputnya seharusnya OOK! o0k!.

Kata baru terbentuk ketika ada jumlah spasi kosong setelah karakter non-spasi kosong. Spasi pada awal input harus diabaikan. Jika suatu kata tidak mengandung karakter yang diubah, program harus tetap menganggapnya sebagai kata dan melanjutkan.

Input sampel ( Input berbeda dipisahkan oleh baris baru kosong)

Nineteen Eighty-Four (1984)

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

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

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

Output sampel

NINETEEN eighty-four (1984)

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

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

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

Ini kode golf, kawan. Aturan CG standar berlaku. Program terpendek dalam byte menang.


Saya cukup yakin saya membahas semua celah mengenai spasi dan karakter non-huruf, tetapi jika saya melewatkannya, tolong beri tahu saya.


Terima kasih kepada @Optimizer untuk membuat cuplikan kode berikut. Untuk menggunakan, klik "Tampilkan snipet kode", gulir ke bawah dan klik "► Jalankan cuplikan kode".

Arcturus
sumber
5
Bagaimana dengan karakter beraksen? Apakah kita harus mengabaikannya? Apakah fungsi diizinkan?
Downgoat
Saya tidak memiliki karakter dalam pikiran ketika saya menulis pertanyaan, tapi saya kira mereka akan menghitung. Fungsi diizinkan.
Arcturus
Karakter spasi putih mana yang harus kita pertanggungjawabkan? Bisakah kita berasumsi bahwa karakter non-spasi putih akan dapat dicetak?
Dennis
Semua karakter spasi putih, dan ya.
Arcturus

Jawaban:

4

Skrip Vim, 22 21 byte

nm Q vEUWvEuWQ|norm Q

Penjelasan:

Peta perintah pertama Q ke:

vEUbuat kata besar
Wpergi ke kata berikutnya
vEubuat kata kecil
Wpergi ke kata berikutnya
Q ulangi pemetaan rekursif

dan |norm Q menjalankan pemetaan

Penggunaan program

Ini adalah bagaimana Anda membuat Vim membaca dari 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

Ini akan membuka Vim yang menampilkan ini:

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

GNU sed, 28

Skor termasuk +2 untuk -rzditeruskan ke GNU sed.

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

Uji keluaran

$ 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~~~
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
$ 
Trauma Digital
sumber
5

Perl, 26 byte

25 byte kode + 1 byte baris perintah

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

Terima kasih untuk ThisSuitIsBlackNot untuk memperbaiki beberapa bug!

Pemakaian:

perl -p entry.pl
Jarmex
sumber
3

Pyth, 23

jdmjbmrk=xZ!!kcdbcjb.zd

Cobalah online atau jalankan test suite

Bergantian antara pyth's lowerdan upperfungsi, yang r...0ataur...1 . Ini mungkin akan mempengaruhi karakter unicode, menunggu klarifikasi OP berubah.

Saya merasa sesuatu harus golf. Khususnya XOR untuk mengubah saklar yang mana dari upper/ lowerharus digunakan.

FryAmTheEggman
sumber
Jika saya menafsirkan pertanyaan dengan benar, input A\nBharus dicetak A\nb.
Dennis
Itu bukan interpretasi yang benar dari pertanyaan itu. A new word is formed when there is a nonzero amount of whitespace after a non-whitespace character.Output untuk A\nBis A\NB. Tapi sepertinya jawaban CJAM Anda sudah benar.
Arcturus
@Dennis terima kasih, harus diperbaiki sekarang.
FryAmTheEggman
2

Perl, 87 byte

Setelah bermain-main dengan ekspresi reguler dan mapuntuk sementara waktu, saya tidak dapat menemukan solusi yang elegan, jadi inilah hasilnya:

@a=split(" ",lc(<>));while($i<=$#a/2){@a[$i*2]=uc(@a[$i*2]);$i++;}print(join(" ", @a));
Codefun64
sumber
1
Solusi yang bagus. Bisakah <STDIN> diganti dengan <> untuk menghemat beberapa byte? Juga, bisakah $ i = 0 dilewati?
steve
@steve Terima kasih; dan ya, itu bersama dengan perbaikan kecil (mengujinya dengan input yang berbeda, dan itu memiliki kesalahan kecil,) sekarang disertakan. Terima kasih atas ide-idenya! Saya sangat terbiasa dengan verbose, pengkodean eksplisit: P
Codefun64
1
@ Codefun64 Selamat datang di PPCG! Anda dapat melewati sebagian besar tanda kurung Anda untuk menyimpan lebih banyak byte karena mereka opsional di Perl, misalnya. lc(<>), bisa lc<>dan menggunakan pengubah pernyataan untuk Andawhile memungkinkan Anda untuk melewati tanda kurung juga misalnya. print$i++while$i<10vs. while($i<10){print$i++}. Ada halaman yang berguna yang banyak membantu saya Tip untuk Golf di Perl
Dom Hastings
2

Ruby, 56 byte

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

JavaScript ES6, 74 71 byte

.toUpperCase()dan .toLowerCase()benar - benar memotong jumlah byte (menambahkan 32 byte 0.o). Sebagian besar work-around berakhir dengan lebih banyak byte

s=>s.replace(/(\S+\s*)(\S*)/g,(_,a,b)=>a.toUpperCase()+b.toLowerCase())
Downgoat
sumber
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()}

Tidak sebersih yang kuharapkan, yang tampaknya menjadi tema dengan jawaban Groovy-ku.

  • +17 untuk memperbaiki perilaku dengan spasi kosong terkemuka
  • -5 untuk menghapus trailing newline dan beralih dari .isEmpty () ke .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~~~ 

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++. 
Una
sumber
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))
Segera
sumber
Ini mencetak angka setelah 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(' '))))
Zach Gates
sumber
Anda dapat mengganti persyaratan dengan [b.upper(),b.lower()][a%2]untuk menyimpan 4 byte (dengan anggapan saya menghitung dengan benar di ponsel).
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']
}

Mengharapkan input sebagai file csv (satu kolom) yang disebut ab

Penjelasan:

Baca data dalam (nama variabel default adalah v1, dapat disingkat menjadi v). Buat variabel baru b sama dengan kata pertama (token dipisahkan spasi) dari v untuk setiap baris. Untuk setiap baris, sementara kata berikutnya tidak kosong (hanya terjadi jika tidak ada karakter pada baris itu), ganti kata dalam v dengan versi huruf besar atau kecil dari kata itu di baris saat ini, tergantung pada berapa banyak (mod 2 ) kata-kata telah ditemukan. Kemudian dapatkan kata berikutnya dan ulangi. Cetak seluruh baris setelah selesai.

tanda
sumber
1

Delphi, 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.

Bukan bahasa yang baik untuk bermain golf dengan ...

James
sumber
Selamat Datang di Programming Puzzles & Code 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)
Trebuchette
sumber
1

CJam, 28 byte

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

Saat ini saya sedang mempertimbangkan 33 karakter ASCII / Unicode pertama (dan hanya itu) spasi putih. Saya sedang menunggu klarifikasi untuk mengetahui apakah ini valid atau tidak.

Cobalah online di juru bahasa CJam .

Dennis
sumber
1

Pyth, 17 22 byte

FGcwd=+YrG=Z%+1Z2;jdY

Coba di sini

tepuk
sumber
Kasing ruang angkasa gagal tapi masih bagus.
tjbtech
Ini juga tidak menangani input pada lebih dari satu baris, dan mencetak spasi tambahan.
FryAmTheEggman
Saya akan refactor ketika saya bisa, terima kasih: D
clap
0

C #, 104 100 99 byte

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

Ini 79 byte dengan

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

sumber