สร้างตัวย่อ


19

คล้ายกับการทำคำย่อแต่มีความแตกต่างที่สำคัญหลายประการรวมถึงวิธีการเรียกคำย่อและความท้าทายนี้รวมถึงผลลัพธ์ที่ยืดหยุ่น

งาน

รับสตริง (อนุญาตให้ใช้รายการตัวอักษร / สตริง 1 ความยาว) ที่มีเฉพาะ ASCII ที่พิมพ์ได้ให้พิมพ์ตัวอักษรพิมพ์ใหญ่ทั้งหมดในอินพุตที่นำหน้าด้วยช่องว่างหรือเส้นประหรือเป็นอักขระตัวแรกในอินพุต สตริงว่างคือพฤติกรรมที่ไม่ได้กำหนด

กรณีทดสอบ:

การส่งออกอาจจะอยู่ในรูปแบบของ"TEST", ["T","E","S","T"]หรือสิ่งอื่นงานสำหรับคุณ

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

นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ



เราสามารถรับอินพุตเป็นรายการของสตริง (รายการอักขระ) ได้หรือไม่?
Mr. Xcoder

@ Mr.Xcoder ใช่
Stephen

คุณสามารถเพิ่มกรณีทดสอบที่มีตัวอักษรบางตัวคั่นด้วยอักขระอย่างน้อยหนึ่งตัวที่ไม่ใช่ตัวอักษรตัวเลขช่องว่างหรือขีดกลาง My-Name@Some-Domain.TLDที่อยู่อีเมลตัวอย่างเช่น:
Shaggy

1
@Shaggy เพิ่มแล้วขอบคุณ
Stephen

คำตอบ:


8

V , 7 ไบต์

ÍÕü¼À!õ

ลองออนไลน์!

นี่คือ hexdump เพื่อพิสูจน์การนับไบต์:

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

คำอธิบาย:

Í       " 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 อัด regex


นั่นสั้นมาก 0.o
Stephen

@ StepHen ทำไมต้องขอบคุณ! ฉันคิดว่านี่ใกล้เคียงที่สุดแล้ว :)
DJMcMayhem

2
ขอบเขตของคำหมายถึงอะไร คำถามดูเหมือนจะแนะนำว่าพื้นที่เท่านั้นและ-ได้รับอนุญาต
Neil

8

R , 66 63 ไบต์

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

ลองออนไลน์!

-3 ไบต์ขอบคุณScarabee

ฟังก์ชั่นที่ไม่ระบุชื่อ ส่งคืนตัวย่อเป็นเวกเตอร์c("N","A","T","O")ซึ่งพิมพ์โดยนัย

ครั้งเดียวมันไม่ได้แย่เกินไปใน R! แยกบน-หรือ(space)ใช้องค์ประกอบแรกของแต่ละคนและผลตอบแทนจากนั้นแล้วแต่จำนวนใดคนเป็นเมืองหลวง ( LETTERSเป็น builtin R กับตัวอักษรทุน) ในการสั่งซื้อ


ฉันคิดว่าคุณสามารถบันทึกไม่กี่ไบต์:function(s)(s=substr(strsplit(s,' |-')[[1]],1,1))[s%in%LETTERS]
Scarabee

1
@carabee ขอบคุณ ขออภัยใช้เวลาอัปเดต 2 ปี
จูเซปเป้

6

Python 2 , 59 56 ไบต์

-3 ไบต์ด้วยLynn

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

ลองออนไลน์!


ฉันยืมเคล็ดลับของคุณ'@'<b<'['ทางออกที่ดีมาก +1
Mr. Xcoder

อย่าลืมเกี่ยวกับการผูกมัดการเปรียบเทียบ! '@'<b<'['>a in' -'บันทึก 3 ไบต์
ลินน์

5

Javascript 21 ไบต์

รับอินพุตสตริงและเอาต์พุตอาร์เรย์ของสตริงที่มีอักขระตัวย่อ

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

คำอธิบาย

มันเป็นเพียงการแข่งขันระดับโลกสำหรับขอบเขตของคำตามด้วยอักษรตัวใหญ่



4

Dyalog APL, 29 23 ไบต์

กรณีทดสอบโบนัส: ภาษาโปรแกรม (APL)

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

ส่งคืนอาร์เรย์ของตัวอักษร (แสดงเป็นช่องว่างคั่นบน TIO)

ลองออนไลน์!


โพสต์เก่ากว่า 29 ไบต์

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

ลองออนไลน์!

อย่างไร?

'(\w)\w+'⎕R - แทนที่แต่ละกลุ่มของตัวอักษรที่มีตัวอักษร

    '\1' - ด้วยอักขระตัวแรก

~⍨ - ลบถ่านทุกตัว

    (⎕AV~⎕A) - นั่นไม่ใช่ ASCII ตัวพิมพ์ใหญ่


3

Python ขนาด 53 ไบต์

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

ลองออนไลน์!

นิพจน์ทั่วไปอย่างง่ายพร้อม lookahead สำหรับช่องว่างหรือเส้นประ แทนที่จะจับคู่กับจุดเริ่มต้นให้เว้นวรรคไว้ก่อน


แก้ไขในลิงก์ TIO พร้อมชุดทดสอบของ MrXCoder
Stephen

ขอบคุณ @StepHen - คุณเอาชนะฉันได้และช่วยฉันได้
Chris H


3

C #, 84 78 ไบต์

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

ที่บันทึกไว้ 6 ไบต์ขอบคุณที่@jkelm

ลองออนไลน์!

เวอร์ชั่นเต็ม / ฟอร์แมต:

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

ทำไมคุณต้องรวมusing System.Linqจำนวนไบต์หากusing System.Collections.Genericได้รับการยกเว้น ฉันทามติกันusingบ้างไหมว่าข้อใดนับได้บ้าง?

@DaveParsons using System.Linq;เป็นสิ่งจำเป็นสำหรับรหัส Linq ในคำตอบของฉัน อย่างไรก็ตามIEnumerbale<char>ไม่ใช่ส่วนหนึ่งของคำตอบและเป็นส่วนหนึ่งของรหัสที่จำเป็นต้องusing System.Collections.Generic;รวบรวม
TheLethalCoder

มีเหตุผล; ขอบคุณสำหรับการชี้แจง

คุณสามารถบันทึกไม่กี่ไบต์โดยการตรวจสอบตัวพิมพ์ใหญ่โดยใช้ตัวอักษรเป็น ints c> 64 & c <91 คุณควรสุทธิ 6 ไบต์
jkelm

@jkelm Nice :) ฉันมักจะลืมเกี่ยวกับเคล็ดลับนั้น!
TheLethalCoder

3

Julia 0.6.0 (57 ไบต์)

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

คำอธิบาย: นี่คือรหัสสำหรับกอล์ฟครั้งแรกของฉัน ตรงไปตรงมาสวย แยกคำที่พิมพ์ 1 ตัวอักษรตัวแรกของแต่ละ

อาจเป็นเรื่องง่ายที่จะทำได้ดีขึ้นโดยใช้ regex แต่ฉันใหม่นี้


1
ยินดีต้อนรับสู่ PPCG! ฉันออกจากการโหวตตอนนี้ฉันจะโหวตในภายหลัง
Stephen

2
@ ขั้นตอนที่ฉันได้รับความคุ้มครอง : P
DJMcMayhem


2

C # (. NET Core) , 108 ไบต์

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

ลองออนไลน์!


ยังไม่ได้ตรวจสอบ แต่การเปลี่ยนifเป็นแบบไตรภาคอาจช่วยให้คุณประหยัดไบต์ เริ่มต้นนี้ที่ดัชนี2แทน1เพียงแค่เปลี่ยนint i=1เพื่อint i=0ที่จะแก้ไขได้ นอกจากนั้นฉันไม่คิดว่าจะมีอะไรให้คุณทำที่นี่อีกมากมาย
TheLethalCoder

Ternary จะไม่ช่วยที่นี่เพราะมันจะเป็นจำนวนไบต์เดียวกันกับคำสั่ง if อย่างไรก็ตามคุณถูกต้องแล้วว่าฉันต้องเปลี่ยนค่า i เริ่มต้น
jkelm

ฉันไม่แน่ใจทั้งหมด แต่พวกเขามักจะสั้นกว่าดังนั้นมันจึงคุ้มค่ากับการตรวจสอบเสมอ
TheLethalCoder

2

เจลลี่ ,  11  10ไบต์

-1 ไบต์ด้วยErik the Outgolfer ( แยกที่ช่องว่าง> _ <)

⁾- yḲḢ€fØA

ลิงก์ monadic ที่รับและส่งคืนรายการอักขระ
ในฐานะที่เป็นโปรแกรมเต็มรูปแบบยอมรับสตริงและพิมพ์ผลลัพธ์

ลองออนไลน์! หรือดูชุดทดสอบชุดทดสอบ

อย่างไร?

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

อืมมทำไมไม่ใช้แทนṣ⁶?
Erik the Outgolfer

เฮ้เพราะฉันลืมไปแล้ว ขอบคุณ!
Jonathan Allan

2

Perl 5 , 25 ไบต์

รหัส 24 ไบต์ + 1 สำหรับ -nสำหรับ

น่ารำคาญที่grep -Pรองรับความยาวที่ผันแปรได้ แต่ Perl ไม่ได้ :(

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

-1 ไบต์ขอบคุณ @Dada !

ลองออนไลน์! - รวมถึง-lเรียกใช้การทดสอบทั้งหมดในครั้งเดียว


คุณสามารถทำได้ดีกว่านี้มาก: ลองออนไลน์! ;-)
Dada

@Dada Hah! แน่นอน ... ฉันออก ATM แต่ฉันจะอัปเดตเมื่อฉันกลับมา ขอบคุณ! ฉันค่อนข้างผิดหวังที่ฉันไม่สามารถรับs///หรือ$_=ปฏิเสธprint...
Dom Hastings

ใช่ฉันกำลังมองหาคนเดียวที่s///จะแก้ปัญหานี้ แต่ก็ไม่ชัดเจน ... ฉันอยู่ที่ทำงานบางทีฉันจะลองอีกครั้งในภายหลัง!
Dada


2

Brachylog , 25 23 22 ไบต์

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

ลองออนไลน์!

(-2 ไบต์ขอบคุณ @Faleize)

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

คุณสามารถใช้แทน" "การบันทึกสองไบต์
Fatalize


2

Swift 5 , 110 bytes

-5 ขอบคุณCœur

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

คำอธิบายโดยละเอียด

  • import Foundation- นำเข้าโมดูลFoundationที่จำเป็นสำหรับzip()ชิ้นส่วนหลักของรหัสนี้

  • func f(s:[String]){...}- สร้างฟังก์ชั่นที่มีพารามิเตอร์sนั่นคือรายการของ Strings ที่แสดงถึงตัวละครของอินพุต

  • for i in zip(s,[" "]+s){...}- วนซ้ำโดยiผ่าน zip ของอินพุตและอินพุตพร้อมช่องว่างที่เพิ่มในตอนเริ่มต้นซึ่งก็คือประโยชน์มากสำหรับการรับอักขระก่อนหน้าในสตริง

  • if - ตรวจสอบว่า:

    • i.0==i.0.uppercased() - ตัวละครปัจจุบันเป็นตัวพิมพ์ใหญ่

    • &&"- ".contains(i.1) - และหากตัวอักษรก่อนหน้าเป็นช่องว่างหรือเส้นประ

  • หากตรงตามเงื่อนไขข้างต้นแล้ว:

    • print(i.0) - ตัวละครถูกพิมพ์เพราะมันเป็นส่วนหนึ่งของตัวย่อ

-5 กับแทนimport UIKit import Foundation
Cœur



1

Python 3 , 73 70 ไบต์

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

ลองออนไลน์!


คำอธิบาย

  • lambda n:- nสร้างที่ไม่ระบุชื่อแลมบ์ดาฟังก์ชั่นที่มีพารามิเตอร์สตริง

  • n[x]- ได้รับตัวละครของที่ดัชนีnx

  • for x in range(len(n))- iterates จาก0ความยาวของการตั้งชื่อตัวแปรnx

  • if - ตรวจสอบ:

    • '@'<n[x]<'[' - ถ้าตัวละครเป็นตัวพิมพ์ใหญ่

    • and(' '+n)[x]in' -'- และถ้ามันจะนำหน้าด้วยช่องว่างหรือเส้นประใน String nที่เกิดขึ้นจากพื้นที่และ


2
มันแย่ที่ฉันอ่านมันi supperและฉันไม่รู้ว่าทำไม?
TheLethalCoder

@TheLethalCoder มัน.isupper()ฉันไม่รู้ว่าคุณอ่านอะไร: p
Mr. Xcoder





1

Bash (grep), 29 28 ไบต์

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

พอร์ตของคำตอบของหลามของฉัน แต่เนื่องจากpgrepรองรับความยาวผันแปรของการค้นหามันสั้นลงอย่างเห็นได้ชัด ติดกรณีทดสอบในไฟล์ที่เรียกว่าaเอาต์พุตคือ 1 อักขระต่อบรรทัด

-1 ต้องขอบคุณนีล


^| |-อาจเป็นการทดสอบที่สั้นกว่านี้หรือ
Neil

@ Neil ที่ใช้งานได้ที่นี่ขอบคุณ พลาดไปเพราะมันไม่สามารถใช้งานได้ใน Python
Chris H

1

RProgN 2 , 18 ไบต์

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

อธิบาย

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

ลองออนไลน์!


1

PHP, 62 ไบต์

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

เรียกใช้เป็นไพพ์ด้วย-nRหรือลองออนไลน์ลองออนไลน์

โซลูชั่นอื่น ๆ :

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 ไบต์

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

เอาต์พุตทำผ่านพารามิเตอร์


มันจะเป็นไปได้ที่จะสมบูรณ์ลบ#include<string>และถือว่าอาร์กิวเมนต์sเป็นstd::string?
Zacharý

1

Lua , 79 75 ไบต์

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

ลองมัน!

ฉันติดพิมพ์ () ก่อนที่จะสิ้นสุดขั้นสุดท้ายในรุ่นทดลองใช้เพราะมิฉะนั้นมันจะเลอะ โปรแกรมนี้เป็นไปตามข้อกำหนดของ I / O และการจับคู่อย่างสมบูรณ์แบบ แต่ไม่มีบรรทัดใหม่ที่พิเศษมันยากที่จะอ่าน

อินพุตถูกกำหนดในรูปแบบของตารางจำนวน: สตริงจำนวนที่เพิ่มขึ้น 1 แต่ละครั้งและเริ่มต้นที่ 1

คำอธิบาย:

สำหรับลูปผ่าน gmatch ของแต่ละสตริงอินพุต การค้นหา gmatch มีดังนี้:

[% - | ] - กลุ่มค้นหา a - หรือเว้นวรรค

% u - ค้นหาอักขระตัวพิมพ์ใหญ่

จากนั้นสำหรับการแข่งขันแต่ละครั้งมันจะพิมพ์ออกมาลบด้วยเครื่องหมายขีดกลางหรือเว้นวรรค

แก้ไข: Golfed 4 bytes โดยการลบการประกาศ 'a' และเพิ่มช่องว่างให้กับอินพุตภายในวง for in รวมถึงการเปลี่ยนอินพุตย่อยให้เหลือเพียง 2 แทนที่จะเป็น 2,2 (ซึ่งให้ผลลัพธ์ที่เทียบเท่า)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.