Phonemic Abugida


12

Personaggi

Chiamiamo queste consonanti IPA inglesi di questi caratteri Unicode :

bdfhjklmnprstvwzðŋɡʃʒθ

E chiamiamo queste vocali IPA inglesi di questi caratteri Unicode :

aeiouæɑɔəɛɜɪʊʌː

(Sì, ːè solo il segno vocale lungo, ma trattalo come una vocale ai fini di questa sfida.)

Infine, questi sono segni di stress primari e secondari :

ˈˌ

Si noti che ɡ( U + 0261 ) non è un g minuscolo e che l'indicatore di sollecitazione principale ˈ( U + 02C8 ) non è un apostrofo e ː( U + 02D0 ) non è un due punti.

Il tuo compito

Data una parola, impila le vocali sopra le consonanti che seguono e posiziona gli indicatori di stress sotto le consonanti che precedono. (Come suggerisce il titolo della domanda, un tale sistema di scrittura, in cui sequenze di vocali consonanti sono raggruppate insieme come un'unità, è chiamato abugida .) Dato l'input ˈbætəlʃɪp, produce l'output:

æə ɪ
btlʃp
ˈ

Una parola è garantita per essere una serie di consonanti, vocali e segni di stress, come definito sopra. Non ci saranno mai segni di stress consecutivi e saranno sempre posizionati all'inizio della parola e / o prima di una consonante.

Casi test

Potrebbero esserci vocali consecutive. Ad esempio, kənˌɡrætjʊˈleɪʃəndiventa

      ɪ
ə  æ ʊeə
knɡrtjlʃn
  ˌ   ˈ

Se una parola inizia con una vocale, stampala sulla "base" con le consonanti: əˈpiːldiventa

 ː
 i
əpl
 ˈ

Un caso di test con una vocale iniziale stressata: ˈælbəˌtrɔsdiventa

  ə ɔ 
ælbtrs
ˈ  ˌ  

Una lunga parola: ˌsuːpərˌkaləˌfrædʒəˌlɪstɪˌkɛkspiːæləˈdoʊʃəsdiventa

               æ    
ː              ː ʊ  
uə aə æ əɪ ɪɛ  iəoə 
sprklfrdʒlstkkspldʃs
ˌ  ˌ ˌ   ˌ  ˌ    ˈ  

Un esempio senza senso con un dittongo iniziale, un sacco di impilamento delle vocali e nessun marker di stress: eɪbaeioubaabaaadiventa

 u
 o
 i a
 eaa
ɪaaa
ebbb

Implementazione di riferimento

Il tuo programma dovrebbe produrre lo stesso output di questo script Python:

consonants = 'bdfhjklmnprstvwzðŋɡʃʒθ'
vowels = 'aeiouæɑɔəɛɜɪʊʌː'
stress_marks = 'ˈˌ'

def abugidafy(word):
    tiles = dict()
    x = y = 0

    is_first = True
    for c in word:
        if c in stress_marks:
            tiles[x + 1, 1] = c
        elif c in consonants or is_first:
            y = 0
            x += 1
            tiles[x, y] = c
            is_first = False
        elif c in vowels:
            y -= 1
            tiles[x, y] = c
            is_first = False
        else:
            raise ValueError('Not an IPA character: ' + c)

    xs = [x for (x, y) in tiles.keys()]
    ys = [y for (x, y) in tiles.keys()]
    xmin, xmax = min(xs), max(xs)
    ymin, ymax = min(ys), max(ys)

    lines = []
    for y in range(ymin, ymax + 1):
        line = [tiles.get((x, y), ' ') for x in range(xmin, xmax + 1)]
        lines.append(''.join(line))
    return '\n'.join(lines)

print(abugidafy(input()))

Provalo su Ideone.

Regole

  • È possibile scrivere una funzione o un programma completo.

  • Se il tuo programma ha un carattere Unicode / tipo stringa, puoi presumere che input e output li usino. Altrimenti, o leggi / scrivi da STDIN, usa la codifica UTF-8.

  • È possibile produrre una stringa contenente nuove righe o un elenco di stringhe che rappresentano righe o una matrice di caratteri Unicode.

  • Ogni riga di output può contenere qualsiasi quantità di spazi finali. Se produci una stringa, potrebbe avere una nuova riga finale.

  • Il tuo programma dovrebbe produrre l'output corretto per parole arbitrariamente lunghe con catene vocali arbitrariamente lunghe, ma può supporre che la parola di input sia sempre valida.

  • Se non ci sono marcatori di stress, l'output può facoltativamente includere un'ultima riga vuota (che non contiene nulla o spazi).

  • Vince la risposta più breve (in byte).


Povero ɜ, l'hai lasciato fuori :-) E gli inglesi si lamenteranno del loroɒ
Luis Mendo,

Oops, l'ho fatto! Ho aggiunto ɜ, quindi ora dovrebbe essere una vocale americana generale completa.
Lynn,

Sono occorrenze di uno di questi caratteri per contare solo come un byte in qualunque lingua venga usata indipendentemente dalla loro base di codice al fine di trovare un equilibrio tra lingue di golf concorrenti o fa parte della sfida, secondo te, per scoprire quale lingua può effettivamente eseguire in almeno byte, punto?
Jonathan Allan,

Esiste un numero massimo di vocali dopo una consonante che il nostro programma dovrebbe riconoscere? Altrimenti aggiungi un caso di test come biiiiiiiiiiiʒ(Come in "non le api")
DanTheMan,

1
@JonathanAllan Quest'ultimo; L'I / O Unicode fa parte della sfida. Aggiungerò una nota a riguardo.
Lynn,

Risposte:


2

APL NARS2000, 138 byte

⍉⌽⊃E,⍨¨↓∘' '¨∨/¨∊∘M¨E←(1+(W∊M←'ˌˈ')++\W∊'bdfhjklmnprstvwzðŋɡʃʒθ')⊂W←⍞

È possibile rimuovere l'iniziale ⍞←poiché l'output è implicito. Inoltre, il conteggio dei byte dovrebbe essere esattamente il doppio del conteggio dei caratteri, in questo modo . Quindi questo dovrebbe essere 138 byte.
Adám,

1

Python, 222 byte

(202 caratteri)

import re
def f(s):y=[w[0]in'ˈˌ'and w or' '+w for w in re.split('([ˈˌ]?[bdfhjklmnprstvwzðŋɡʃʒθ]?[aeiouæɑɔəɛɜɪʊʌː]*)',s)[1::2]];return[[x[i-1:i]or' 'for x in y]for i in range(max(len(w)for w in y),0,-1)]

Restituisce una matrice di caratteri unicode con una matrice per ogni riga (contenente spazi singoli per ogni spazio richiesto)

Non sono sicuro di dove sia possibile ottenere un output decente online (e non ho nemmeno gli strumenti per testarlo correttamente qui).
Ho caricato una versione di ideone che utilizza solo consonanti e vocali inglesi con ,e .come segni di stress, in cui ho confuso i casi di test per conformarmi.


1

JavaScript (ES6), 181 byte

f=
s=>(a=s.match(/[ˈˌ]?.[aeiouæɑɔəɛɜɪʊʌː]*/g).map(s=>/[ˈˌ]/.test(s)?s:` `+s)).map(s=>(l=s.length)>m&&(t=s,m=l),m=0)&&[...t].map(_=>a.map(s=>s[m]||` `,--m).join``).join`
`
;
<input oninput=o.textContent=f(this.value)><pre id=o>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.