Uçak Koltukları Ata


16

Geçen haftanın APL dersinden esinlenildi .

Büyük bir 2D koltuk haritası ve 1D müşteri listesi verildiğinde, koltuk haritasını ve müşteri listesini iade edin, ancak aşağıdaki gibi değiştirin (dolu koltukları ve oturan müşterileri belirtmek için):

Giriş yolcu listesindeki her benzersiz harf için, koltuk haritasında soldan sağa, yukarıdan aşağıya doğru giden o harfin çoğunun (veya yeterli değilse tümü) küçük harf olmasını sağlayın.

Koltuk haritasındaki her benzersiz harf için, yolcu listesinde soldan sağa olacak şekilde o harfin çoğunun (veya yeterli değilse tümü) küçük harf olmasını sağlayın.

  1. Giriş koltuk harita sadece set {boşlukları ve büyük harfleri içeren F, B, P, E} ve çekebilir:
    1. satır sonları ile satırlara ayrılmış
    2. dizelerin bir listesi
    3. büyük harfli bir matris
    4. karşılaştırılabilir başka bir biçimde
  2. Giriş müşteri listesi sadece kümesinden Büyük harfler içeren { F, B, P, E} ve çekebilir:
    1. dizi
    2. karakterlerin listesi
    3. karşılaştırılabilir başka bir biçimde
  3. Sıfır veya daha fazla harf küçük harfe katlanmış olması dışında, döndürülen koltuk haritasının giriş ile aynı olması gerekir.
  4. Döndürülen müşteri listesi, sıfır veya daha fazla harfin küçük harfe katlanması dışında, giriş ile aynı olmalıdır.
  5. Öncü ve sondaki boşluklara izin verilir

Örnekler (United uçaklarının kısaltılmış sürümleri)

ERJ145

Koltuk haritası girişi:

P    
E    
E  PP
E  EE
E  EE
E  EE
E  EE

P  PP
E  EE
E  EE
E  EE

Yolcu listesi girişi:

FFEEEEEEEEEEEEEEEE

Koltuk haritası çıkışı:

P    
e    
e  PP
e  ee
e  ee
e  ee
e  ee

P  PP
e  eE
E  EE
E  EE

Yolcu listesi çıktısı:

FFeeeeeeeeeeeeeeee

CRJ700

Koltuk haritası girişi:

F   FF
F   FF
PP  PP
PP  PP
PP  PP
EE  EE

PP  PP
EE  EE
EE  EE
EE  EE

Müşteri listesi girişi:

FFFFFFFFPPEEEEEEEEEEEEEEEEEEEEE

Koltuk haritası çıkışı:

f   ff
f   ff
pp  PP
PP  PP
PP  PP
ee  ee

PP  PP
ee  ee
ee  ee
ee  ee

Müşteri listesi çıktısı:

ffffffFFppeeeeeeeeeeeeeeeeEEEEE

B757

Koltuk haritası girişi:

F F  F F
F F  F F
F F  F F

PPP     
PPP  PPP
PPP  PPP
PPP  PPP
EEE  EEE
EEE  EEE
PPP  PPP
EEE  EEE
EEE  EEE
     EEE

EEE  EEE
EEE  EEE
EEE  EEE
EEE     

Yolcu listesi girişi:

FEEEEEEEEFEEEFEEEEEEEEFEEFFEEFEFFFEE

Koltuk haritası çıkışı:

f f  f f
f f  f f
f f  F F

PPP     
PPP  PPP
PPP  PPP
PPP  PPP
eee  eee
eee  eee
PPP  PPP
eee  eee
eee  eee
     eeE

EEE  EEE
EEE  EEE
EEE  EEE
EEE     

Yolcu listesi çıktısı:

feeeeeeeefeeefeeeeeeeefeeffeefefffee

B767

Koltuk haritası girişi:

 F   F   F           
 F   F   F           
BB  B B  BB          
BB  B B  BB          
BB  B B  BB          
PP       BB          
PP                   

PP  PPP  PP          
PP  PPP  PP          
PP  PPP  PP          
PP  PPP  PP          
PP  EEE  PP          
EE  EEE  EE          
EE  EEE  EE          
EE  EEE  EE          
EE  EEE  EE          
EE  EEE  EE          

Yolcu listesi girişi:

PPFEFEEEEEEEBBEEFFPEBPEBBEEFEEEFEEEEEEFPEEEPB

Koltuk haritası çıkışı:

 f   f   f           
 f   f   f           
bb  b b  bb          
BB  B B  BB          
BB  B B  BB          
pp       BB          
pp                   

pp  PPP  PP          
PP  PPP  PP          
PP  PPP  PP          
PP  PPP  PP          
PP  eee  PP          
ee  eee  ee          
ee  eee  ee          
ee  eee  ee          
ee  EEE  EE          
EE  EEE  EE          

Yolcu listesi çıktısı:

ppfefeeeeeeebbeeffpebpebbeefeeefeeeeeeFpeeepb

3
Benim gibi, harflerin ne anlama geldiğini merak edenler için, sohbetin ilgili kısmına
JayCe

Yanıtlar:


5

05AB1E , 22 16 15 bayt

Nit sayesinde koltuk haritasının bir dize olarak alınabileceğini fark ederek 6 bayt tasarruf etti.

svDyå·Fyyl.;s]»

Çevrimiçi deneyin!

açıklama

s                     # setup stack as <passengerlist>,<seatmap>,<passengerlist>
 v                    # for each passenger y
  Dyå                 # does a corresponding seat exist?
     ·F               # multiplied by 2 times do:
       yyl.;          # replace the first y with a lowercase y
            s         # and swap the seatmap and passengerlist on the stack
             ]        # end loops
              »       # join seatmap and passengerlist on newline and output

1
Koltuk haritası, satır kesmeleri olan tek bir dize olarak girilebilir, bu sizi bir veya iki bayt kurtarmaz mı?
Nit

@Nit: Ah, Gerçekten beni kurtarmalı. Teşekkürler :)
Emigna

5

Python 2 , 93 89 84 83 82 78 bayt

l=input()
for c in l[1]:l=[x.replace(c,c.lower(),c in l[0])for x in l]
print l

Çevrimiçi deneyin!

Girdiyi iki dize olarak alır. İki dize yazdırır


Kayıtlı

  • -5 bayt, Dead Possum sayesinde
  • -4 bayt, Lynn sayesinde

1
s,p=[x.replace(c,c.lower(),c in s)for x in[s,p]]84 bayt için
Dead Possum

1
Tam bir program biraz daha kısa:l=input() for c in l[1]:l=[x.replace(c,c.lower(),c in l[0])for x in l] print l
Lynn

5

C (clang) , 75 68 bayt

f(char*s,char*p){char*r;while(*s){if(r=strchr(p,*s))*r=*s+=32;s++;}}

char *İçeriği yerinde değiştirilen iki (koltuk ve yolcu) alır.

Çevrimiçi deneyin!

C'de golf oynamaya Python'dan daha az alışkınım, ama bu da eğlenceli!

Herkesin kısaltmak için bir hile fikri varsa *r+=32,*i+=32minnettar olurum. -> Bana daha fazla bayt golf yardımcı olduğu için @Dave sayesinde!


1
i ve r aynı olacağından * r = * i + = 32 kullanabilirsiniz. Ayrıca i'den ve strchr çağrısında artım sonrası işlemlerden kurtularak birkaç karakter daha tıraş edebilirsiniz.
Dave

Teşekkür ederim, ne zaman güncelleyeceğim! S'yi doğrudan kullanmayı düşündüm, ancak bu bir nedenden dolayı işe yaramadı, geri döneceğim.
etene


4

C (gcc) , 63 bayt

f(x,y,z)char*x,*y,*z;{for(;*y;++y)if(z=strchr(x,*y))*z=*y+=32;}

Çevrimiçi deneyin!

Temel kavram için etene kredi bir sürü. Cevabının stratejisine ağır golf uyguladı.


Öner index()yerinestrchr()
ceilingcat

güzel gelişme. Buraya eklemeyeceğim çünkü POSIX'te tamamen kullanımdan kaldırıldı ve tecrübelerim derleyiciler tarafından daha az destekleniyor. Artı sadece 1 baytlık bir değişiklik. (PS: son zamanlarda tüm öneriler için teşekkürler :) <xkcd.com/541>)
LambdaBeta

Krediniz için teşekkürler! Bu tür bir golf oyunu, daha iyi golf oynamayı öğrenmenin en sevdiğim yoludur.
etene

Aynı zamanda, son zamanlarda tavan kedisi ve diğerleri tarafından gönderilerime yapılan yorumların bazılarına göz atmanızı tavsiye ederim. Hepimiz birbirimizden öğrendiğimizi seviyorum.
LambdaBeta

3

C (gcc) , 64 bayt

@ Etene'nin cevabından ödünç alarak if, ?:üçüncü basamak operatörünü kaldırdım ve yolcu işaretçisini kendi endeksi olarak tekrar kullandım.

f(s,p,j)char*s,*p,*j;{for(;*p;p++)(j=strchr(s,*p))?*j=*p|=32:0;}

Çevrimiçi deneyin!



2

Scala , 104 bayt

def f(l:Array[Char]*)=(l(0).map(? =>{val i=l(1)indexOf?;if(i>=0){l(1)(i)= ?toLower;l(1)(i)}else?}),l(1))

Çevrimiçi deneyin!

Girişte 2 sıra karakter alır ve 2 sıra karakter döndürür.

Açıklama:

def f(l: Array[Char]*) =          // input are varargs of Array[Char]; in our case 2 arrays. Arrays are chosen since mutable (the seatmap will be updated while the passenger list is mapped)
  (                               // we return a tuple with the 2 arrays of Chars
    l(0).map(                     // l(0) is the passenger list. We map (transform) each element of this list to lowercase or not and this is what's returned as 1st part of the tuple
      ? => {                      // ? is the current element of the passenger list being mapped (it's ? and not let's say m in order to be able to stick it next to functions)
        val i = l(1) indexOf ?   // i is the index (or -1) of the letter ? in the seat map
        if (i >= 0) {             // if index found
          l(1)(i) = ? toLower     // then we update the seatmap with the lower case version of this seat
          l(1)(i)                 // and the passenger list elmt is mapped to its lower case version (same as ?.toLower)
        }                         //
        else ?                    // if not found, the seatmap is not updated and the passenger list elmt stays in upper case
      }                           //
    ),                            // 
    l(1)                          // the updated seat map
  )

1
PPCG'ye Hoşgeldiniz!
Giuseppe

1

Retina , 36 bayt

+`(([A-Z])(.*¶)+.*?)(\2.*$)
$l$1$l$4

Çevrimiçi deneyin! Müşteri listesinin girdinin son satırı olduğunu varsayar. Açıklama: Eşleşen büyük karakter çiftlerini bulur ve $lböylece ara karakterlerden kaçınarak bunları küçük harflerle gösterir .



1

Perl 5 -pF , 48 bayt

$\=join'',<>;say map$\=~s/$_/lc$_/e&&lc||$_,@F}{

Çevrimiçi deneyin!

İlk girdi satırı yolcu listesidir. Sonraki tüm hatlar koltuk haritasıdır. Çıktı aynı.

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.