Bir dizenin ilk harfinin tüm oluşumlarını tüm dizgiden kaldır


24

Sadece karakterleri içeren bir giriş dizesi Verilen A-Z, a-zilk karakter ise ve boşluk (dizesinin ilk karakterin büyük ve küçük sürümleri tüm oluşumlarını kaldırın Akaldırmak As ve abirinci karakter ise s (boşluk) kaldır tüm boşluklar) ve çıktıyı yazdırır.

Örnek vakalar:

  • 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

Bu , bayt cinsinden en kısa kod kazanır!

Notlar:

  • Giriş her zaman 2 veya daha fazla geçerli karakter olacaktır.
  • Çıktı asla boş bir dize olmayacak.

Çıktının boş dize olduğu durumu ele almamız gerekiyor mu? Ya giriş boş dize ise?
lirtosiast

@ThomasKwa çıktının 2 veya daha fazla karakter olabileceğini varsayabilirsin
GamrCorps

@ThomasKwa ve çıktı asla boş olmayacak
GamrCorps

Yanıtlar:


9

Pyth, 7 bayt

-zrBhz2

Çevrimiçi deneyin: Gösteri veya Test Paketi

Güzel. Yeni bifürkat operatörü (sadece 8 günlük) burada bir karakter tasarruf etmenize yardımcı olur. Sanırım bu, bu özelliği kullanan ilk kod.

açıklama

-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
Düzgün, bunu bilmiyordu. +1
FryAmTheEggman

14

brainfuck, 219 bayt

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

(İşaretçinin negatiflere gitmesine izin veren bir bant gerektirir veya çalışırsa sonuna kadar döngüye ,girer. Ayrıca EOF'da 0 döndürmesi gerekir . Deneyimime göre, çoğu tercüman varsayılan olarak bu gereksinimleri karşılar.)

Bu aslında oldukça kolay olduğu ortaya çıktı! Golf oynanabiliyorsa şaşırmam (baytların nereye harcanabileceği konusunda bir fikrim var, ancak dışarı atılacağından emin değilim). Yine de, işe almak gerçekten hiç zor değildi.

Bu kod, ASCII değeri 97'nin altındaki her şeyi büyük harf olarak kabul eder. İlk karakter boşluksa, "küçük harfli" bir alanı (yani chr(32+32), yani @) dizeden kaldırmaya çalışır . Bu sorun değil, çünkü sadece harfler ve boşluklar mevcut olacak.

Yorumlarla:

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

]

Lütfen bunu çok fazla golf oynamayın . c: Çok çalıştım ...
Addison Crump

13

Perl, 13 bayt

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

Shebang'ı bir olarak sayarak girdi stdin'den alınır.


Örnek Kullanım

$ 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

Güzel. Yazma gereği yüzünden Perl'in muhtemelen nasıl kötü olacağını düşünmüştüm substrama elbette çok daha iyi bir yol buldun!
Ocaklar

Neden hashbang'ı bir bayt olarak sayıyorsun?
Zereges

@Zerges komut dosyası olarak çağrılırsa, shebang satırı gerekli değildir perl -p script.pl. Komut satırı seçenekleri genellikle en az bu sitede, her biri bir bayt olarak sayılır.
primo

@primo görüyorum, teşekkürler.
Zereges

10

CJam, 8 bayt

q(_32^+-

CJam tercümanında çevrimiçi olarak deneyin .

Nasıl çalışır

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.

Aslen CJam'ı öğrenmek için bu mücadeleyi yarattım ve XOR olayını asla bilmiyordum!
GamrCorps

2
Şahsen , belki de sed hariç , herhangi bir dilin bu zorlukla başa çıkabileceğini şaşırtıcı buluyorum .
primo

@primo - CJam ve / veya Pyth'un bunun% 99'unu hemen hemen kazandığını fark etmediniz mi? Perl, özellikle bir golf dili olarak tasarlanmayan tek kişi olduğunu düşünüyor.
Darrel Hoffman

Pyth ve CJam'ın operatörünün aşırı yüklenmesi çok saçma. Karakter başına kaldırma işlemi gerçekleştiren eksi (dize, dize) karşılaştığım başka bir dilde çekirdek işlem değildir.
Sparr

@Sparr APL aynı yerleşik yapıya sahiptir. (Yine de denir ~.)
Dennis,

7

Pyth, 8 bayt

-zr*2hz3

Çevrimiçi deneyin

str.titleİlk harfin bir dizesini iki kez forma dönüştürmek için Pyth'in python's sürümünü kullanır "<Upper><Lower>". Sonra her elemanı o dizgede bulunan girişten çıkarır. Boşluklar iyi çalışır çünkü etkilenmezler str.title.



5

JavaScript (ES6), 38 adet 36 bayt

Bu , Mozilla'ya özgü olan flagsparametreye bağlı değildir .

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

CoffeeScript, 39 37 bayt

Bir kere olsun JS'de CoffeeScript'ten daha kısa!

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

3
En azından denediğim tarayıcılarda newisteğe bağlı, yani RegExp(x[0],'gi')daha kısa.
Neil


3

Perl, 27 bayt

Bu tam bir programdır, ancak G / Ç'de bayt tasarrufu yapmak için muhtemelen bir Retina programına kopyalanabilecek 2 regex'e dayanmaktadır.

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

Düzenleme: Bu -pseçeneği zaten kullanan biriyle dövülmüş gibi görünüyor . Oh, $&yerine $1.


1
Tüm shebang sayılsa bile (yani "tam" bir program), #!perl -phala iki bayt daha kısadır $_=<>;print.
primo

@primo Golf sahalarımdaki seçeneklerin hiçbirini hiç kullanmadım. Ben sadece -pseçeneğin ne yaptığını googled . Cevabımı, sizinki ile aynı yapmadan yapabileceğim herhangi bir düzenleme yok.
PhiNotPi

3

Minkolang 0.9 , 23 33 bayt

Bunun kazanması mümkün değil ama eh, eğlenceli!

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

Burada dene.

açıklama

" 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

(Bu, ilk karakter bir sembol gibi, bazı kenar durumlarda başarısız olabilir.)


3

TECO , 15 14 bayt

Metin düzenleniyor mu? Şüphe durumunda, Metin Düzenleyici ve COrrecter!

Çok deneme yanılma (çoğunlukla hata) yaptıktan sonra, bunun işi yapacak en kısa genel TECO programı olduğunu düşünüyorum.

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

Veya, insan tarafından okunabilir biçimde

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.                                      !

$escape tuşunu ve + ^Edizisini temsil eder . Kullanmakta olduğunuz TECO'nun lezzetine bağlı olarak, bu ASCII sübstitüsyonlarını tanıyabilir veya olmayabilir.CTRLE

El kitabına göre, bazı TECO lehçeleri bu 13 baytlık sürümü kabul eder (bunun yerine ayrı "bul" ve "sil" komutları yerine bir bul ve sil komutunu kullanarak):

0,1XA<FD^EQA$>

3

Pip, 8 bayt

aR-Xa@0x

Dizeyi komut satırı argümanı olarak alır (boşluk içeriyorsa alıntı yapılması gerekir). Açıklama:

          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)

Bu çözüm içeren dizeleri üzerinde çalışan ekstra bonus sahip herhangi bir yazdırılabilir ASCII karakterleri. ( Xİşleç ters eğik çizgiden - alfanümerik olmayan herhangi bir şeyden kaçar.)


3

Python, 66 karakter

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

5
@ThomasKwa nasıl hayır.
Doctor

3

Julia, 34 bayt

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

Bu, bir dizeyi kabul eden ve bir dize döndüren adsız bir işlev oluşturur. Girişteki ilk karakterden büyük / küçük harf duyarlı bir düzenli ifade oluşturur ve bunun tüm oluşumlarını boş bir dizeyle değiştirir.



2

R, 43 bayt

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

Bu, STDIN'den bir satır okuyan ve değiştirilmiş sonucu STDOUT'a yazan tam bir programdır.

Ungolfed:

# 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

Yakut, 25 bayt

Anonim işlev:

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

Tam program, 29 bayt:

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

2

Python, 61 bayt (çok fazla)

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

Bunu yapmanın daha iyi bir yolu olduğunu hayal ediyorum, ama bulamıyorum. Kaldırılması hakkında herhangi bir fikir "".join(...)?


1
@ThomasKwa belki de bunu kendi cevabınız olarak sunmalısınız; benim gönderim saymak benimkinden çok farklı görünüyor.
cole,

@ThomasKwa Daha kısa yapmak x[0]+x[0].swapcase().
xnor

1
@ThomasKwa Veya FryAmTheEggman's Pyth çözümünden çalmak (x[0]*2).title(),.
xnor

@xnor evet, birkaç saat önce onlarınkini okuduğumda buldum.
lirtosiast

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

2

Ouroboros , 61 bayt

Hey, C ++ 'dan daha kısa! Ha.

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

Ouroboros'ta programın her satırı kuyruğu ağzında olan bir yılanı temsil ediyor. Kontrol akışı, yılanlar arasında senkronize etmek için kuyruğun bölümlerini yiyip paylaşarak, paylaşılan bir istifle gerçekleştirilir.

Yılan 1

i.Girişten bir karakter okur ve onu çoğaltır. Aksi takdirde, karakter büyük harf ise .91<\64>*32*iter . karaktere küçük harfleri ve boşlukları değiştirmeden bırakarak büyük harfleri küçük harfe dönüştürür. Tüm bunlar yılan 1'in yığında meydana geldi, bu yüzden şimdi yılan 2'nin işlenmesi için değeri paylaşılan yığına ( ) zorluyoruz . Sonunda, yılan 1'in kuyruğunun son karakterini yer. Talimat göstergesinin bulunduğu yer olduğundan, yılan ölür.320+m1(

Yılan 2

)ilk kez hiçbir etkisi yoktur. Aksi takdirde paylaşılan yığın boşsa L!34*iter . Daha sonra tekrar çoğaldık ve o kadar karakter yiyoruz.340.(

  • Eğer paylaşılan yığın boşsa, bu işlem, yılanın sonunu, (sadece infaz ettikten hemen sonra ortaya koyuyor . Bu nedenle kontrol, )yeni yediğimiz karakterleri (daha önce fazladan bir kopyasını itti 34) yeniden düzene sokan ve yığın uzunluğu testini tekrarlayan satırın başlangıcına geri döner .
  • Paylaşılan yığın boş değilse, hiçbir karakter yemez ''; Fazladan düşer 0ve uygulama devam eder:

Sipaylaşılan yığına geçer ve başka bir karakter girer. Aksi takdirde bu karakter -1 / EOF ise .1+!24*iter . EOF'da IP de dahil olmak üzere 24 karakter yutar ve yılan ölür. Aksi takdirde, yürütme devam eder.240(

Yileride kullanmak üzere 2'nin kendi yığınını yılan için paylaşılan yığının tepesinin bir kopyasını (az önce okuduğumuz karakter) yazar. Daha sonra .@@.@=@.@32-=\@+2*yeni bir karakter iterek ilk karaktere ya da ilk karakter eksi 32 ile aynı olup olmadığını hesaplar 2, bu yüzden ve 0değilse. Biz .çoğaltmak ve (birçok karakter yemek:

  • Karakterler eşleşirse, yılanın başına geri döneriz, (az önce yediğimiz 2 karakteri yitirir ve yürütme bir sonraki karakterle devam eder.
  • Değilse, ykarakter yılan 2'nin yığından geri, ank obunun ıkış ve sonra döngü.

İşlemde görün


2

C, 60 bayt

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

Düzenleme: Boş bir baytın başında basılmasına neden olan bir hata düzeltildi.


bile derler mi?
Abr001am

1
Evet. Makinemde (uyarılarla) derleniyor ve çalışıyor. Bu sayfada da test edebilirsiniz: golf.shinh.org/check.rb
xsot

Evet öyle; +1
Abr001,

2

Python 2, 43

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

Bu benim Pyth yanıta göre biraz olduğunu, ama aynı zamanda bazı ThomasKwa yorumlarına ve XNOR alakalı burada . Çoğunlukla gönderiyorum çünkü bu cevabın var olmasını istedim.


2

Vim, 30 Tuş vuruşları

Açıldığım için özür dilerim, ancak herhangi bir Vim cevabı D göremiyorum:

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

Açıklama:

  1. If<Right>xh@x.<Esc>
    İlk karakterin etrafına (özyinelemeli) bir makro yazın Bir sonraki okunmamış karakterin solunda kalmak için sola
    hareket hetmek gerekir
    ( .), ikincinin kaldırılması gerektiğinde en sonunda herhangi bir karakter eklemek ( ) gerekir
  2. "xy0 Makroyu kayıt defterine kopyala x
  3. 7| 7. karaktere geçin
  4. @x Makroyu çalıştır x
  5. 2|~ İlk karakterin durumunu değiştir (aslında 2. konumda)
  6. 0"xd7| Makroyu kayıt defterinde kes x
  7. @x Makroyu çalıştır x
  8. 0x Yer tutucuyu çıkarın .

1
:DBen her zaman takma oy veririm!
DJMcMayhem

1

Haskell, 52 bayt

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

2
Liste anlama 1 byte kaydeder: r(h:s)=[c|c<-s,t c/=t h].
nimi

1

TI-BASIC, 164 bayt

TI-83 + / 84 + serisi grafik hesap makineleri için.

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 açıkça iş için yanlış bir araçtır.

  • Karakterleri kaldırmak için bir komut kullanmıyor, bu nedenle dizgiyi dolaşıp, kaldırılacak olanla eşleşmezse karakterleri eklememiz gerekir.
  • Boş dizeleri desteklemiyor, bu yüzden dizeyi kaldırılacak iki harfle başlatmamız, çıktıyı sonuna kadar oluşturmamız ve ilk iki karakteri kesmemiz gerekiyor.
  • Büyük / küçük harf değiştirme komutları bulunmadığından alfabenin tamamını kodlamamız gerekiyor ...
    • iki defa...
    • TI-BASIC kodlamasında küçük harflerden her birinin iki byte aldığından bahsetmiş miydim?

% 100 emin değilim, ancak bunun için altı saatimi harcadım ve mümkün olan en kısa çözüm gibi görünüyor.

Bunu büyük harf olmayan girişlerle test etmek (veya hesap makinenize yazmak için), içerikleriyle farklı bir program yapın AsmPrgmFDCB24DEC9ve Asm([whatever you named it]küçük harfle yazma modunu etkinleştirmek için kullanarak çalıştırın .


1

Lua, 93 78 Bayt

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

1

Ortak Lisp, 77

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

Bu uzun fonksiyon adlarını lanetleyin (ve parantezleri (ama yine de onları seviyorum (: 3))).


1

C, 65 61 bayt

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

Uyarılarla derler. Dize dan okur argv[1]. Çevrimiçi örnek


1
Sen kısaltabilir main(int c,char**v)için main(c,v)char**v;ve (**v-c)%32için **v-c&31.
Dennis,

1

C ++, 100 99 98 bayt

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

Sadece bir tane daha bayt 100. altına almak getchar()getiri -1o akışın sonuna okuduğunda o yüzden bu yüzden, ~olduğu fordöngüsü. ( ~-1 == 0)

Ungolfed

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

&&putchar(c)Bunun yerine kullanamaz ?putchar(c):0mısın?
Neil

@Neil Teşekkürler, şimdi 100 baytın altındayım!
Zereges

@ThomasKwa Elbette yapabilirim, teşekkürler.
Zereges

1
f-c&31C cevabında olduğu gibi yapabilir misin ?
lirtosiast

1

AppleScript, 209 201 bayt

Benim tek teselli benim Brainfuck'ı yenmem.

a (("" default answer "") iletişim kutusunu görüntüle
n'yi bir karakterin numarasına ayarlamak
o "" olarak ayarla
tekrar n
a karakteri n değilse n = a karakteri 1 ise o zaman o karakteri a n & o olarak ayarlayın.
n'yi n-1'e ayarlayın
son
O

Bunun nasıl çalıştığı, girdiyi aalıp, uzunluğunu alıp, aolarak işaretleyip nçıktı değişkenini ayarlamak o. Bulduğum her karakter için bir ( a's character 1) ' in ilk karakterini içermiyor , onu birleştirmek o. Son satır yazdırılıyor o.

Not: Bu otomatik olarak tüm Unicode'u destekler. c:


3
My only consolation is that I beat Brainfuck.golf
undergroundmonorail

1

Retina , 16 bayt

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

Kodu takip eden bir satır besleme ile kaydedin ve -sbayrakla çalıştırın .

Nasıl çalışır: takip eden satır beslemesi bunu yeni bir aşama yapar, böylece verilen regex'in eşleşmeleri boş bir dizeyle değiştirilir. Büyük / iküçük harfe duyarlı olmayan modu açar ve aynı zamanda geri büyüklükleri küçük harfe duyarsız kılar. Son olarak, regex basitçe tek bir karakterle eşleşir ve yakalar ve daha sonra bir geri referans kullanarak dizedeki ilk karakterin aynı olup olmadığını (duruma göre) kontrol eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.