Bir Kısaltma Oluştur


19

Bu, bir kısaltma yapmakla benzer , ancak kısaltmanın getirilmesi yöntemi ve esnek çıktı da dahil olmak üzere birçok temel fark vardır.

Görev

Yalnızca yazdırılabilir ASCII içeren bir dize (karakter / uzunluk 1 dizelerinin listesine izin verilir) verildiğinde, girdideki bir boşluk veya tire ile başlayan veya girdideki ilk karakter olan tüm büyük harfleri çıktılayın. Boş dize tanımlanmamış bir davranıştır.

Test Durumları:

Çıktı biçiminde olabilir "TEST", ["T","E","S","T"]sizin için, ya da her türlü başka işler.

Self-contained Underwater Breathing Apparatus
SUBA

a Programming Language
PL

NATO Atlantic TREATY Organization
NATO

DEFCON 2
D

hello, world!


light-Emitting dioDe
E

What Does the Fox Say?
WDFS


3D mov-Ies
I

laugh-Out Lou-D
OLD

Best friends FOREVE-r
BF

--


<space>


--  --a -  - --


--  -- -  - -- A
A

Step-Hen@Gmail-Mail Mail.CoM m
SHMM

Bu , bayt en kısa cevap kazanır.



Girişi Dizeler (karakter listesi) listesi olarak alabilir miyiz?
Bay Xcoder

@ Mr.Xcoder evet.
Stephen

Harf, sayı, boşluk veya tire olmayan bir veya daha fazla karakterle ayrılmış bazı harfleri içeren bir test durumu ekleyebilir misiniz? Örneğin bir e-posta adresi,: My-Name@Some-Domain.TLD.
Shaggy

1
@Shaggy ekledi, teşekkürler.
Stephen

Yanıtlar:


8

V , 7 bayt

ÍÕü¼À!õ

Çevrimiçi deneyin!

İşte bayt sayısını kanıtlamak için bir hexdump:

00000000: cdd5 fcbc c021 f5                        .....!.

Açıklama:

Í       " Search and replace all occurrences on all lines:
        " (Search for)
 Õ      "   A non-uppercase letter [^A-Z]
  ü     "   OR
      õ "   An uppercase letter
    À!  "   Not preceded by...
   ¼    "   A word-boundary
        " (implicitly) And replace it with:
        "   Nothing

V'nin harika normal ifade sıkıştırması sayesinde bu kısa .


Oldukça kısa 0.o
Stephen

@StepHen Neden teşekkür ederim! Bence bu optimum seviyeye oldukça yakın. :)
DJMcMayhem

2
Kelime sınırıyla ne demek istiyorsun? Soru sadece boşluk olduğunu ve -izin verildiğini göstermektedir.
Neil

8

R , 66 63 bayt

function(s)(s=substr(strsplit(s,' |-')[[1]],1,1))[s%in%LETTERS]

Çevrimiçi deneyin!

Scarabee sayesinde -3 bayt

Anonim bir işlev; kısaltmayı c("N","A","T","O")dolaylı olarak yazdırılan bir vektör olarak döndürür .

Bir kere, bu R'de çok kötü değil! ilgili yarıklar -veya (space)olanlar harfler (hangisi, bunların her birinin birinci eleman alır ve daha sonra geri döner LETTERSamacıyla büyük harflerle bir R yerleşiğidir).


Sanırım birkaç bayt kurtarabilirsiniz:function(s)(s=substr(strsplit(s,' |-')[[1]],1,1))[s%in%LETTERS]
Scarabee

1
@Scarabee teşekkür ederim. üzgünüm güncelleme 2 yıl sürdü.
Giuseppe


5

Javascript 21 bayt

Bir dize girişi alır ve kısaltma karakterlerini içeren bir dize dizisi çıkarır

x=>x.match(/\b[A-Z]/g)

açıklama

Bu sadece kelime sınırı için küresel bir normal regex maçı ve ardından büyük bir harf.



4

Dyalog APL, 29 23 bayt

Bonus test durumu: Bir Programlama Dili (APL).

'(?<=^| |-)[A-Z]'⎕S'&'⊢

Bir dizi karakter döndürür (TIO'da ayrılmış boşluk olarak gösterilir).

Çevrimiçi deneyin!


Eski yazı, 29 byte

{(⎕AV~⎕A)~⍨'(\w)\w+'⎕R'\1'⊢⍵}

Çevrimiçi deneyin!

Nasıl?

'(\w)\w+'⎕R - her bir alfabetik karakter kümesini değiştirin

    '\1' - ilk karakteriyle

~⍨ - her karakteri kaldır

    (⎕AV~⎕A) - bu bir ASCII büyük harf değil


3

Python, 53 bayt

import re
lambda s:re.findall("(?<=[ -])[A-Z]"," "+s)

Çevrimiçi deneyin!

Boşluk veya tire için basit bir düzenli ifade. Başlangıç ​​ile eşleştirmek yerine boşluk bırakın.


MrXCoder test paketiyle bir TIO bağlantısında düzenlendi.
Stephen

Teşekkürler @ StepHen - sen beni dövdü ve beni kurtardın
Chris H


3

C #, 84 78 bayt

using System.Linq;s=>s.Where((c,i)=>c>64&c<91&(i>0?s[i-1]==32|s[i-1]==45:1>0))

@Jkelm sayesinde 6 bayt kaydedildi .

Çevrimiçi deneyin!

Tam / Biçimli Sürüm:

using System.Collections.Generic;
using System.Linq;

class P
{
    static void Main()
    {
        System.Func<string, IEnumerable<char>> f = s => s.Where((c, i) => c > 64 & c < 91 & (i > 0 ? s[i-1] == 32 | s[i-1] == 45: 1 > 0));

        System.Console.WriteLine(string.Concat(f("Self-contained Underwater Breathing Apparatus")));
        System.Console.WriteLine(string.Concat(f("a Programming Language")));
        System.Console.WriteLine(string.Concat(f("NATO Atlantic TREATY Organization")));
        System.Console.WriteLine(string.Concat(f("DEFCON 2")));
        System.Console.WriteLine(string.Concat(f("hello, world!")));
        System.Console.WriteLine(string.Concat(f("light-Emitting dioDe")));
        System.Console.WriteLine(string.Concat(f("What Does the Fox Say?")));
        System.Console.WriteLine(string.Concat(f("3D mov-Ies")));
        System.Console.WriteLine(string.Concat(f("laugh-Out Lou-D")));
        System.Console.WriteLine(string.Concat(f("Best friends FOREVE-r")));
        System.Console.WriteLine(string.Concat(f(" ")));
        System.Console.WriteLine(string.Concat(f("--  --a -  - --")));
        System.Console.WriteLine(string.Concat(f("--  -- -  - -- A")));

        System.Console.ReadLine();
    }
}

Muaf using System.Linqise neden bayt sayısına dahil etmek zorundasınız using System.Collections.Generic? usingSayılabilecek bazı fikir birlikleri var mı?

Cevabımda using System.Linq;Linq kodu için @DaveParsons gerekiyor. Ancak, IEnumerbale<char>yanıtın bir parçası değildir ve bu kodun using System.Collections.Generic;derlenmesi gereken bir parçasıdır .
TheLethalCoder

mantıklı; açıklama için teşekkürler.

Karakterleri ints olarak kullanarak büyük harfleri kontrol ederek birkaç bayt kaydedebilirsiniz. c> 64 & c <91 size 6 bayt kazandırmalıdır.
jkelm

@jkelm Nice :) Bu numarayı hep unuturum!
TheLethalCoder

3

Julia 0.6.0 (57 bayt)

s=split(s,r" |-");for w∈s isupper(w[1])&&print(w[1])end

Açıklama: Bu benim ilk kod golfüm. Oldukça düz ileri. Kelimeleri bölün, her birinin ilk büyük harfini yazdırın.

Regex kullanarak daha iyi yapmak muhtemelen kolay ama bu konuda yeniyim


1
PPCG'ye Hoşgeldiniz! Şu anda oylarım bitti, bunu daha sonra oylayacağım.
Stephen

2
@StepHen Kapadım. : P
DJMcMayhem


2

C # (.NET Core) , 108 bayt

n=>{var j="";n=' '+n;for(int i=0;++i<n.Length;)if(" -".IndexOf(n[i-1])>=0&n[i]>64&n[i]<91)j+=n[i];return j;}

Çevrimiçi deneyin!


Kontrol ifetmediniz , ancak üçlü olarak değiştirmek baytlardan kurtarabilir. Bu, 2bunun yerine dizinde başlar, düzeltmek için olarak 1değiştirin . Bunun dışında burada yapabileceğiniz daha çok şey olduğunu sanmıyorum. int i=1int i=0
TheLethalCoder

Bir üçlü, burada bir if ifadesiyle aynı bayt sayısı olacağından yardımcı olmaz. Ancak, ilk i değerini değiştirmeniz gerektiğinde
haklısınız

Tamamen emin değildim ama her zaman çekmeye değer olduğundan genellikle daha kısa çıkıyorlar.
TheLethalCoder

2

Jöle ,  11  10 bayt

Outgolfer Erik sayesinde -1 bayt ( boşluklarda böler> _ <)

⁾- yḲḢ€fØA

Karakter listelerini alan ve döndüren monadik bir bağlantı.
Tam bir program olarak bir dizeyi kabul eder ve sonucu yazdırır.

Çevrimiçi deneyin! veya bir test takımına bakın .

Nasıl?

⁾- yḲḢ€fØA - Link: list of characters, x       e.g. "Pro-Am Code-golf Association"
   y       - translate x with:
⁾-         -   literal list of characters ['-',' '] "Pro Am Code golf Association"
    Ḳ      - split at spaces               ["Pro","Am","Code","golf","Association"]
     Ḣ€    - head each (1st character of each)      "PACgA"
        ØA - yield uppercase alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
       f   - filter keep                            "PACA"
           - if running as a full program: implicit print

Hmm, neden yerine kullanmıyorsun ṣ⁶?
Outgolfer Erik

Heh, çünkü unutmuşum. Teşekkürler!
Jonathan Allan

2

Perl 5 , 25 bayt

24 bayt kodu + 1 için -n.

grep -PDeğişken uzunlukta arkayı destekleyen can sıkıcı ama Perl şunları yapmıyor :(.

print/(?:^| |-)([A-Z])/g

@Dada sayesinde -1 bayt !

Çevrimiçi deneyin! - -ltüm testleri bir kerede çalıştırmayı içerir .


Çok daha iyi yapabilirsiniz: Çevrimiçi deneyin! ;-)
Dada

@Dada Hah! Tabii ki ... ATM dışındayım ama geri döndüğümde güncelleme yapacağım. Teşekkürler! Ben alamadım s///ya $_=da reddetmek için oldukça hayal kırıklığına uğradım print...
Dom Hastings

Evet, bunu s///çözmek için bir bekar arıyordum ama belli değil ... İşteyim, belki daha sonra tekrar deneyeceğim!
Dada


2

Brachylog , 25 23 22 bayt

,Ṣ↻s₂ᶠ{h∈" -"&t.∧Ạụ∋}ˢ

Çevrimiçi deneyin!

(@Fatalize sayesinde -2 bayt.)

,Ṣ↻                      % prepend a space to input
   s₂ᶠ                   % get all substrings of length 2 from that, to get prefix-character pairs
      {              }ˢ  % get the successful outputs from this predicate: 
       h∈" -"              % the prefix is - or space
               &t.∧        % then the character is the output of this predicate if:
                  Ạụ∋        % the alphabet uppercased contains the character

İki bayt kaydetmek yerine kullanabilirsiniz" "
18'de


2

Swift 5 , 110 bayt

-5 Teşekkürler Cœur

import UIKit
func f(s:[String]){for i in zip(s,[" "]+s){if i.0.isUppercase()&&"- ".contains(i.1){print(i.0)}}}

Detaylı açıklama

  • import Foundation- Bu kodun ana parçası Foundationiçin hayati önem taşıyan modülü içe aktarır zip().

  • func f(s:[String]){...}- Girdinin skarakterlerini temsil eden, Dizeler listesi olan bir parametreye sahip bir işlev oluşturur .

  • for i in zip(s,[" "]+s){...}- iGirişin zip ve başlangıçta boşluk eklenmiş giriş ile yinelenir, bu da Dize'de önceki karakteri almak için çok yararlıdır.

  • if - Aşağıdakileri kontrol eder:

    • i.0==i.0.uppercased() - Mevcut karakter büyük harf,

    • &&"- ".contains(i.1) - ve Önceki karakter boşluk veya kısa çizgi ise.

  • Yukarıdaki koşullar yerine getirilirse, o zaman:

    • print(i.0) - Karakter, kısaltmanın bir parçası olduğu için yazdırılır.

-5 ile import UIKityerine import Foundation.
Cœur



1

Python 3 , 73 70 bayt

lambda n:[n[x]for x in range(len(n))if'@'<n[x]<'['and(' '+n)[x]in' -']

Çevrimiçi deneyin!


açıklama

  • lambda n:- Bir String parametresi ile anonim bir lambda işlevi oluşturur n.

  • n[x]- ndizinindeki karakterini alır x.

  • for x in range(len(n))- Değişkeni adlandırarak 0uzunluğundan itibaren yineler .nx

  • if - Kontroller:

    • '@'<n[x]<'[' - Karakter büyük harfse,

    • and(' '+n)[x]in' -'- Ve öncesinde bir boşluk veya Dize'de bir boşluk ve tarafından oluşturulan bir çizgi varsa n.


2
Bunu okuduğum için kötü mü i supperve neden bilmiyorum?
TheLethalCoder

@TheLethalCoder Bu .isupper(), ne okuduğuna dair hiçbir fikrim yok: p
Bay Xcoder





1

Bash (grep), 29 28 bayt

grep -oP'(?<=^| |-)[A-Z]' a

Python cevabımın bir portu, ancak pgrepdeğişken uzunluklu gözetimleri desteklediği için fark edilir derecede daha kısa (python yükünü bile hesaba katıyor). Test durumlarını adlı bir dosyaya yapıştırın a, çıktı satır başına 1 karakterdir.

-1 Neil sayesinde


^| |-daha kısa bir test olabilir mi?
Neil

@Burada çalışan şey, teşekkürler. Kaçırdım çünkü Python'da çalışmıyor
Chris H

1

RProgN 2 , 18 bayt

`-` rû#ùr.'[a-z]'-

Açıklaması

`-` rû#ùr.'[a-z]'-
`-`                     # Push "-" literal, and " " literal.
    r                   # replace, Replaces all "-"s with " "s.
     û                  # Split, defaultly by spaces.
      #ù                # Push the head function literally.
        r               # Replace each element of the split string by the head function, which gets each first character.
         .              # Concatenate, which collapses the stack back to a string.
          '[a-z]'-      # Push the string "[a-z]" literally, then remove it from the string underneith, giving us our output. 

Çevrimiçi deneyin!


1

PHP, 62 bayt

for(;~$c=$argn[$i++];$p=$c!="-"&$c!=" ")$c<A|$c>Z|$p?:print$c;

Pipo ile çalıştırın -nRveya çevrimiçi deneyin .

diğer çözümler:

foreach(preg_split("#[ -]#",$argn)as$s)$s[0]>Z|$s<A?:print$s[0];  # 64 bytes
preg_match_all("#(?<=\s|-)[A-Z]#"," $argn",$m);echo join($m[0]);  # 64 bytes
preg_match_all("#(?<=\s|-)\p{Lu}#"," $argn",$m);echo join($m[0]); # 65 bytes

1

C ++, 168 bayt

#include<string>
auto a=[](auto&s){auto r=s.substr(0,1);if(r[0]<65||r[0]>90)r="";for(int i=1;i<s.size();++i)if(s[i]>64&&s[i]<91&&(s[i-1]==32||s[i-1]==45))r+=s[i];s=r;};

Çıkış parametre ile yapılır


Tamamen kaldırmak mümkün olabilir mi #include<string>ve argüman üstlenecek sbir olduğunu std::string?
Zacharý

1

Lua , 79 75 bayt

for i=1,#t do for i in(" "..t[i]):gmatch"[%-| ]%u"do print(i:sub(2))end end

Dene!

Ben denemek sürümü son sonundan önce bir print () sıkışmış çünkü aksi takdirde bir karışıklık. Bu program, G / Ç ve eşleştirme gereksinimlerine mükemmel bir şekilde uymaktadır, ancak bu ekstra yeni satır olmadan okunması oldukça zordur.

Girdi bir sayı tablosu şeklinde verilir: string, sayı her seferinde 1 artar ve 1'den başlar.

Açıklama:

Her giriş dizesinin bir gmatch'u boyunca döngüler için. Gmatch araması aşağıdaki gibidir:

[% - | ] - Gruplandır, bir - veya boşluk ara

% u - Büyük harf karakter ara

Daha sonra her maç için önceki çizgi veya boşluk eksi olarak yazdırılır

Düzenleme: 'a' bildirimini kaldırarak ve for döngüsünün içindeki girdiye boşluk ekleyerek ve alt girdiyi 2,2 yerine 2'ye (eşdeğer sonuçlar üreten) değiştirerek 4 bayt golf


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.