Kısaltmalar, mesaj sensörlerinizi gerçekten daraltabilir.


36

Bu nedenle, bir cümlenin bir kelimenin kısaltması olması durumunda daha iyi bir çalışma yöntemine ihtiyacınız vardır. Ayrıca, söz konusu ifadenin ve kelimenin özyinelemeli kısaltmalar olup olmadığını görmenin faydalı olacağını da düşünüyorsunuz.

Senin görevin:

Bir kelime ve sonra bir çizgi ile ayrılmış bir cümle verilirse, cümle bir kısaltma ise ve o zaman özyinelemeli bir kısaltma ise çıktı . (Cümle ne anlama geldiğini içerir)

  • Girdi, boşlukların yanı sıra alfabetik karakterlerden de oluşacaktır.
  • Programınız büyük / küçük harf duyarlı olmamalıdır.

Örnek Giriş / Çıkış:

Dava 1:

Giriş:

Acronyms
Acronyms can really obviously narrow your message sensors

Çıktı:

True 
True

Durum 2:

Giriş:

FAQ
frequently asked questions

Çıktı:

True 
False

Durum 3:

Giriş:

foo
bar baz

Çıktı:

False
False

4. Durum:

Giriş:

GNU
GNU is not Unix

Çıktı:

False
False

Durum 5:

Giriş:

Aha
A huge Aha

Çıktı:

True
True

69
Kısaltmalar Tekrarlayabilir mi? Ah! Şimdi anlam veriyorsun.
Geobits

2
Hayır, çıktının ne olduğu açık olduğu sürece
Mavi

9
Bu bana bir XKCD'yi hatırlatıyor: xkcd.com/917
ETHproductions


4
ABCDE: Başka bir temel açıkça tanımlanmış örnek.
John Dvorak

Yanıtlar:


10

Pyth, 19 18

&pqJrz0hCKcrw0)}JK

Bu gibi oldukça garip formatta sonuç yazdırır: TrueFalse.

Şunları yapabilirsiniz çevrimiçi denemek ya Testi Suite çalıştırın .

Açıklama:

&pqJrz0hCKcrw0)}JK      :
    rz0    rw0          : read two lines of input, and convert each to lower case
          c   )         : chop the second input on whitespace
   J     K              : store the first line in J and the chopped second line in K
  q    hC               : zip K and take the first element, check if it is the same as J
 p                      : print and return this value
&              }JK      : and the value with whether J is in K, implicit print

15

Python 3, 89

SOPython sayesinde birkaç bayt kurtarıldı.

a=input().lower()
d=input().lower().split()
h=tuple(a)==next(zip(*d))
print(h,h&(a in d))

Bu çözümün en karmaşık kısmı h=tuple(a)==next(zip(*d)).
Bu, listeyi zip'e paketler ve daha sonra bir ( ) harfinde bir harfe karşılık gelen her bir yinelenebilir maddenin ilk elemanının bir demetini döndürmek için dçağırır .nextziptuple(a)


Sen yerine 7 bayt kaydedebilirsiniz [0]==l için .startswith(l).
Skyler

7

CJam, 21 20 bayt

qeuN/)S/_:c2$s=_p*&,

Bu kemanı CJam yorumlayıcısında deneyin veya tüm test durumlarını bir kerede doğrulayın.

Nasıl çalışır

qeu                  e# Read from STDIN and convert to uppercase.
   N/                e# Split at linenfeeds.
     )S/             e# Pop the second line form the array.
      S/             e# Split it at spaces.
        _:c          e# Push a copy and keep on the initial of each word.
           2$s       e# Push a copy of the line array and flatten it.
                     e# This pushes the first line.
              =      e# Check for equality.
               _p    e# Print a copy of the resulting Boolean.
                 *   e# Repeat the word array 1 or 0 times.
                  &  e# Intersect the result with the line array.
                   , e# Push the length of the result (1 or 0).

4

Haskell, 81 80 bayt

import Data.Char
f[a,b]|c<-words b=(a==map(!!0)c,elem a c)
p=f.lines.map toLower

Çıktı formatı kesin olarak tanımlanmadı, bu yüzden bir çift boolean döndürdüm, örneğin p "Aha\na huge arm"-> (True,False).


Bugün örüntü korumalarını ( <-) öğrendim - teşekkürler!
wchargin

4

Scala, 135 110 108 bayt

val Array(x,y)=args.map(_.toLowerCase)
val z=y.split(" ").map(_(0)).mkString
print(z==x,z==x&&y.contains(z))

Komut satırı argümanlarını (birkaç ipucu için J Atkin sayesinde) kullanarak, boolean'leri tupel olarak koyarak mkStringyerine printn yerine printn yazdırarak birkaç bayt kurtardı new String.

EDIT: Soruyu yanlış yorumladı ve çözümü yeniden uygulamak zorunda kaldı.


3

Python 3, 106 bayt

En azından Scala'yı yendi;)

x=input().lower()
y=input().lower().split()
g=all(x[i]==y[i][0]for i in range(len(y)))
print(g,g&(x in y))

1
Çamurlu balık Her bir örnek için muhtemelen daha fazla açıklama yapılması bunun diğer insanlara olmasını engelleyecektir.
Beta Çürümesi

Kum havuzunda daha fazla zaman yardımcı olur mu? (Açıkçası oldukça sınırlı) deneyimime göre, neredeyse
Blue

@muddyfish Peki ne kadar süredir bıraktığınızı bilmiyorum, bilmiyorum
Beta Decay

Bir günlüğüne orada bıraktım
Mavi,

@muddyfish Bir hafta önerilen norm
Beta Decay

3

AppleScript, 302 301 297 293 Bayt

Ah, cehennem evet. Kaybetmem bile beni rahatsız etmedi, bu AppleScript için rekabetçi.

x 'i ("" varsayılan cevap "" iletişim kutusunu görüntüle) metnin döndürdüğü
y 'yi ("" varsayılan cevap "" iletişim kutusunu görüntüle) metninin sözcüklerini döndürdü
n 'y' nin öğelerinin sayısını belirle
tekrar n
Deneyin
y öğesinin n karakteri değil 1 = (metin olarak x) 'in karakteri n ise {false, false}
son
n'yi n-1'e ayarlayın
son
return {true, x y cinsindendir}

Çıkışlar:

{doğru yanlış}

Ya da cevap ne olursa olsun.


2

PHP, 120 bayt

Büyük / küçük harfe duyarlı olmamak çok fazla ağırlıktır (26 bayt). Tüm test durumlarını geçti:

foreach($c=explode(' ',strtolower($argv[2]))as$l)$m.=$l[0];var_dump($x=$m==$a=strtolower($argv[1]),$x&&in_array($a,$c));

Bu formda iki bool değeri verir:

bool(true)
bool(false)

Aşağıdaki gibi komut satırından iki argüman okur:

a.php Acronyms "Acronym can really obviously narrow your message sensors"

Ungolfed

$acronym = strtolower($argv[1]);
$words = strtolower($argv[2]);
$words = explode(' ', $words);

foreach($words as $word) {
    $letters .= $word[0];
}

$isAcronym = $letters == $acronym;

var_dump(
    $isAcronym,
    $isAcronym && in_array($acronym, $words)
);

2

Yakut, 77 74 bayt

b=gets.chop.upcase
a=gets.upcase
p c=a.scan(/\b\w/)*''==b,c&&a.include?(b)

1

Ruby, 52 bayt

p !!gets[/^#{x=gets.scan(/\b\w/)*""}$/i],!! ~/#{x}/i

Örnek:

$ echo "Aha
A huge AHA" | ruby acronym.rb
true
true

1

Matlab, 90 bayt

function z=f(r,s)
z=[sum(regexpi(s(regexpi(s,'(?<=(\s|^))\S')),r))>0 nnz(regexpi(s,r))>0];

Örnek (Matlab'ın true/ falseas 1/ görüntülendiğini unutmayın 0):

>> f('Aha', 'A huge Aha')
ans =
     1     1

1

JavaScript ES6, 95 92 bayt

(a,b)=>[(r=eval(`/^${a}$/i`)).test((s=b.split` `).map(c=>c[0]).join``),s.some(c=>r.test(c))]

Her iki dizeyi de parametre olarak girin. İki değer içeren bir dizi çıkarır: her bir boole için bir tane.


1
Bunun yerine bir regex kullanmayı düşünmezdim .indexOf. İyi iş! Belki r=eval(`/^${a}$/i`)mevcut rkurulumunuzun yerine çalışırdı.
ETHProductions

@ETHproductions Ve sırayla ben evalbir RegExpnesne kısaltıcı olarak düşünmedim . Bahşiş için teşekkürler!
Mwr247

0

GNU sed, 118 bayt

-rBayrak, +1 olarak skora dahil edilmesini gerektirir . \bGNU sed'de belgelenmiş bulamamama rağmen, kelime sınırı eşleşmesi için kullandığımı unutmayın . Benim İçin Çalışıyor ...

N
h
s/^(.*)\n.*\b\1\b.*/True/i
/\n/s/.*/False/
x
:
s/(.)(.*\n)\1[^ ]* ?/\2/i
t
/../s/.*/False/
/F/h
/F/!s/.*/True/
G

Expanded:

#!/bin/sed -rf

N
h

# Is it recursive?
s/^(.*)\n.*\b\1\b.*/True/i
# If no replacement, there's still a newline => false
/\n/s/.*/False/

x

# Is it an acronym?
# Repeatedly consume one letter and corresponding word
:
s/(.)(.*\n)\1[^ ]* ?/\2/i
t
# If more than just \n remain, then false
/../s/.*/False/
# And falsify recursive, too
/F/h
# !False => true
/F/!s/.*/True/

G

0

Groovy, 91 bayt

a=args*.toLowerCase()
println([a[1].split()*.charAt(0).join("")==a[0],a[1].contains(a[0])])

Çıkış formatıdır [bool, bool]. Bu komut satırındaki girişleri alır.


0

Lua 5.3, 182 bayt

a=""b=io.read c=a.lower d=a.reverse e=d(c(b()))f=~e:len()h=a.sub g=d(c(b()))for m in g:gmatch"[^ ]+"do f=-~f if h(e,f,f)~=h(m,~0)then break end k=k or m==e end f=f>~1print(f,f and k)

0

R, 93 bayt

a=tolower(readLines(,2));cat(a[1]==gsub("([^ ])\\w* ?","\\1",a[2]),a[1]%in%scan(t=a[2],w=""))

Kullanımı:

> a=tolower(readLines(,2));cat(a[1]==gsub("([^ ])\\w* ?","\\1",a[2]),a[1]%in%scan(t=a[2],w=""))
Aha
A huge Aha
Read 3 items
TRUE TRUE
> a=tolower(readLines(,2));cat(a[1]==gsub("([^ ])\\w* ?","\\1",a[2]),a[1]%in%scan(t=a[2],w=""))
Acronyms
Acronyms can really obviously narrow your message sensors
Read 8 items
TRUE TRUE
> a=tolower(readLines(,2));cat(a[1]==gsub("([^ ])\\w* ?","\\1",a[2]),a[1]%in%scan(t=a[2],w=""))
FAQ
frequently asked questions
Read 3 items
TRUE FALSE
> a=tolower(readLines(,2));cat(a[1]==gsub("([^ ])\\w* ?","\\1",a[2]),a[1]%in%scan(t=a[2],w=""))
foo
bar baz
Read 2 items
FALSE FALSE

0

awk 137 bayt

awk 'BEGIN{T="True";F="False"}NR*NF<2{a=tolower($1)}END{for(i=1;i<=NF;i++)b=b substr(tolower($i),1,1);print(a==b?T:F)"\n"(a==tolower($1)?T:F)}'
  • T="True";F="False"Çıktıyı basitleştirmek için başlat .
  • NR*NF<2{a=tolower($1)}: ayalnızca ilk satırın tek bir alanı varsa ayarlayın .
  • END{...}: sadece iki satır varsayarsak ...
    • for(i=1;i<=NF;i++)b=b substr(tolower($i),1,1): özyinelemeli kısaltma inşa.
    • print(a==b?T:F)"\n"(a==tolower($1)?T:F): Her iki karşılaştırmanın çıktısını yazdırabilir a==bve a==tolower($1).

Özyinelemeli kısaltma yapısını nasıl optimize edeceğinizi bilen birileri varsa, önermekten çekinmeyin.


0

SpecBAS - 144 bayt

1 INPUT a$,b$: LET a$=UP$(a$),b$=UP$(b$),d$="": DIM c$(SPLIT b$,NOT " ")
2 FOR EACH w$ IN c$(): LET d$=d$+w$(1): NEXT w$
3 TEXT d$=a$'POS(a$,b$)>0

2 x girişleri büyük harfe dönüştürme, karakterleri küçük harfe dönüştürmeye karşı korur. Şimdi bir LETifadede yapılan birden fazla ödev alabilir , bu da yardımcı olur. Ve TEXTbir karakter kaydeder PRINT.

Doğru / yanlış göstermek için 1/0 kullanır (kesme işareti yalnızca çıktıyı bir sonraki satıra taşır).


0

Perl5, 90 bayt

($a,$b)=map{chomp;lc}<>;print((join"",map{substr($_,0,1)}split/ /,$b)ne $a?0:($b=~$a?2:1))

biraz hile yapmak: 0 = hepsi yanlış, 1 = bir doğru, 2 = her ikisi de doğru. Ben bir golfçü değilim ama tarama sırasında üzgünüm perl eksik!

($a,$b)=map{chomp;lc}<>;              # get the two lines as lowercase
print((                               #
join"",map{substr($_,0,1)}split/ /,$b # collapse first letters of secondline
     ) ne $a  ? 0 : ( $b=~$a ? 2 : 1))# 0 nothing, 1 not recursive, or 2 

0

JavaScript (ES6) 93

(w,s)=>s[L='toLowerCase'](w=w[L](z=y='')).replace(/\w+/g,v=>y+=v[z=z||v==w,0])&&[y=y==w,y&&z]

Aşağıdaki snippet'i çalışan herhangi bir EcmaScript 6 uyumlu tarayıcıda test edin

f=(w,s)=>s[L='toLowerCase'](w=w[L](z=y='')).replace(/\w+/g,v=>y+=v[z=z||v==w,0])&&[y=y==w,y&&z]

// TEST

out=x=>O.innerHTML+=x+'\n';

;[
 ['Acronyms', 'Acronyms can really obviously narrow your message sensors', true, true]
,['FAQ', 'frequently asked questions', true, false]
,['foo', 'bar baz', false, false]
,['GNU', 'GNU is not Unix', false, false]
,['Aha', 'A huge Aha', true, true]
,['Lolcat', 'Laughing over lolcat captions and tearing.', true, true]
,['ABCDE', 'Another basic clearly defined example.', true, false]
,['GNU', 'Gnus nettle unicorns', true, false]
,['PHP', 'PHP Hypertext Preprocessor', true, true]
].forEach(([a,b,c,d]) => (
  [r,s]=f(a,b), 
  out(((r==c && s==d)?'OK ':'KO ') + a + ',' + b + ' -> ' + f(a,b))
))
<pre id=O></pre>


0

JavaScript (ES6), 89 96 95 bayt

(a,b)=>[p=(a=a[l='toLowerCase']())==(c=b[l]().split` `).map(x=>x[0]).join``,p&&c.some(x=>x==a)]

Shucks ... Her şeyi hallettiğimi sanıyordum ama görünüşe göre yanılmışım.

Bu, girişi iki dize olarak alan ve iki boolean öğenin dizisini döndüren ve döndüren adsız bir işlevi tanımlar. İlk madde tüm küçük harfli ilk dize ile ikinci dize her kelimenin ilk karakterini karşılaştırarak hesaplanır. İkinci madde, ikinci dizginin ilki içerip içermediğini kontrol ederek hesaplanır.

İşte ikinci ürün için başka bir çözüm; 2 bayt daha kısa, ancak çok az sayıda tarayıcı bunu destekliyor:

p&&c.includes(a)

İkinci dizginin ilk başarısız olup olmadığını denetlemeGNU: Gnus nettle unicorns
edc65

Lütfen tekrar kontrol edin: denedi ve çalışmadı bile: ReferenceError: l is not defined(daha l=önce eksik toLowerCase)
edc65

... bu hata düzeltildi, başarısız oldu 'GNU','GNU is not unix'(test durumu 4) yanlış, yanlış olmalı
edc65

@ edc65 Shucks, l=bir hatayı ararken süre sildim ve geri koymak unuttum. Bunu getirdiğiniz için teşekkürler! Diğer test durumu da sabitlenmelidir.
ETHProductions

0

Pyke (yayınlandığı zaman isimsiz), (rekabetçi olmayan), 20 bayt

l1c"jFh)J"iQl1qDji{&

Kaynak kodunu burada bulabilirsiniz , dil tamamen dengesizdir (bunun için ilk sınav zorunluluğu vardır), bu yüzden gelecekte çalışmasını beklemeyin (8)

Veya 18 bayt (sabit)

l1idcmhsRl1jqDji{&

Burada dene!

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.