Hapus semua kemunculan huruf pertama dari string dari seluruh string


24

Diberikan string input yang hanya berisi karakter A-Z,, a-zdan spasi, hapus semua kemunculan versi huruf besar dan kecil dari karakter pertama string (jika karakter pertama Ahapus semua As dan as, jika karakter pertama adalah (spasi) hapus semua spasi), dan cetak hasilnya.

Contoh kasus:

  • Testing Testing One Two Three -> esing esing One wo hree
  • Programming Puzzles and Code Golf -> rogramming uzzles and Code Golf
  • How much wood would a woodchuck chuck if a woodchuck could chuck wood -> ow muc wood would a woodcuck cuck if a woodcuck could cuck wood
  • {space}hello world -> helloworld
  • welcome to WATER WORLD -> elcome to ATER ORLD

Ini adalah , kode terpendek dalam byte yang menang!

Catatan:

  • Input akan selalu berupa 2 atau lebih karakter yang valid.
  • Output tidak akan pernah menjadi string kosong.

Apakah kita perlu menangani case di mana output adalah string kosong? Bagaimana jika input adalah string kosong?
lirtosiast

@ThomasKwa Anda mungkin menganggap output akan selalu menjadi 2 atau lebih karakter
GamrCorps

@ThomasKwa dan output tidak akan pernah kosong
GamrCorps

Jawaban:


9

Pyth, 7 byte

-zrBhz2

Cobalah online: Demonstrasi atau Test Suite

Bagus. Operator bifurkasi baru (baru berusia 8 hari) membantu di sini untuk menyelamatkan satu char Saya pikir ini adalah kode pertama, yang menggunakan fitur ini.

Penjelasan

-zrBhz2   implicit: z = input string
    hz    take the first character of z
  rB  2   B generates a list, containing the original char and the  
          result of r.2 applied to the char, which swaps the case
-z        remove these two chars from z and print the result 

2
Rapi, tidak tahu tentang itu. +1
FryAmTheEggman

14

brainfuck, 219 byte

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

(Membutuhkan kaset yang memungkinkan pointer untuk pergi ke negatif atau loop ke ujung jika mencoba. Juga mengharuskan ,untuk mengembalikan 0 pada EOF. Dalam pengalaman saya, sebagian besar penerjemah memenuhi persyaratan ini secara default.)

Ini sebenarnya ternyata sangat mudah! Saya tidak akan terkejut jika golf (saya punya ide di mana mungkin ada byte yang terbuang, tetapi saya tidak yakin apakah itu akan berjalan dengan baik). Tetap saja, membuatnya bekerja sama sekali bukan tantangan sama sekali.

Kode ini memperlakukan semuanya dengan nilai ASCII di bawah 97 sebagai karakter huruf besar. Jika karakter pertama adalah spasi, ia akan mencoba untuk menghilangkan kemunculan "ruang huruf kecil" (yaitu chr(32+32), yaitu @) dari string. Ini tidak apa-apa, karena hanya huruf dan spasi yang akan ada.

Dengan komentar:

to make comments shorter: everywhere it says "fc" means "first character"

#################################### GET FC ####################################

+[+[>+<+<]>]        shortest way to get 96
                    any number above 89 and less than 97 would work because this
                    is only for figuring out if the first character is capital

,[<+<+>>-]          create two copies of the first character


### current tape: | fc | fc | 000 | 096 | ###
###      pointer:              ^          ###

########################### FIND MAX(FC MINUS 96; 0) ###########################


>[                  96 times:

  <<                  go to the cell with the first char

  [->]                if not 0: sub one and move right


  ### current tape: | fc | char being worked on | 000 | 096 | ###
  ###      pointer:                           ^ OR ^          ###      


  >[<]>               collapse the wavefunction; sync the branches

-]


### current tape: | fc | fc is lowercase ? nonzero : zero | 000 | 000 | ###
###      pointer:                                                  ^    ###

############################# GET BOTH CASES OF FC #############################

++++[<++++++++>-]   get 32 (add to uppercase character to get lowercase)

<<[                 if the character is already lowercase:

  [-]                 clear the lowercase flag

  ----[>-<----]>-     sub 64 from the cell with 32

<]

<[>+>+<<-]          add fc to the 32 or minus 32 to get both cases


### current tape: | 000 | fc | other case of fc | ###
###      pointer:    ^                            ###

###################### LOOP THROUGH REMAINING CHARACTERS #######################

<,[                 for each character:

  [>+>>>+>>+>+<<<<<<<-]
                      make four copies
                      (only 3 are strictly needed; 4th will resync a branch)

  >>                  go to the first case of fc

  [<<+>>-]<<[>->+<<-] subtract one case of fc from one copy

  >[[-]+<]            if the result is nonzero set it to 1

  >[>]<<              go to the other case of fc (and resync branches)

  [>>+<<-]>>[<-<+>>-] subtract other case of fc from other copy

  <[[-]+>]            if the result is nonzero set it to 1

  >>[<]               resync branches using extra copy

  <<<<[>>>+<<<-]>>>   add results together

  -                   subtract 1

   if the character exactly matched either case: 1 plus 0 minus 1 = 0
  if the character exactly matched neither case: 1 plus 1 minus 1 = 1
    if the character exactly matched both cases: impossible

  [                   if the result is 1:

    >>.<<               output character

    -                   set cell to 0 to kill loop

  ]

  >>>[[-]<]           clean up remaining copies

  <<<<<,              get next character; or end loop if done

]

Tolong jangan terlalu sering menurunkan ini . c: Saya bekerja sangat keras ...
Addison Crump

13

Perl, 13 byte

#!perl -p
/./,s/$&//gi

Menghitung shebang sebagai satu, input diambil dari stdin.


Contoh Penggunaan

$ echo Testing Testing One Two Three | perl remove-first.pl
esing esing One wo hree

$ echo \ Testing Testing One Two Three | perl primo-remove.pl
TestingTestingOneTwoThree

Bagus. Saya berpikir tentang bagaimana Perl mungkin akan melakukan yang buruk karena kebutuhan untuk menulis substrtetapi tentu saja Anda datang dengan cara yang jauh lebih baik!
hobbs

Mengapa Anda menghitung hashbang sebagai satu byte?
Zereges

@ Zona garis shebang tidak diperlukan, jika skrip dipanggil sebagai perl -p script.pl. Opsi baris perintah biasanya dihitung sebagai masing-masing satu byte, setidaknya di situs ini.
Primo

@primo begitu, terima kasih.
Zereges

10

CJam, 8 byte

q(_32^+-

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

q        e# Read all input from STDIN.
 (       e# Shift out the first character.
  _32^   e# Push a copy and XOR its character code with 32.
         e#   For a letter, this swaps its case.
         e#   For a space, this pushes a null byte.
      +  e# Concatenate these two characters.
       - e# Remove all occurrences of both from the input string.

Saya awalnya menciptakan tantangan ini untuk belajar CJam, dan saya tidak pernah tahu tentang hal XOR!
GamrCorps

2
Saya pribadi merasa heran bahwa bahasa apa pun - kecuali mungkin sed - bisa mengalahkan perl dalam tantangan ini.
Primo

@ primo - Anda belum memperhatikan bahwa CJam dan / atau Pyth cukup banyak memenangkan 99% dari ini? Perl cukup bagus, mengingat itu satu-satunya yang tidak dirancang secara khusus sebagai bahasa golf.
Darrel Hoffman

Kelebihan Pyth dan operator CJam adalah konyol. minus (string, string) melakukan penghapusan per-karakter bukan operasi inti dalam bahasa lain yang saya temui.
Sparr

@Par APL memiliki built-in yang sama. (Disebut demikian ~.)
Dennis

7

Pyth, 8 byte

-zr*2hz3

Cobalah online

Menggunakan versi Python str.titleuntuk mengubah string huruf pertama dua kali ke dalam formulir "<Upper><Lower>". Kemudian menghapus setiap elemen dari input yang ada di string itu. Spasi berfungsi dengan baik karena tidak terpengaruh oleh str.title.



5

JavaScript (ES6), 38 36 byte

Ini tidak tergantung pada flagsparameter yang spesifik Mozilla.

f=x=>x.replace(RegExp(x[0],'gi'),'')

CoffeeScript, 39 37 byte

Untuk sekali ini lebih pendek dalam JS daripada CoffeeScript!

f=(x)->x.replace RegExp(x[0],'gi'),''

3
Paling tidak di browser yang saya coba, newopsional, jadi RegExp(x[0],'gi')lebih pendek.
Neil

4

PHP, 41 byte

Mengambil satu argumen baris perintah . Tag terbuka pendek perlu diaktifkan untuk PHP <5.4.

<?=str_ireplace($argv[1][0],'',$argv[1]);

1
Anda dapat mempersingkatnya dengan mendeklarasikan variabel yang berisi $argv[1]:<?=str_ireplace(($a=$argv[1])[0],'',$a);
Benoit Esnard

3

Perl, 27 byte

Ini adalah program yang lengkap, meskipun hanya berdasarkan pada 2 regex yang mungkin dapat disalin ke dalam program Retina untuk menghemat byte pada I / O.

$_=<>;m/(.)/;s/$1//gi;print

Sunting: Sepertinya ini sudah dikalahkan dengan seseorang menggunakan -popsi. Oh, dan menggunakan $&bukan $1.


1
Bahkan jika seluruh shebang dihitung (yaitu program "lengkap"), #!perl -pmasih dua byte lebih pendek dari $_=<>;print.
Primo

@primo Saya tidak pernah menggunakan opsi apa pun di golf saya. Saya baru saja googled apa yang dilakukan -popsi. Sebenarnya tidak ada pengeditan yang dapat saya lakukan untuk jawaban saya tanpa membuatnya identik dengan jawaban Anda.
PhiNotPi

3

Minkolang 0,9 , 23 33 byte

Tidak mungkin ini akan menang tetapi eh, itu menyenangkan!

" Z"od0c`1c*-$I[odd0c`1c*-2c=?O].

Coba di sini.

Penjelasan

" Z"                                 Makes it easier to uppercase
    od                               Take first character of input and duplicate
      0c`1c*-                        Uppercase if needed
             $I[               ]     Loop over the input
                odd                  Take character from input and duplicate twice
                   0c`1c*-           If it's lowercase, uppercase it.
                          0c=?       Check to see if it's equal to first character
                              O      If not, output as character
                                .    Exit

(Ini mungkin gagal dalam beberapa kasus tepi, seperti jika karakter pertama adalah simbol.)


3

TECO , 15 14 byte

Mengedit teks? Jika ragu, gunakan Editor Teks dan Korektor!

Setelah banyak trial-and-error (kebanyakan kesalahan), saya pikir ini adalah program TECO generik terpendek yang akan melakukan pekerjaan.

0,1XA<S^EQA$-D>

Atau, dalam bentuk yang bisa dibaca manusia

0,1XA    ! Read the first character of the string into the text area of !
         ! Q-buffer A.                                                  !
<        ! Loop,                                                        !
S^EQA$   ! searching for the text in Q-buffer A in either lowercase or  !
         ! uppercase,                                                   !
-D       ! and deleting it,                                             !
>        ! until the search fails.                                      !

$mewakili kunci keluar, dan ^Emewakili urutan CTRL+ E. Bergantung pada rasa TECO yang Anda gunakan, mungkin saja ia mengenali pengganti ASCII ini, atau mungkin juga tidak.

Menurut manual, beberapa dialek TECO menerima versi 13-byte ini (menggunakan perintah find-and-delete alih-alih memisahkan perintah "find" dan "delete"):

0,1XA<FD^EQA$>

3

Pip, 8 byte

aR-Xa@0x

Mengambil string sebagai argumen baris perintah (perlu dikutip jika berisi spasi). Penjelasan:

          a gets cmdline arg; x is "" (implicit)
    a@0   First character of a
   X      Convert to regex
  -       Make regex case-insensitive
aR     x  Replace all matches of that regex in a with empty string
          Autoprint (implicit)

Solusi ini memiliki bonus tambahan bekerja pada string yang berisi setiap karakter ASCII yang dapat dicetak. ( XOperator backslash-lolos dari segala sesuatu yang bukan alfanumerik.)


3

Python, 66 char

a=raw_input()
print a.replace(a[0],'').replace(a[0].swapcase(),'')

5
@ThomasKwa bagaimana kalau tidak.
TheDoctor

3

Julia, 34 byte

s->replace(s,Regex(s[1:1],"i"),"")

Ini menciptakan fungsi tanpa nama yang menerima string dan mengembalikan string. Itu membangun ekspresi reguler tidak sensitif-huruf dari karakter pertama dalam input dan menggantikan semua kemunculan itu dengan string kosong.



2

R, 43 byte

cat(gsub(substr(s,1,1),"",s<-readline(),T))

Ini adalah program lengkap yang membaca baris dari STDIN dan menulis hasil yang dimodifikasi ke STDOUT.

Tidak Disatukan:

# Read a line from STDIN
s <- readline()

# Replace all occurrences of the first character with an empty
# string, ignoring case
r <- gsub(substr(s, 1, 1), "", s, ignore.case = TRUE)

# Write the result to STDOUT
cat(r)

2

Ruby, 25 byte

Fungsi anonim:

->s{s.gsub /#{s[0]}/i,""}

Program penuh, 29 byte:

puts gets.gsub /#{$_[0]}/i,""

2

Python, 61 byte (terlalu banyak)

lambda x:"".join(map(lambda y:(y.lower()!=x[0].lower())*y,x))

Saya membayangkan ada cara yang lebih baik untuk melakukan hal ini, tetapi saya tidak dapat menemukannya. Ada gagasan tentang menghapus "".join(...)?


1
@ThomasKwa mungkin Anda harus mengirimkannya sebagai jawaban Anda sendiri; tampaknya terlalu berbeda dengan milikku untuk dihitung sebagai kiriman saya.
cole

@ThomasKwa Lebih singkat untuk dilakukan x[0]+x[0].swapcase().
xnor

1
@ThomasKwa Atau, mencuri dari solusi Pyth FryAmTheEggman (x[0]*2).title(),.
xnor

@ xnor ya, saya menemukan bahwa ketika saya membaca mereka beberapa jam yang lalu.
lirtosiast

lambda x:x.replace(x[0].upper(),'').replace(x[0].lower(),'')- 60 byte
Mego

2

Ouroboros , 61 byte

Hei, ini lebih pendek dari C ++! Ha.

i..91<\64>*32*+m1(
)L!34*.(;Si.1+!24*(Y.@@.@=@.@32-=\@+2*.(yo

Dalam Ouroboros, setiap baris program mewakili seekor ular dengan ekornya di mulutnya. Kontrol aliran dicapai dengan memakan atau memuntahkan bagian ekor, dengan tumpukan bersama untuk menyinkronkan antara ular.

Ular 1

i.membaca karakter dari input dan menduplikatnya. .91<\64>*32*menekan 32jika karakternya adalah huruf besar, 0jika tidak. +ing itu ke karakter mengkonversi huruf besar ke huruf kecil sambil meninggalkan huruf kecil dan spasi tidak berubah. Semua ini telah terjadi pada tumpukan ular 1, jadi kami sekarang mendorong nilainya ke tumpukan bersama (m ) agar ular 2 diproses. Akhirnya, 1(makan karakter terakhir dari ekor 1 ular. Karena di situlah penunjuk instruksi berada, ular itu mati.

Ular 2

)tidak berpengaruh pertama kali. L!34*mendorong 34jika tumpukan bersama kosong, 0jika tidak. Kami kemudian .dup dan (makan banyak karakter.

  • Jika tumpukan bersama kosong, ini menempatkan ujung ular tepat setelah (kita baru dieksekusi. Oleh karena itu, kontrol loop kembali ke awal baris, di mana )memuntahkan karakter yang baru saja kita makan (setelah sebelumnya mendorong salinan tambahan dari34 ) dan mengulangi uji panjang stack.
  • Jika tumpukan bersama tidak kosong, tidak ada karakter yang dimakan, ';' menjatuhkan ekstra 0, dan eksekusi berlanjut:

Siberalih ke tumpukan bersama dan memasukkan karakter lain. .1+!24*mendorong 24jika karakter itu -1 / EOF, 0jika tidak. Satu dari,( menelan 24 karakter - termasuk IP - dan ular mati. Jika tidak, eksekusi berlanjut.

Ymenarik salinan bagian atas tumpukan bersama (karakter yang baru saja kita baca) ke tumpukan ular 2 sendiri untuk digunakan di masa depan. Kemudian .@@.@=@.@32-=\@+2*hitung apakah karakter baru sama dengan karakter pertama atau karakter pertama minus 32, dorong 2jika ya dan 0kalau tidak. Kami .menduplikasi dan (memakan banyak karakter:

  • Jika karakter cocok, kita langsung kembali ke kepala ular, di mana (memuntahkan 2 karakter yang baru saja kita makan dan eksekusi dilanjutkan dengan karakter berikutnya.
  • Jika tidak, kita ymenggeser karakter kembali dari tumpukan 2 ular, omengucapkannya, dan kemudian mengulang.

Lihat itu dalam aksi


2

C, 60 byte

n,c,d;main(){for(;read(0,&c-n,1);n=2)d-c&31&&n&&putchar(d);}

Sunting: Memperbaiki bug yang menyebabkan byte nol untuk dicetak di awal


apakah itu mengkompilasi?
Abr001am

1
Iya nih. Ini mengkompilasi pada mesin saya (dengan peringatan) dan berfungsi. Anda juga dapat mengujinya di halaman ini: golf.shinh.org/check.rb
xsot

ya itu; +1
Abr001am

2

Python 2, 43

lambda s:s.translate(None,(s[0]*2).title())

Ini agak didasarkan pada jawaban Pyth saya, tetapi juga terkait dengan beberapa komentar dari ThomasKwa dan xnor dari sini . Sebagian besar memposting karena saya ingin jawaban ini ada.


2

Vim, 30 penekanan tombol

Maaf untuk menggali, tetapi saya tidak melihat jawaban Vim D:

If<Right>xh@x.<Esc>"xy07|@x2|~0"xd7|@x0x

Penjelasan:

  1. If<Right>xh@x.<Esc>
    Tulis makro (rekursif) di sekitar karakter pertama
    Bergerak ke kiri ( h) diperlukan untuk tetap di sebelah kiri karakter yang belum dibaca berikutnya.
    Menambahkan karakter apa pun ( .) di akhir diperlukan jika karakter kedua harus dihapus
  2. "xy0 Salin makro di register x
  3. 7| Pindah ke char 7
  4. @x Jalankan makro dari x
  5. 2|~ Ganti case dari char pertama (sebenarnya di posisi ke-2)
  6. 0"xd7| Potong makro dalam register x
  7. @x Jalankan makro dari x
  8. 0x Lepaskan dudukan tempat .

1
:DSaya selalu mendukung vim!
DJMcMayhem

1

Haskell, 52 byte

import Data.Char
t=toUpper
r(h:s)=filter((t h/=).t)s

2
Daftar pemahaman menghemat 1 byte: r(h:s)=[c|c<-s,t c/=t h].
nimi

1

TI-BASIC, 164 byte

Untuk kalkulator grafik TI-83 + / 84 + seri.

Input Str1
1→X
"sub(Str1,X,1→u
"ABCDEFGHIJKLMNOPQRSTUVWXYZ zyxwvutsrqponmlkjihgfedcba
u+sub(Ans,54-inString(Ans,u),1
For(X,2,length(Str1
If 2<inString(Ans+Str1,u
Ans+u
End
sub(Ans,3,length(Ans)-2

TI-BASIC jelas merupakan alat yang salah untuk pekerjaan itu.

  • Itu tidak memiliki perintah untuk menghapus karakter, jadi kita perlu mengulang melalui string dan menambahkan karakter jika mereka tidak cocok dengan apa yang harus dihapus.
  • Itu tidak mendukung string kosong, jadi kita perlu memulai string dengan dua huruf yang akan dihapus, membangun output di akhir, dan memotong dua karakter pertama.
  • Itu tidak memiliki perintah perubahan huruf, jadi kita perlu meng-hardcode seluruh alfabet ...
    • dua kali...
    • Apakah saya menyebutkan huruf kecil masing-masing mengambil dua byte dalam pengkodean TI-BASIC?

Saya tidak 100% yakin, tetapi saya menghabiskan lebih dari enam jam untuk hal ini, dan sepertinya ini adalah solusi sesingkat mungkin.

Untuk mengujinya dengan input non-huruf besar (atau mengetiknya ke dalam kalkulator Anda), buat program lain dengan konten AsmPrgmFDCB24DEC9, dan jalankan dengan menggunakan Asm([whatever you named it]untuk mengaktifkan mode pengetikan huruf kecil.


1

Lua, 93 78 Bytes

a=io.read()m=a:sub(1,1):upper()print(({a:gsub("["..m..m:lower().."]","")})[1])

1

Common Lisp, 77

(princ(let((x(read-char)))(remove-if(lambda(y)(char-equal x y))(read-line))))

Mengutuk nama-nama fungsi panjang ini (dan tanda kurung (tapi aku tetap menyukainya) ()


1

C, 65 61 byte

main(c,v)char**v;{for(c=**++v;*++*v;**v-c&31&&putchar(**v));}

Kompilasi dengan peringatan. Membaca string dari argv[1]. Contoh online


1
Anda dapat menyingkat main(int c,char**v)menjadi main(c,v)char**v;, dan (**v-c)%32ke **v-c&31.
Dennis

1

C ++, 100 99 98 byte

#include<ios>
int main(){for(int c,f=getchar();~(c=getchar());)tolower(c)-tolower(f)&&putchar(c);}

Hanya satu byte lagi untuk mendapatkan di bawah 100. getchar() kembali -1ketika membaca akhir sungai, sehingga itu sebabnya ~dalam forsiklus. (~-1 == 0 )

Tidak disatukan

#include <ios>
int main()
{
    for (int c, f = getchar(); ~(c = getchar()); )
        tolower(c) - tolower(f) && putchar(c);
}

Tidak bisakah Anda menggunakan &&putchar(c)bukan ?putchar(c):0?
Neil

@Neil Terima kasih, sekarang saya di bawah 100 byte!
Zereges

@ThomasKwa Tentu saja saya bisa, terima kasih.
Zereges

1
Bisakah Anda melakukan f-c&31seperti pada jawaban C?
lirtosiast

1

AppleScript, 209 201 byte

Satu-satunya hiburan saya adalah saya mengalahkan Brainfuck.

setel ke (tampilkan dialog "" jawaban default "") teks dikembalikan
atur n ke nomor karakter a
setel ke ""
ulangi n
jika bukan karakter a n = karakter a 1 maka atur o ke karakter a n & o
atur n ke n-1
akhir
Hai

Cara kerjanya adalah saya mengambil input a, mendapatkan panjang adan menandainya n, dan mengatur variabel output o. Untuk setiap karakter yang saya temukan yang tidak mengandung karakter pertama dari ( a's character 1), saya menggabungkannya menjadi o. Baris terakhir dicetak o.

Catatan: Ini secara otomatis mendukung semua Unicode. c:


3
My only consolation is that I beat Brainfuck.sepertinya saya lebih baik bermain golf;)
undergroundmonorail

1

Retina , 16 byte

i`(.)(?<=^\1.*)

Simpan kode dengan linefeed tambahan dan jalankan dengan -sbendera.

Cara kerjanya: trailing linefeed menjadikan ini tahap penggantian, sehingga setiap kecocokan dari regex yang diberikan diganti dengan string kosong. The ibergantian pada kasus-sensitif modus yang juga membuat backreferences case-sensitive. Akhirnya, regex cukup cocok dan menangkap satu karakter dan kemudian memeriksa apakah karakter pertama dalam string adalah sama (hingga huruf besar) menggunakan backreference.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.