Hasilkan Akronim


19

Ini mirip dengan Membuat akronim , tetapi ada beberapa perbedaan utama, termasuk metode pengambilan akronim, dan tantangan ini termasuk output yang fleksibel.

Tugas

Diberikan string (daftar karakter / panjang 1 string diizinkan) yang hanya berisi ASCII yang dapat dicetak, mengeluarkan semua huruf kapital dalam input yang diawali dengan spasi atau tanda hubung, atau merupakan karakter pertama dalam input. String kosong adalah perilaku yang tidak terdefinisi.

Kasus uji:

Output mungkin dalam format "TEST", ["T","E","S","T"], atau apa pun yang lain bekerja untuk Anda.

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

Ini adalah , jadi jawaban tersingkat dalam byte menang.



Bisakah kita mengambil input sebagai daftar String (daftar karakter)?
Tn. Xcoder

@ Mr.Xcoder ya.
Stephen

Bisakah Anda menambahkan test case yang mencakup beberapa huruf yang dipisahkan oleh satu atau lebih karakter yang bukan huruf, angka, spasi atau tanda hubung. Alamat e-mail, misalnya: My-Name@Some-Domain.TLD.
Shaggy

1
@Shaggy menambahkan, terima kasih.
Stephen

Jawaban:


8

V , 7 byte

ÍÕü¼À!õ

Cobalah online!

Berikut ini adalah hexdump untuk membuktikan jumlah byte:

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

Penjelasan:

Í       " 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

Ini singkat semua berkat kompresi regex V yang luar biasa .


Itu cukup singkat, 0o
Stephen

@Langkah Mengapa terima kasih! Saya pikir ini cukup dekat dengan optimal. :)
DJMcMayhem

2
Apa yang Anda maksud dengan batas kata? Pertanyaan itu tampaknya menunjukkan bahwa hanya ruang dan -diizinkan.
Neil

8

R , 66 63 byte

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

Cobalah online!

-3 byte terima kasih kepada Scarabee

Fungsi anonim; mengembalikan akronim sebagai vektor c("N","A","T","O")yang dicetak secara implisit.

Untuk sekali ini, ini tidak terlalu buruk di R! memisahkan -atau (space)mengambil elemen pertama dari masing-masing, dan kemudian mengembalikan yang mana adalah kapital ( LETTERSadalah huruf R yang dibangun dengan huruf kapital), secara berurutan.


Saya pikir Anda dapat menyimpan beberapa byte:function(s)(s=substr(strsplit(s,' |-')[[1]],1,1))[s%in%LETTERS]
Scarabee

1
@ Carabee terima kasih. maaf butuh 2 tahun untuk memperbarui.
Giuseppe

6

Python 2 , 59 56 byte

-3 byte terima kasih kepada Lynn

lambda s:[b for a,b in zip(' '+s,s)if'@'<b<'['>a in' -']

Cobalah online!


Saya meminjam trik Anda '@'<b<'[', solusi yang sangat bagus +1
Tn. Xcoder

Jangan lupa tentang rantai perbandingan! '@'<b<'['>a in' -'menghemat 3 byte.
Lynn

5

Javascript 21 byte

Mengambil input string dan menampilkan array string yang berisi karakter akronim

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

Penjelasan

Itu hanya pertandingan regex global untuk batas kata yang diikuti dengan huruf kapital.



4

Dyalog APL, 29 23 byte

Kaset uji bonus: Bahasa Pemrograman (APL).

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

Mengembalikan array karakter (ditampilkan sebagai ruang yang dipisahkan pada TIO).

Cobalah online!


Posting lebih lama, 29 byte

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

Cobalah online!

Bagaimana?

'(\w)\w+'⎕R - Ganti setiap cluster karakter alfabet

    '\1' - dengan karakter pertamanya

~⍨ - Hapus setiap char

    (⎕AV~⎕A) - itu bukan huruf kapital ASCII


3

Python, 53 byte

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

Cobalah online!

Ekspresi reguler sederhana dengan lookahead untuk spasi atau tanda hubung. Daripada mencocokkan awal, tambahkan spasi.


Diedit dalam tautan TIO dengan test suite MrXCoder.
Stephen

Terima kasih @StepHen - Anda mengalahkan saya dan menyelamatkan saya dari upaya
Chris H


3

C #, 84 78 byte

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

Disimpan 6 byte berkat @jkelm .

Cobalah online!

Versi Lengkap / Diformat:

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();
    }
}

Mengapa Anda harus memasukkan using System.Linqdalam jumlah byte jika using System.Collections.Genericdikecualikan? Apakah ada konsensus yang usingdapat dihitung?

@DaveParsons using System.Linq;diperlukan untuk kode Linq dalam jawaban saya. Namun, IEnumerbale<char>bukan bagian dari jawabannya dan itu adalah bagian dari kode yang perlu using System.Collections.Generic;dikompilasi.
TheLethalCoder

masuk akal; terima kasih atas klarifikasi.

Anda bisa menyimpan beberapa byte dengan memeriksa huruf besar menggunakan karakter sebagai int. c> 64 & c <91 seharusnya menjaring Anda 6 byte.
jkelm

@ jkelm Bagus :) Saya selalu melupakan trik itu!
TheLethalCoder

3

Julia 0.6.0 (57 byte)

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

Penjelasan: Ini adalah golf kode pertama saya. Cukup lurus ke depan. Pisahkan kata-kata, cetak masing-masing huruf pertama.

Mungkin mudah dilakukan dengan lebih baik menggunakan regex tapi saya baru dalam hal ini


1
Selamat datang di PPCG! Saya kehabisan suara sekarang, saya akan angkat suara nanti.
Stephen

2
@ LANGKAH aku sudah mengerti. : P
DJMcMayhem


2

C # (.NET Core) , 108 byte

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;}

Cobalah online!


Belum dicentang tetapi mengubah ifke terner mungkin menghemat byte. Ini dimulai pada indeks 2alih-alih 1, ubah saja int i=1ke int i=0untuk memperbaikinya. Selain itu saya tidak berpikir ada banyak lagi yang bisa Anda lakukan di sini.
TheLethalCoder

A ternary tidak akan membantu di sini, karena itu akan menjadi jumlah byte yang sama dengan pernyataan if. Namun, Anda benar karena saya perlu mengubah nilai i awal
jkelm

Saya tidak sepenuhnya yakin tetapi mereka biasanya keluar lebih pendek sehingga selalu bernilai cek.
TheLethalCoder

2

Jelly ,  11  10 byte

-1 byte terima kasih kepada Erik the Outgolfer ( terbagi dua spasi> _ <)

⁾- yḲḢ€fØA

Tautan monadik yang mengambil dan mengembalikan daftar karakter.
Sebagai program penuh menerima string dan mencetak hasilnya.

Cobalah online! atau lihat test suite .

Bagaimana?

⁾- 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

Umm, kenapa tidak gunakan saja ṣ⁶?
Erik the Outgolfer

Heh, karena saya lupa tentang itu. Terima kasih!
Jonathan Allan

2

Perl 5 , 25 byte

24 byte kode +1 untuk -n.

Mengganggu bahwa grep -Pmendukung panjang variabel melihat-belakang tetapi Perl tidak :(.

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

-1 byte terima kasih kepada @Dada !

Cobalah online! - termasuk -luntuk menjalankan semua tes sekaligus.


Anda dapat melakukan sangat jauh lebih baik: Cobalah secara online! ;-)
Dada

@Dada Hah! Tentu saja ... Saya keluar ATM tetapi saya akan memperbarui ketika saya kembali. Terima kasih! Saya cukup kecewa saya tidak bisa mendapatkan s///atau$_= meniadakan print...
Dom Hastings

Ya, saya sedang mencari satu s///untuk menyelesaikan ini tetapi tidak jelas ... Saya sedang bekerja, mungkin saya akan mencobanya lagi nanti!
Dada


2

Brachylog , 25 23 22 byte

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

Cobalah online!

(-2 byte terima kasih kepada @Fatalize.)

,Ṣ↻                      % 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

Anda dapat menggunakan alih-alih " "menyimpan dua byte
Fatalkan


2

Cepat 5 , 110 byte

Terima kasih kepada Cœur

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

Penjelasan detail

  • import Foundation- Mengimpor modul Foundationyang sangat penting untuk zip(), bagian utama dari kode ini.

  • func f(s:[String]){...}- Membuat fungsi dengan parameter s, yaitu daftar String, mewakili karakter input.

  • for i in zip(s,[" "]+s){...}- Iterate dengan imelalui zip input dan input dengan spasi yang ditambahkan di awal, yang sangat membantu untuk mendapatkan karakter sebelumnya dalam String.

  • if - Cek apakah:

    • i.0==i.0.uppercased() - Karakter saat ini adalah huruf besar,

    • &&"- ".contains(i.1) - dan Jika karakter sebelumnya adalah spasi atau tanda hubung.

  • Jika kondisi di atas terpenuhi, maka:

    • print(i.0) - Karakter dicetak, karena itu adalah bagian dari akronim.

-5 dengan import UIKitbukan import Foundation.
Cœur

2

PowerShell , 43 byte

''+($args|sls '(?<=^| |-)[A-Z]'-a -ca|% m*)

Cobalah online!

Belum dibuka:

''+($args|select-string '(?<=^| |-)[A-Z]' -allmatches -caseSensitive|% matches)


1

Python 3 , 73 70 byte

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

Cobalah online!


Penjelasan

  • lambda n:- Membuat fungsi lambda anonim dengan parameter String n.

  • n[x]- Mendapat karakter nat index x.

  • for x in range(len(n))- Berganti dari 0panjang n, menamai variabel x.

  • if - Cek:

    • '@'<n[x]<'[' - Jika karakter huruf besar,

    • and(' '+n)[x]in' -'- Dan jika itu didahului oleh spasi atau tanda hubung dalam String yang dibentuk oleh spasi dan n.


2
Apakah buruk kalau saya baca itu i supper, dan saya tidak tahu kenapa?
TheLethalCoder

@TheLethalCoder Ini .isupper(), saya tidak tahu apa yang Anda baca: p
Mr. Xcoder





1

Bash (grep), 29 28 byte

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

Sebuah port jawaban python saya tetapi karena pgrepmendukung panjang variabel terlihat di belakangnya terasa lebih pendek (bahkan terhitung untuk overhead python). Tempel kotak uji dalam file bernama a, output adalah 1 karakter per baris.

-1 Terima kasih kepada Neil


^| |-mungkin tes yang lebih pendek?
Neil

@ Neil yang bekerja di sini, terima kasih. Ketinggalan karena tidak berfungsi dengan Python
Chris H

1

RProgN 2 , 18 byte

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

Dijelaskan

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

Cobalah online!


1

PHP, 62 byte

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

Jalankan sebagai pipa dengan -nRatau coba online .

solusi lain:

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 byte

#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;};

Output dilakukan melalui parameter


Apakah mungkin untuk menghapus sepenuhnya #include<string>dan menganggap argumennya sadalah std::string?
Zacharý

1

Lua , 79 75 byte

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

Cobalah!

Saya memasang cetakan () sebelum akhir pada versi coba karena kalau tidak berantakan. Program ini dengan sempurna mematuhi persyaratan I / O dan pencocokan, tetapi tanpa baris baru tambahan itu cukup sulit untuk dibaca.

Input diberikan dalam bentuk tabel angka: string, angka bertambah 1 setiap kali dan mulai dari 1.

Penjelasan:

Itu untuk loop melalui gmatch dari setiap string input. Pencarian gmatch adalah sebagai berikut:

[% - | ] - Kelompokkan, cari - atau spasi

% u - Mencari karakter huruf besar

Kemudian untuk setiap pertandingan, itu mencetaknya minus tanda hubung atau spasi sebelumnya

Sunting: Memotong 4 byte dengan menghapus deklarasi 'a' dan menambahkan spasi ke input di dalam for loop in, serta mengubah sub input menjadi hanya 2 daripada 2,2 (yang menghasilkan hasil yang setara)


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.