เหตุการณ์ที่เกิดขึ้นสูงสุดหรือต่ำสุด?


13

ท้าทาย:

ปัจจัยการผลิต:

  • สตริงที่มี ASCII ที่พิมพ์ได้ (ไม่รวมช่องว่างแท็บและบรรทัดใหม่)
  • บูลีน

เอาท์พุท:

ส่วนของสตริงจะแบ่งออกเป็นสี่กลุ่ม:

  • อักษรตัวพิมพ์เล็ก
  • ตัวอักษรตัวพิมพ์ใหญ่
  • ตัวเลข
  • อื่น ๆ

ขึ้นอยู่กับบูลีนเราจะแสดงเหตุการณ์ที่เกิดขึ้นสูงสุดหนึ่งกลุ่ม (หรือหลายกลุ่ม) ของกลุ่มสี่กลุ่มนี้หรือกลุ่มต่ำสุดแทนที่กลุ่มอื่นด้วยช่องว่าง

ตัวอย่างเช่น:

ข้อมูลเข้า: "Just_A_Test!"
ประกอบด้วย:
- 3 ตัวอักษรตัวพิมพ์ใหญ่: JAT
- 6 ตัวอักษรตัวพิมพ์เล็ก: ustest
- 0 หลัก
- 3 อื่น ๆ :__!

เหล่านี้จะเป็นผลลัพธ์สำหรับtrueหรือfalse:

true:   " ust    est "

// digits have the lowest occurrence (none), so everything is replaced with a space
false:  "            "

(หมายเหตุ: คุณได้รับอนุญาตให้ละเว้นช่องว่างต่อท้ายดังนั้นเอาต์พุตสามารถเป็นได้" ust est"และ""ตามลำดับ)

กฏท้าทาย:

  • อินพุตจะไม่ว่างเปล่าหรือมีช่องว่างและจะประกอบด้วย ASCII ที่พิมพ์ได้ในช่วง33-126หรือ'!'ผ่าน'~'เท่านั้น
  • คุณได้รับอนุญาตให้รับอินพุตและ / หรือเอาท์พุทเป็นอักขระอาเรย์หรือรายการหากคุณต้องการ
  • อนุญาตให้ใช้ค่าบูลีนที่สอดคล้องกันและแตกต่างกันสองค่า: true/ false; 1/ 0; 'H'/ 'L'; "highest"/ "lowest"; ฯลฯ โปรดทราบว่าค่าที่แตกต่างเหล่านี้ควรใช้ (บ้าง) เป็นบูลีน! จึงไม่ได้รับอนุญาตให้ใส่สองโปรแกรมที่สมบูรณ์หนึ่งที่ช่วยให้ผลที่ถูกต้องสำหรับการtrueและอื่น ๆ สำหรับและจากนั้นมีรหัสที่แท้จริงของคุณจะเป็นแค่false ช่องโหว่เริ่มต้นใหม่ที่เกี่ยวข้องที่ฉันได้เพิ่มแม้ว่าจะยังคงสามารถใช้ finetuning จำนวนมากเกี่ยวกับคำจำกัดความ ..<run input with parameter>
  • หากการเกิดขึ้นของสองกลุ่มหรือมากกว่านั้นเหมือนกันเราจะเอาท์พุทที่เกิดขึ้นทั้งหมด
  • ช่องว่างต่อท้ายที่จำเป็นเป็นตัวเลือกและบรรทัดใหม่ต่อท้ายเป็นทางเลือกเช่นกัน จำเป็นต้องมีการเว้นวรรคนำหน้า และไม่อนุญาตให้เว้นวรรคนำหน้าหรือบรรทัดใหม่ใด ๆ

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
    อย่าปล่อยให้ภาษารหัสกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานจะใช้สำหรับคำตอบของคุณดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชัน / เมธอดพร้อมพารามิเตอร์ที่เหมาะสมโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงค์พร้อมทดสอบรหัสของคุณ
  • นอกจากนี้โปรดเพิ่มคำอธิบายหากจำเป็น

กรณีทดสอบ:

Inputs:                              Output:

"Just_A_Test!", true                 " ust    est "     (or " ust    est")
"Just_A_Test!", false                "            "     (or "")
"Aa1!Bb2@Cc3#Dd4$", either           "Aa1!Bb2@Cc3#Dd4$"
"H@$h!n9_!$_fun?", true              " @$ !  _!$_   ?"
"H@$h!n9_!$_fun?", false             "H     9        "  (or "H     9")
"A", true                            "A"
"A", false                           " "                (or "")
"H.ngm.n", true                      "  ngm n"
"H.ngm.n", false                     "       "          (or "")
"H.ngm4n", false                     "H.   4 "          (or "H.   4")

เป็นที่ยอมรับได้หรือไม่ที่จะส่งออกมากที่สุด / น้อยที่สุดเป็นรายการแยกกัน? ตัวอย่างเช่นสำหรับกรณีทดสอบ "hashing is fun" สามารถส่งออก"H "และ" 9 "(พร้อมช่องว่างที่เหมาะสม) แทนได้"H 9"หรือไม่
AdmBorkBork

@AdmBorkBork ฉันไม่เข้าใจความหมายของคุณ ทั้งสองHและ9เป็นส่วนหนึ่งของ "น้อยที่สุด"
Erik the Outgolfer

ค่าอินพุตบูลีนสามารถเป็น"max"/ "min"ซึ่งถูกใช้Math[b]เพื่ออ้างถึงMath.maxหรือMath.min?
Justin Mariner

@JustinMariner คุณรู้ .. ฉันเปลี่ยนใจฉันขอโทษเกี่ยวกับเรื่องนั้น ฉันเดาว่าสำหรับ JS? ฉันคิดว่าภาษาการเขียนโปรแกรมจำนวนมากสามารถใช้ประโยชน์เช่นนี้ได้ดังนั้นควรเปลี่ยนคำตอบที่มีอยู่มากเกินไป ขอโทษทีคุณจะต้องรักษาb?"max":"min"คำตอบของคุณไว้ให้ดี.. ฉันเดาว่าบางทีฉันควรใช้ความจริง / ความเท็จตามตัวอักษรในครั้งต่อไป ..
Kevin Cruijssen

คำตอบ:


3

Husk , 27 26 24 22 bytes

-2 ไบต์ขอบคุณZgarb

-2 ไบต์ขอบคุณลีโอ

ใช้เวลา' 'เป็นFalseและ'a'เป็นTrue(ในแกลบ, ช่องว่างใน Fasly และตัวละครอื่น ๆ ทั้งหมดเป็นความจริง)

Fż▲→ġ#¬Ö#≡⁰Ṫḟë½D±o¬□m;

ลองออนไลน์!

มันทำงานยังไง?

Fż▲→ġ#¬Ö#≡⁰Ṫḟë½D±o¬□m;   Function, takes a character c and a string S as arguments
                    m;   Wrap each character in S into it's own string
             ë           List of four functions returning booleans:
              ½D±o¬      Lower case?,Upper case?,Digit?,Not alphanumeric?
           Ṫḟ            Outer product with find†
       Ö#≡⁰              Sort on how many characters have the same Truthyness as c
    ġ#¬                  Group strings with equal numbers of spaces
   →                     Take the last group
Fż▲                      Squash it all into one list

เป็นฟังก์ชั่นที่ใช้เพรดิเคตpและรายการLและส่งคืนองค์ประกอบแรกของการLตอบสนองpนั้น หากไม่มีองค์ประกอบใดตรงตามpอาร์กิวเมนต์เริ่มต้นจะถูกส่งกลับ ในกรณี' 'นี้ โดยใช้เป็นสตริงที่ตัวละครตัวหนึ่งที่เราจะได้เป็นหลักบอกว่าif p c then c else ' '

เป็นฟังก์ชั่นที่รับฟังก์ชั่นfและสองรายการL1, L2. ก็จะส่งกลับตารางของfการประยุกต์ใช้มากกว่าทุกคู่และL1 L2ในกรณีนี้fคือ, L1คือรายการ 4 ฟังก์ชั่นของเราและL2เป็นรายการของสตริงตัวละครหนึ่ง

หลังจากที่เรามีรายการของสตริงที่แต่ละสายเป็นผลของการแทนที่ตัวอักษรที่ไม่ตอบสนองหนึ่งในกฎที่มีความṪḟ' '

หมายเหตุ:ใน Husk เวอร์ชั่นใหม่กว่าġ#¬Ö#≡⁰สามารถแทนที่ได้ด้วยk#≡⁰การประหยัด 3 ไบต์!


จากความอยากรู้: ทำไม' 'และ'a'? บางทีฉันเข้าใจดีขึ้นเมื่อเพิ่มคำอธิบายเพราะฉันอ่าน Husk ไม่ได้ ;)
Kevin Cruijssen

ดี! นี่คือ24 ไบต์ใช้
Zgarb

@Zgarb ขอบคุณ! ฉันไม่เข้าใจจริงๆว่าMmmตัวเองกำลังทำอะไรอยู่ :)
H.PWiz

น่าเสียดายที่นี่ไม่ได้ช่วยในการตีกอล์ฟ แต่S`?' อาจจะง่ายกว่าในขณะที่?IK'
Leo

ฉันมักจะหลีกเลี่ยงการใช้Iบางครั้งก็ทำให้ล่ามใช้ตลอดไป ดูเหมือนว่าสิ้นเปลือง
H.PWiz

7

เยลลี่ 31 ไบต์

ØṖḟØBṭØBUs26¤f€³Lİ⁴¡$ÐṀFf
¹⁶Ç?€

ลองออนไลน์!

ค่าบูลีนคือ2และ1(หรือคู่บวก / คู่คี่อื่น ๆ ) ซึ่งเป็นตัวแทนTrueและFalseตามลำดับ ฉันจะพยายามเพิ่มคำอธิบายหลังจากตีกอล์ฟเพิ่มเติม

ขอบคุณcaird coinheringaahingสำหรับการบันทึก 2 ไบต์และLynnสำหรับการบันทึก 4 ไบต์! ขอบคุณหนึ่งในเทคนิคของ Erikซึ่งเป็นแรงบันดาลใจให้ฉันประหยัด 4 ไบต์!

มันทำงานอย่างไร

โปรดทราบว่านี่เป็นคำอธิบายสำหรับรุ่น 35 ไบต์ อันใหม่ทำแบบเดียวกัน (แต่ลินน์เล็กน้อยโดยลินน์) ดังนั้นฉันจะไม่เปลี่ยนแปลง

ØBUs26f€³µ³ḟØBW,µẎLİ⁴¡$ÐṀF - Niladic helper link.
ØB                         - String of base digits: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
                             abcdefghijklmnopqrstuvwxyz'. 
  U                        - Reverse.
   s26                     - Chop into sublists of length 26, preserving shorter
                             trailing substrings.
      f€³                  - For each, keep the common characters with the input.
            ØB             - Base digits.
          ³ḟ               - Get the signs in the input. Filter the characters of the
                             input that aren't alphanumeric.
              W,µẎ         - Concatenate (wrap, two element list, tighten).
                       ÐṀ  - Keep the elements with maximal link value.
                  L        - Length.
                    ⁴¡     - Do N times, where N is the second input.
                   İ       - Inverse. Computes 1 ÷ Length. 2 maps to the length itself,
                             because 1 ÷ (1 ÷ Length) = length; 1 yields
                             (1 ÷ Length), swapping the maximal numbers with minimal ones.
                         F - Flatten.

¹⁶e¢$?€ - Main link.
      € - For each character.
   e¢?  - If it is contained by the last link (called niladically), then:
¹       - Identity, the character itself, else:
 ⁶      - A space.


@cairdcoinheringaahing ขอบคุณ! :) ฉันอยากเล่นกอล์ฟตั้งแต่ตอนที่โพสต์คำตอบ แต่ฉันคิดไม่ออกว่าทำไมมันถึงไม่ได้ผล ... ฉันมีสิ่งที่ไม่คุ้นเคยµD:
Mr. Xcoder

31 ไบต์ : สร้างการเรียนเป็นØṖḟØBṭØBUs26¤และจากนั้นสมาชิกทดสอบfและแทนÇ e¢$
Lynn


5

R , 193 186 179 158 bytes

-7 ไบต์ขอบคุณ NofP และคำแนะนำของเขา cbind

ใช้ -6 ไบต์outer, -1 ไบต์สลับ[^a-zA-Z0-9]กับ[[:punct:]]

-21 ไบต์ขอบคุณ MickyT สำหรับการชี้ให้เห็นรายการของตัวละครที่ได้รับอนุญาต

function(S,B){y=outer(c("[a-z]","[A-Z]","\\d","[[:punct:]]"),S,Vectorize(grepl))
S[!colSums(y[(s=rowSums(y))=="if"(B,max,min)(s),,drop=F])]=" "
cat(S,sep='')}

ตรวจสอบกรณีทดสอบทั้งหมด

ใช้ความ1/Tจริง ( max) และ0/Ffalsey ( min) และรับSเป็นรายการของอักขระเดี่ยว

ลองออนไลน์!

ในฉบับดั้งเดิมของฉัน (พร้อมคำแนะนำของ NofP) เมทริกซ์yจะถูกสร้างขึ้นโดยการประเมินผลgrepl(regex, S)แต่ละรายการregexจากนั้นเชื่อมโยงมันเข้าด้วยกันเป็นคอลัมน์ของเมทริกซ์ ส่งผลให้มีการโทรติดต่อหลายครั้งgreplแต่ตามที่Sได้รับการแก้ไขดูเหมือนว่ามีสิ่งอื่นที่จำเป็นต้องทำ ตามที่ฉันสังเกต:

อาจมีวิธีการที่สั้นกว่านั้น mapply, ตัวอย่างเช่น:

y=mapply(grepl,c("[a-z]","[A-Z]","\\d","[^a-zA-Z0-9]"),list(S))

โชคไม่ดีที่นี้จะไม่ลดความซับซ้อนเป็นเมทริกซ์ในตัวอย่าง 1 "A"ตัวของ

ฉันใช้outerมากกว่าmapplyซึ่งมักจะส่งกลับอาร์เรย์ (เมทริกซ์ในกรณีนี้) และถูกบังคับให้Vectorize greplซึ่งเป็นเพียงmapplyเสื้อคลุมรอบ ๆ

ฉันยังค้นพบกลุ่มอักขระที่กำหนดไว้ล่วงหน้า[:punct:]ซึ่งตรงกับเครื่องหมายวรรคตอน (ไม่ใช่ช่องว่างไม่ใช่ตัวอักษรและตัวเลข)


1
หากคุณแทนที่เมทริกซ์ด้วย cbind คุณสามารถลดได้ถึง 186 ไบต์: y = cbind (g ("[az]", S), g) ("[AZ]", S), g ("\\ d", S), g ("[^ a-zA-Z0-9]", S))
NofP

@NofP โอ้เยี่ยมมาก ๆ นอกจากนี้คุณสามารถล้อมรอบด้วยรหัส backticks ( `) like thisที่จะมีมันแสดง :)
Giuseppe

กฎระบุว่าคุณสามารถใช้อาร์เรย์อักขระหรือรายการเป็นอินพุตดังนั้นคุณอาจลบS=el(strsplit(G,""))
MickyT

@ มิกกี้อาฉันมองข้ามไปแล้วขอบคุณ
Giuseppe

4

Husk , 31 29 28 bytes

SMS?' `ṁ§foSM≠?▲▼⁰M#Kë½D±o¬□

ใช้ 0 สำหรับค่าน้อยที่สุดและ 1 สำหรับจำนวนอักขระสูงสุด ลองออนไลน์!

คำอธิบาย

รายการฟังก์ชั่นที่ยอดเยี่ยม

SMS?' `ṁ§foSM≠?▲▼⁰M#Kë½D±o¬□  Inputs are bit B and string S.
                     ë        Make a list L of the four functions
                      ½       is-lowercase-letter,
                       D      is-uppercase-letter,
                        ±     is-digit, and
                         o¬□  not is-alphanumeric.
                  M#          For each of them, take number of matches in S,
              ?▲▼⁰            take maximum or minimum depending on B,
          oSM≠                and mark those entries that are not equal to it.
        §f          K         Remove from L the functions that correspond to marked entries, call the result L2.
                              These functions test whether a character should be replaced by a space.
SM                            Do this for each character C in S:
      `ṁ                      Apply each function in L2 to C and sum the results.
  S?'                         If the result is positive, return space, otherwise return C.

4

Python 2 , 140 ไบต์

g=lambda x:x.isalnum()-~(x>'Z')*x.isalpha()
def f(s,m):k=map(g,s).count;print''.join([' ',c][k(g(c))==sorted(map(k,range(4)))[m]]for c in s)

ลองออนไลน์!

Jonathan Frech บันทึกไบต์ ขอบคุณ!

สูงสุดคือต่ำสุดคือm=-1m=0


1
ฉันคิดว่าคุณสามารถบันทึกไบต์โดยการแทนที่ด้วย+x.isalpha()*-~(x>'Z') -~(x>'Z')*x.isalpha()
Jonathan Frech


3

Java (OpenJDK 8) , 448 439 432 362 361 354 352 348 343 320 ไบต์

s->b->{int w[]=new int[4],m=0,n=-1>>>1,l;s.chars().forEach(c->{if(c>96&c<123)w[0]++;else if(c>64&c<91)w[1]++;else if(c>47&c<58)w[2]++;else++w[3];});for(int W:w){m=W>m?W:m;n=W<n?W:n;}l=m-n;m=b?m:n;return l<1?s:s.replaceAll("["+(w[0]!=m?"a-z":"")+(w[1]!=m?"A-Z":"")+(w[2]!=m?"\\d]":"]")+(w[3]!=m?"|[^a-zA-Z0-9]":"")," ");}

ลองออนไลน์!



คุณสามารถลบ+in \\|+$สำหรับ -1 ไบต์เพิ่มเติม
Kevin Cruijssen

String r=(w[0]!=m?"[a-z]|":"")+(w[1]!=m?"[A-Z]|":"")+(w[2]!=m?"[0-9]|":"")+(w[3]!=m?"[^a-zA-Z0-9]|":"");return r.isEmpty()?s:s.replaceAll(r.replaceAll(".$","")," ");}คุณสามารถบันทึกสามไบต์มากขึ้นโดยการเปลี่ยนส่วนสุดท้ายที่จะ
Kevin Cruijssen

โอ้และn=s.length()สามารถn=-1>>>1เพิ่ม -4 ได้
Kevin Cruijssen

โอ้อีกหนึ่งสิ่งเล็ก ๆ สำหรับเล่นกอล์ฟ: [0-9]->\\d
Kevin Cruijssen

3

Ruby , 118 116 ไบต์

ใช้เวลา0(ต่ำสุด) หรือ-1(สูงสุด) สำหรับอาร์กิวเมนต์ที่สอง

-2 ไบต์ขอบคุณ Lynn

->s,t{s.gsub(/./){|c|[/\d/,/[a-z]/,/[A-Z]/,/[^\da-z]/i].group_by{|x|s.scan(x).size}.sort[t][1].any?{|x|x=~c}?c:" "}}

ลองออนไลน์!

Ungolfed

->s,t{
  s.gsub(/./) {|c|
    [ /\d/,
      /[a-z]/,
      /[A-Z]/,
      /[^\da-z]/i
    ]
    .group_by {|x| s.scan(x).size }
    .sort[t][1]
    .any? {|x| x =~ c } ? c : " "
  }
}

คำตอบที่ยอดเยี่ยมมาก! คุณสามารถใช้-1เป็นค่า“สูงสุด” และแทนที่โดยminmax[t] sort[t]
ลินน์

3

Python 2, 190 183 174 173 ไบต์

ขอบคุณ Jonathan Frech ที่ย่อให้สั้นลง

from re import*
def f(i,c):
 q='[a-z]','[A-Z]','\d','[\W_]';l=[len(set(finditer(p,i)))for p in q]
 for j,k in enumerate(l):
	if k-eval(c):i=compile(q[j]).sub(' ',i)
 print i

สิ่งนี้ใช้สตริง'max(l)'และ'min(l)'เป็นจริงและเท็จ (ฉันไม่คิดว่านี่เป็นการฝ่าฝืนกฎ ... ?) นี่ยาวกว่าคำตอบของงูหลามอีกสองตัว แต่แตกต่างกันดังนั้นฉันคิดว่าฉันโพสต์ไว้ ฉันไม่ใช่นักกอล์ฟที่ยอดเยี่ยมดังนั้นฉันจึงคาดเดาว่าสิ่งนี้จะได้รับการปรับปรุงให้ดียิ่งขึ้นไปอีก แต่ทุกสิ่งที่ฉันลองใช้ไม่ได้ผล

ลองออนไลน์!


สวัสดีและยินดีต้อนรับสู่เว็บไซต์! เมื่อฉันพยายามเรียกใช้สิ่งนี้ฉันได้รับข้อผิดพลาดและฉันไม่แน่ใจว่าทำไม เหตุผลหนึ่งอาจเป็นsum(1for m...ได้sum(1 for m...แต่ฉันคิดว่ามีปัญหาอื่นด้วย คุณสามารถให้ลิงค์ไปยังล่ามออนไลน์ (เช่นtio ) เพื่อแสดงให้เห็นว่าคุณโทรมาอย่างไรและเพื่อแสดงว่ามันไม่ได้ผิดพลาด?
James

@DJMcMayhem ฉันเพิ่งเพิ่มลิงค์ขอบคุณที่ให้ลิงค์ฉันไม่แน่ใจว่าจะทำอย่างไร ฉันไม่ได้รับข้อผิดพลาดเมื่อเรียกใช้ตรงนั้น
dylnan

อาฉันไม่สามารถบอกได้ว่าคุณกำลังป้อนmax(l)และmin(l)เป็นสตริงนั่นคือเหตุผลที่ฉันได้รับข้อผิดพลาด ขอบคุณที่ล้างข้อมูล! แม้ว่าตอนนี้จะอยู่ที่ขอบของการละเมิดกฎ # 3 "โปรดทราบว่าค่าที่แตกต่างเหล่านี้ควรใช้ (ค่อนข้าง) เป็นบูลีน" แต่แน่นอนว่าเป็นพื้นที่สีเทาเล็กน้อย
James

BTW ต่อไปนี้เป็นเคล็ดลับ TIO: ถ้าคุณใส่ฟังก์ชั่นการโทรในฟิลด์ส่วนท้ายพวกเขาจะไม่ถูกนับเข้าสู่การนับไบต์ของคุณดังนั้นคุณสามารถดูได้อย่างง่ายดายว่าคำตอบของคุณนานแค่ไหน: ลองออนไลน์!
James

@DJMcMayhem Ah ขอบคุณ ฉันยอมรับว่ามันเป็นพื้นที่สีเทา ฉันสามารถใช้ 'max' และ 'min' เป็นเท็จจริงแล้วทำ eval (c + '(l)') ซึ่งเพิ่ม 6 ไบต์และดูเหมือนยอมรับได้มากขึ้น แต่จนกว่า OP ไม่ตอบคำตอบของฉันฉันคิดว่ามันโอเค
dylnan

2

JavaScript (ES6), 151 149 ไบต์

g=
(s,f,a=[/\d/,/[A-Z]/,/[a-z]/,/[_\W]/],b=a.map(r=>s.split(r).length))=>s.replace(/./g,c=>b[a.findIndex(r=>r.test(c))]-Math[f?"max":"min"](...b)?' ':c)
<input id=s oninput=o.textContent=g(s.value,f.checked)><input id=f type=checkbox onclick=o.textContent=g(s.value,f.checked)><pre id=o>

น่าเศร้ากฎอาจไม่อนุญาตให้ฉันผ่านMath.maxหรือMath.minเป็นธง แก้ไข: บันทึก 2 ไบต์ขอบคุณ @JustinMariner


1

เยลลี่ , 37 ไบต์

ØWṖs26µẎØṖḟW⁸;
¢f@³L$ÐṂFe@Ѐ³¬¹⁴?a³o⁶

ลองออนไลน์!

-6 ไบต์ "ยืม" จากโพสต์ของ Erik: D


ฮ่า ๆ รักษาช่องว่างเป็นหลักครึ่งหนึ่งของโปรแกรม: D
นาย Xcoder

คุณสามารถเพิ่มคำอธิบายหรือคุณยังคงเล่นกอล์ฟอยู่ก่อน?
Kevin Cruijssen

@KevinCruijssen การเล่นกอล์ฟครั้งแรก: D
HyperNeutrino

1

Java (OpenJDK 8) , 307 + 34 306 + 27 295 ไบต์

"น่าสนใจ" ของฉันจัดการกับความท้าทาย

ขอบคุณKevin Cruijssenสำหรับการตัดไบต์การนำเข้าที่ลบการนำเข้าทั้งหมด!

s->b->{String t=s.replaceAll("\\d","2").replaceAll("[a-z]","0").replaceAll("[A-Z]","1").replaceAll("\\D","3"),v="";int a[]={0,0,0,0},i=0,z=0,y=-1>>>1;t.chars().forEach(j->{a[j%4]++;});for(int x:a){z=x>z?x:z;y=x<y?x:y;}for(;i<s.length();i++)v+=a[t.charAt(i)%4]!=(b?z:y)?" ":s.charAt(i);return v;}

ลองออนไลน์!

คำอธิบาย:

String t=s.replaceAll("\\d","2")
          .replaceAll("[a-z]","0")
          .replaceAll("[A-Z]","1")
          .replaceAll("\\D","3")

ก่อนแทนที่แต่ละกลุ่มด้วยจำนวนเต็มระหว่าง 0 และ 3 โดยใช้ regex ง่าย ๆ และเก็บไว้ใน String ใหม่

int a[]={0,0,0,0},m,i=0,z=0,y=-1>>>1;

เริ่มต้นอาร์เรย์ของจำนวนเต็มรวมถึงคู่ของจำนวนเต็มอื่น ๆ ที่จะใช้ในภายหลัง ตั้งค่าyตัวแปรเป็นขนาดสูงสุด int โดยใช้การเลื่อนบิตขวาที่ไม่ได้ลงชื่อ

t.chars().forEach(j->{a[j%4]++;});

สำหรับอักขระแต่ละตัวในสตริงที่ปรับเปลี่ยนค่านี้ใช้ค่า ASCII โมดูโล 4 เพื่อคำนวณดัชนีของอาร์เรย์ดังกล่าวเพื่อเพิ่มค่า

for(int x:a){
    z=x>z?x:z;
    y=x<y?x:y;
}

สิ่งนี้จะวนซ้ำตามจำนวนของแต่ละกลุ่มที่เก็บไว้ในอาร์เรย์และคำนวณค่าต่ำสุด ( y) และค่าสูงสุด ( z)

for(;i<s.length();i++)
    v+=a[t.charAt(i)%4]!=(b?z:y)?" ":s.charAt(i);

วนซ้ำทุกตัวละครใน String อีกครั้งตรวจสอบว่ากลุ่มของกลุ่มตัวละครนั้นมีค่าเท่ากับ min / max (ใช้เคล็ดลับ modulo ที่กล่าวถึงก่อนหน้านี้) หากไม่เท่ากันจะมีการเพิ่มช่องว่างในสตริงใหม่ในตำแหน่งอักขระมิฉะนั้นจะมีการเพิ่มอักขระดั้งเดิม

return v;

ในที่สุดก็กลับสตริงใหม่!


1
คำตอบที่ดี +1 จากฉัน! สองสิ่งเล็ก ๆ สำหรับเล่นกอล์ฟ: import java.util.stream.IntStream;สามารถเป็นได้import java.util.stream.*;และ,iสามารถเป็นได้,i=0หลังจากที่คุณสามารถลบออกi=0จาก for-loop Oh, และสามารถ(s,b)-> s->b->
Kevin Cruijssen

@KevinCruijssen ขอบคุณ! ฉันไม่ทราบว่าคุณสามารถเชื่อมโยงลูกแกะได้
ลุคสตีเวนส์

เรียกว่าแกงกะหรี่ :) java.util.function.Function<String, java.util.function.Function<Boolean, String>> g = s->b->{...};คุณสามารถทำมันได้เช่นนี้
Kevin Cruijssen

1
Oh, และอีกสิ่งหนึ่งที่จะกอล์ฟ: IntStream z=IntStream.of(a);m=(b?z.max():z.min()).getAsInt();สามารถl=s.length(),x=0,y=lและfor(int x:a){z=x>z?x:z;y=x<y?x:y;}และ(b?z:y)ดังนั้นคุณไม่จำเป็นต้องนำเข้า วางไว้ทั้งหมดเข้าด้วยกันกลายเป็น: s->b->{String t=s.replaceAll("\\d","2").replaceAll("[a-z]","0").replaceAll("[A-Z]","1").replaceAll("\\D","3"),v="";int a[]={0,0,0,0},i=0,l=s.length(),z=0,y=l;t.chars().forEach(j->{a[j%4]++;});for(int x:a){z=x>z?x:z;y=x<y?x:y;}for(;i<l;i++)v+=a[t.charAt(i)%4]!=(b?z:y)?" ":s.charAt(i);return v;}( 294 ไบต์ )
Kevin Cruijssen

1
@KevinCruijssen Oooooh คิดดี! ฉันอาจรอสักครู่ก่อนที่จะเปลี่ยนมันในกรณีที่คุณเกิดอะไรขึ้นอีก)
ลูกาสตีเวนส์

1

Bash, 229 227 212 ไบต์

LANG=C;g="A-Z a-z 0-9 !A-Za-z0-9";declare -A H
f()(((i=$2?99:-1));r=$1;for h in $g;{ t=${r//[$h]};t=${#t};(($2?t<i:t>i))&&i=$t&&H=([$h]=1);((t-i))||H[$h]=1;};for h in $g;{((${H[$h]}))||r=${r//[$h]/ };};echo "$r")

ลองออนไลน์


ฉันไม่แน่ใจว่าพื้นที่รอบวงเล็บและการทำงานของตารางบล็อกในทุบตี แต่ก็ยังดูเหมือนว่าจะทำงานโดยไม่ต้องเว้นที่ f(){((
Kevin Cruijssen

1
ใช่พื้นที่โดยทั่วไปได้รับคำสั่งยกเว้นนอกจาก(นี้ยังสามารถบันทึก 2 ไบต์โดยใช้(แทน{ประสิทธิภาพการย่อยสลายเนื่องจากการสร้าง subshell
Nahuel Fouilleul

1

PHP, 161 158 ไบต์

for([,$s,$z]=$argv;~$c=$s[$i++];)foreach([punct,upper,lower,digit]as$f)(ctype_.$f)($c)?$$i=$f:$g[$f]++;while(~$c=$s[$k++])echo$g[$$k]-($z?min:max)($g)?" ":$c;

ทำงานด้วย-nrหรือลองออนไลน์

  • วงแรก: สำหรับแต่ละตำแหน่งให้จำกลุ่มของตัวละคร
    และนับจำนวนที่เกิดขึ้นของกลุ่มที่อักขระปัจจุบันไม่ได้อยู่
    (การปฏิเสธนั้นบันทึกไว้ 3 ไบต์)
  • ขึ้นอยู่กับพารามิเตอร์ตัวที่สองเลือก min non-count สำหรับความจริงสูงสุดไม่นับ count สำหรับความผิดพลาด
  • การวนซ้ำที่สอง: ถ้า (กลุ่มของอักขระปัจจุบัน) การนับที่ไม่แตกต่าง
    จาก min / max ที่ไม่ใช่การนับแล้วพื้นที่การพิมพ์อักขระการพิมพ์อื่น

1
@KevinCruijssen ตรวจสอบให้แน่ใจว่าคุณเลือก PHP เวอร์ชันล่าสุด (7.1.0)
ติตัส

1

JavaScript (ES6), 139 ไบต์

s=>b=>s.map(c=>++a[g(c)]&&c,a=[0,0,0,0],g=c=>c>-1?0:/[a-z]/i.test(c)?c<"a"?2:1:3).map(c=>a.map(v=>v-Math[b?"max":"min"](...a))[g(c)]?" ":c)

อินพุตและเอาต์พุตเป็นอาร์เรย์ของอักขระ รับค่าบูลีนจริงสำหรับอินพุต

วิธีการที่แตกต่างจาก@ คำตอบของนีล ; เกือบจะหลีกเลี่ยงการแสดงออกปกติ แต่ฉันใช้ชุดการตรวจสอบเพื่อกำหนดหมวดหมู่ของตัวละครแต่ละตัวแทน:

  • ผลตอบแทนตัวเลขtrueสำหรับc>-1เนื่องจากไม่ใช่ตัวเลขล้มเหลวการเปรียบเทียบทางคณิตศาสตร์
  • ตัวอักษรตัวพิมพ์ใหญ่ตรงกับ regex /[a-z]/iและมี codepoints น้อยกว่า"a"
  • ตัวอักษรพิมพ์เล็กจับคู่ที่ regex แต่มี codepoints ไม่น้อยกว่า "a"
  • สัญลักษณ์ไม่ผ่านการทดสอบเหล่านั้น

กรณีทดสอบ

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